わいえむねっと

Contents
Categories
Calendar
2007/08
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.018 sec
Chashed: -
2007/08/23 Thu
続・SO_EXCLUSIVEADDRUSE。
SO_REUSEADDRをSO_EXCLUSIVEADDRUSEにしてみたところhijackしてしまう問題は解消されたけど、今度はプロセスを再起動するとたまにbindに失敗するように。
どうも、クライアント側がcloseするより早く再起動がかかるとFIN_WAIT2のソケットが残っているので失敗する模様。

http://msdn2.micr​osoft.com/en-us/library/ms740618.a​spx
An 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
 
WindowsSO_REUSEADDR0000
SO_EXCLUSIVEADDRUSEWSAEADDRINUSEWSAEADDRINUSEWSAEADDRINUSE0
LinuxSO_REUSEADDREADDRINUSEEADDRINUSE00


IPHLPAPIでGetTcpTableしてhijackしないか確認した上でSO_REUSEADDR使うとかしないと駄目なのか。