- 2007/08/23 Thu
-
続・SO_EXCLUSIVEADDRUSE。
SO_REUSEADDRをSO_EXCLUSIVEADDRUSEにしてみたところhijackしてしまう問題は解消されたけど、今度はプロセスを再起動するとたまにbindに失敗するように。
どうも、クライアント側がcloseするより早く再起動がかかるとFIN_WAIT2のソケットが残っているので失敗する模様。http://msdn2.microsoft.com/en-us/library/ms740618.aspxAn important caveat to using the SO_EXCLUSIVEADDRUSE option exists: If one or more connections originating from (or accepted on) a port bound with SO_EXCLUSIVEADDRUSE is active, all bind attempts to that port will fail.An active port for TCP is defined as being in the ESTABLISHED, FIN_WAIT, FIN_WAIT_2, or LAST_ACK states.
あー。
だから、それじゃLinuxと挙動が合わねぇんだって!LISTEN
LISTEN
ESTABLISHED
ESTABLISHED
FIN_WAIT_2
CLOSE_WAIT
TIME_WAIT
Windows SO_REUSEADDR 0 0 0 0 SO_EXCLUSIVEADDRUSE WSAEADDRINUSE WSAEADDRINUSE WSAEADDRINUSE 0 Linux SO_REUSEADDR EADDRINUSE EADDRINUSE 0 0
IPHLPAPIでGetTcpTableしてhijackしないか確認した上でSO_REUSEADDR使うとかしないと駄目なのか。