(toppers-users 4350) tcp_rcv_dat() で受信待ち中に FIN を受信してもリターンしない
Shigenori Kimura
skimura @ mvd.biglobe.ne.jp
2015年 3月 11日 (水) 19:37:18 JST
ASP用 TINET 1.5.2 (2011-05-11) を、Renesas の RX62N (Little
Endian, IPV4, ethernet) に移植しています。
現在のところ、DHCP、DNS、HTTP の各クライアントと、TELNET、FTP
のサーバなどが動作しています。
最近気付いたのですが、ブロッキング・モードで tcp_rcv_dat() に
よる受信待ち中に FIN を受信しても呼び出し元にリターンしないよう
です。
ITRON TCP/IP API 仕様 Ver. 1.00.01 の tcp_rcv_dat() の記述に
よれば、「相手側から接続が正常切断され、受信バッファにデータが
なくなると、API から 0 が返る。」とあるので、FIN を受信するとリ
ターンものと理解していました。
但し、tcp_rcv_dat() を呼び出した時点で既にFIN を受信していた
場合には、待たされることなくリターンしてきて、0 を返しています。
私なりに原因を探ったところ、netinet/tcp_input.c 内の関数
close_connection () 内の処理にて、
switch (cep->fsm_state) {
case TCP_FSM_SYN_RECVD: /* SYN を受信し、SYN 送信済み */
case TCP_FSM_ESTABLISHED: /* コネクション開設完了 */
cep->fsm_state = TCP_FSM_CLOSE_WAIT;
追記=> syscall(set_flg(cep->rcv_flgid, TCP_CEP_EVT_RWBUF_READY));
break;
のように、「追記=>」とあるコードを追加したところ、期待通りに動
作するようになりました。
しかし、全ての状況を考慮したものではないため、自信がまったく
ありません。
アドバイスを頂ければ幸いです。
よろしくお願い申し上げます。