[Armadillo:07397] Re: ソケット通信においてSO_REUSEADDRオプションが効かない
Sugitani Naoki
email@hidden
2011年 7月 13日 (水) 11:37:18 JST
To: 古賀 殿
From: 杉谷@ChAS
毎々お世話になっております。
ご教示ありがとうございました。
状況を理解致しました。
本件、システム側の制限とするように致します。
以上。
> サムシングプレシャスの古賀です。
>
> この件、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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
armadillo メーリングリストの案内