[Armadillo:07396] Re: ソケット通信においてSO_REUSEADDRオプションが効かない
Shin-ya Koga
email@hidden
2011年 7月 13日 (水) 11:24:16 JST
サムシングプレシャスの古賀です。
この件、Armadillo Linux というよりは、Linux の TCP/IP スタッ
ク一般の話になると思いますが・・・
杉谷さん([Armadillo:07395]):
>追加の情報です。
>
>iTronとwindowsでTCPヘッダのオプションに相違がありました。
>iTronでは、TCPヘッダのオプションを使用せずに通信を行っております。
>windowsでは、TCPヘッダオプションにTime Stampを設定して通信しております。
>TCPヘッダオプションのTime Stamp有無によってarmadillo linuxの挙動が
>変化することは考えられないでしょうか。
カーネルのソースツリーを眺めてみたところ、Time Stamp の有無で
挙動が変わるようですね。ご指摘の通り、SO_REUSEADDR が指定された
際に、Time Stamp を受け取れていないソケットに対しては、
TIME_WAIT 状態での再利用が行われない実装になっているようです。
以下のソースが、関連個所だと思います:
・/net/ipv4/tcp_ipv4.c
tcp_twsk_unique()
tcp_v4_connect()
・/net/ipv4/inet_hashtables.c
__inet_hash_connect()
__inet_check_established()
・/include/net/timewait_sock.h
twsk_unique()
tcp_twsk_unique() では、当該ソケットの直近の Time Stamp が記録
されていない場合は、0 を返すようですが、その結果、
__inet_check_established() 内の not_unique: ラベル部が実行されて
-EADDRNOTAVAIL が戻り値として返され、tcp_v4_connect() における
inet_hash_connect() の呼び出しがエラーとなって失敗する、という
状況ではないかと思います。
--
古賀信哉 (株)サムシングプレシャス
armadillo メーリングリストの案内