先生のご指摘通りでした。。。 プログラムにsleep(20)を入れながらどこでRSTパケットを出力しているか探しました。 2つの条件が重なった時に発生しました。条件は、最初のコネクションの通信が終わりPCから FINパケットを出力するした後、PCから次のコネクションが始まった状態の時にソケットをクローズするとRTSパケットがLinux組込機から出力されました。
PC Linux組込(port 9000) (port 1132)----- SYN ---> <-3ステートハンドシェーク -> <--- データ通信 ---> --- FIN/ACK ------> (port 1133)--- SYN --->(9000) <- 3ステートハンドシェーク -> <--- データ通信 ---> 通信途中に ひとつ前のパケットが交る (port 1132) < --- FIN ACK --- (9000) ---- ACK ---> ソケットクローズ port 1133 <--- RST・ACK --- <---+
現状の処理は以下の繰り返しでした。 socket()-->bind()-->Listen()-->accept()-->read()/send()-->close(accept)-->close(sokect) 組込機側の処理として syn--> read()-->send() -->Fin の時は問題はありませんでした。しかし、2つのコマンド(別のポート)がPCから連続して送られてくると最初のパケットの処理が終了する前にTCPソケットは2つ目のパケットの処理を初めていました。その状態でアプリケーションが最初のパケット通信のソケットをクローズするとTCPソケットがRSTパケットを送信していました。
以上 先生の的確なアドバイス大変助かりました。ありがとうございます。
今日も「基礎からわかるネットワーク入門」のFTPの仕組みに助けられました。
More information about text formats
RSTパケットが送信される件について報告致します。
先生のご指摘通りでした。。。
プログラムにsleep(20)を入れながらどこでRSTパケットを出力しているか探しました。
2つの条件が重なった時に発生しました。条件は、最初のコネクションの通信が終わりPCから FINパケットを出力するした後、PCから次のコネクションが始まった状態の時にソケットをクローズするとRTSパケットがLinux組込機から出力されました。
PC Linux組込(port 9000)
(port 1132)----- SYN --->
<-3ステートハンドシェーク ->
<--- データ通信 --->
--- FIN/ACK ------>
(port 1133)--- SYN --->(9000)
<- 3ステートハンドシェーク ->
<--- データ通信 --->
通信途中に ひとつ前のパケットが交る
(port 1132) < --- FIN ACK --- (9000)
---- ACK --->
ソケットクローズ
port 1133 <--- RST・ACK --- <---+
現状の処理は以下の繰り返しでした。
socket()-->bind()-->Listen()-->accept()-->read()/send()-->close(accept)-->close(sokect)
組込機側の処理として
syn--> read()-->send() -->Fin の時は問題はありませんでした。しかし、2つのコマンド(別のポート)がPCから連続して送られてくると最初のパケットの処理が終了する前にTCPソケットは2つ目のパケットの処理を初めていました。その状態でアプリケーションが最初のパケット通信のソケットをクローズするとTCPソケットがRSTパケットを送信していました。
以上 先生の的確なアドバイス大変助かりました。ありがとうございます。
今日も「基礎からわかるネットワーク入門」のFTPの仕組みに助けられました。