ご教授大変ありがとうございます。 ご質問させていただいた経緯は、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を使っています)
fd= accept( sock ... ) read(fd ...) [ABCDE] を読み出し close(fd)
fd= accept( sock ... ) read(fd ...) [1234567890] を読み出し close(fd)
close(sock)
以上 長くありましたが大変わかりやすいご説明ありがとうございました。 上記の結果については 後日報告させていただきます。
More information about text formats
ご教授大変ありがとうございます。 ご質問させていただいた経
ご教授大変ありがとうございます。
ご質問させていただいた経緯は、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)
以上 長くありましたが大変わかりやすいご説明ありがとうございました。
上記の結果については 後日報告させていただきます。