[Socket]server程式碰上TIME_WAIT的解法
參考:
http://stackoverflow.com/questions/587961/whats-the-difference-between-time-wait-assassination-and-so-reuseaddr
http://stackoverflow.com/questions/3229860/what-is-the-meaning-of-so-reuseaddr-setsockopt-option-linux
有時候server程式在需要重啟的時候,(像是重新讀設定檔)
會發現即使把程式結束,再開卻失敗的情況。
在這時候用netstat -al可以觀察到,server用的某些port正處於TIME_WAIT的情況,
並要持續一段時間才會自動消失(1~4分鐘都有可能)。
而在TIME_WAIT的這些port都是無法再利用,所以才會重啟失敗。
解決辦法就是在socket做bind之前,
做setsockopt的SO_REUSEADDR:
int i=1;
setsockopt(iSock,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
這樣的設定就是允許另一個socket bind在TIME_WAIT的port。
但是如果該port不是在TIME_WAIT而是其他使用中狀況,bind仍會失敗。
TIME_WAIT是TCP連線的正常狀態,
代表"可能還有未傳來的資料"。
0 個意見:
張貼留言
訂閱 張貼留言 [Atom]
<< 首頁