(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