返信

ご教授大変ありがとうございます。
ご質問させていただいた経緯は、6年くらい前に開発した組み込みシステムのカーネルを2.4→2.6へバージョンアップするためにディストリビューションを変更しました。
それに伴いご質問させていただいた問題が発生しました。
以下の2つの通信がほぼ同時に発生したとき
 
番号 IPアドレス  ポート番号   IPアドレス  ポート番号  送信データ
①   XXX      9000      YYY     1132     ABCDE
②   XXX      9000      YYY     1133     1234567890

上記の2つのコネクションがあったとき①と②は別々の通信と考えていいのですね
それぞれが 3ステートハンドシェークから始まって データ通信 そしてクローズが
別々に行われる。

  P C            組み込み
   <----①--------> SYN ・・[ABCDE]・・・ FIN
 
   <----②--------> SYN ・・[1234567890]・・・ FIN

質問させていただいた、コネクションが同時に発生したとき、TCP パケットを時系列に列にモニターすると①に②が割り込んでいるように見えるが、ソケットの処理としては別々に管理されているので問題はない。
listen() した後 accept()で取得したディスクリプタを使って①のデータを読み出し
 次のaccept()で取得したディスクリプタを使って②のデータを読み出す。これが先生が言われている2回accept()を実行しないとならないということですね。

RST パケットについてですが現在のプログラム構造が以下のようになっていました。
 sock=socket(...)
bind(sock ... )
listen(sock ...)

fd= accept( sock ... )
read(fd ...) [ABCDE] を読み出し
close(fd)
close(sock)

 sock=socket(...)
bind(sock ... )
listen(sock ...)

fd= accept( sock ... )
read(fd ...) [1234567890] を読み出し
close(fd)
close(sock)

この構造だと①のクローズ処理をしているとき、ソケットのクローズ処理中にソケット自体がなくなるのでこれを 以下のように変更したいと思っています。
ただ、この処理を切り出してlinuxパソコンで実行すると問題が発生しません。
(組み込み機のCPUは ARM9 linuxは timesysyを使っています)

 sock=socket(...)
bind(sock ... )
listen(sock ...)

fd= accept( sock ... )
read(fd ...) [ABCDE] を読み出し
close(fd)

fd= accept( sock ... )
read(fd ...) [1234567890] を読み出し
close(fd)

close(sock)

以上 長くありましたが大変わかりやすいご説明ありがとうございました。
上記の結果については 後日報告させていただきます。

<code>Only

  • 使用できるHTMLタグ: <code>
  • 文字で図を描く場合に<code>と</code>で囲んでください
画像認証
機械的なスパムメッセージ送信を防止するために画像認証を設けています。ご協力ください。
Image CAPTCHA
Enter the characters shown in the image.