(toppers-users 4351) Re: tcp_rcv_dat() で受信待ち中に FIN を受信してもリターンしない

阿部 司 abe @ jo.tomakomai-ct.ac.jp
2015年 3月 12日 (木) 08:22:19 JST


Kimura様、皆様

苫小牧高専の阿部です。

>  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;
>
> のように、「追記=>」とあるコードを追加したところ、期待通りに動
> 作するようになりました。
>
>  しかし、全ての状況を考慮したものではないため、自信がまったく
> ありません。
>
>  アドバイスを頂ければ幸いです。
>
>  よろしくお願い申し上げます。
>

情報ありがとうございました。
こちらでも調べで見ます。少々時間をいただけると幸いです。

よろしくお願いします。

-- 
.\" 苫小牧工業高等専門学校 情報工学科 教授 阿部 司
.\" 〒059-1275 北海道苫小牧市字錦岡443番地
.\" E-mail: abe @ jo.tomakomai-ct.ac.jp  TEL/FAX: 0144-67-8937