網(wǎng)絡(luò)編程 心得1
以前項目里發(fā)現(xiàn)一個這樣的問題,當(dāng)網(wǎng)絡(luò)服務(wù)進程關(guān)掉的時候,在立即啟動該服務(wù),會有錯誤提示說port被占用了,監(jiān)聽失敗。
最近在看《unix 網(wǎng)絡(luò)編程》,在里面了解到了 鏈接時的三次握手 和 關(guān)閉時的四次握手,
在關(guān)閉時最后會有一個TIME_WAIT狀態(tài),這個狀態(tài)時間是TCP里最長的,是二倍MSL時間,大約在1-4分鐘。
至于為什么要保留這個狀態(tài)和這么長的時間,請參考《unix 網(wǎng)絡(luò)編程》第二章 2.7.
但這樣的問題是可以解決的,使用SO_REUSEADDR enables local address reuse,可以在TIME_WAIT狀態(tài)下使用相同的PORT。
int reuser_addr = 1;
::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const void*)&reuse_addr, sizeof(reuse_addr));
SO_REUSEADDR 的用途除了上面這種情況,還有三種分別是:
*)在多網(wǎng)卡的時候,多進程可以使用不同IP,相同PORT。
*)與上條差不多,在單進程使用使用不同IP,相同PORT。
*)在UDP廣播的時候,可以在相同IP和PORT下使用,TCP則不行。