Texas Instruments のブースター パック cc3000 を使用してデータを送信しようとしています。したがって、ボードに TCP サーバーソケットを実装しました。保留中の接続を正常に受け入れ、指定されたソケットでデータを送受信できます。私のプロトコルでは、クライアントは応答を読み取った後に接続を閉じる責任があります。しかし、いくつかの送信の後、送信が遅くなります。Wireshark を使用して WLAN トラフィックを検査すると、ソケット クローズ手順に問題があることがわかります。私のクライアントは Java ベースのプログラムです。ボードはアドレス 100 を使用し、コンピューターは 102 で実行されます。
TCP ストリームは次のようになります。
31 4.696711000 192.168.2.102 192.168.2.100 TCP 66 50721 > http-alt [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=4 SACK_PERM=1
32 4.700359000 192.168.2.100 192.168.2.102 TCP 58 http-alt > 50721 [SYN, ACK] Seq=0 Ack=1 Win=1460 Len=0 MSS=1460
33 4.700394000 192.168.2.102 192.168.2.100 TCP 54 50721 > http-alt [ACK] Seq=1 Ack=1 Win=17520 Len=0
34 4.700461000 192.168.2.102 192.168.2.100 HTTP 55 Continuation or non-HTTP traffic
35 4.705454000 192.168.2.100 192.168.2.102 TCP 54 http-alt > 50721 [ACK] Seq=1 Ack=2 Win=1460 Len=0
36 4.705476000 192.168.2.102 192.168.2.100 TCP 57 [TCP segment of a reassembled PDU]
37 4.709035000 192.168.2.100 192.168.2.102 TCP 54 http-alt > 50721 [ACK] Seq=1 Ack=5 Win=1460 Len=0
38 5.194961000 192.168.2.100 192.168.2.102 TCP 58 [TCP segment of a reassembled PDU]
39 5.196220000 192.168.2.100 192.168.2.102 HTTP 154 Continuation or non-HTTP traffic
40 5.196244000 192.168.2.102 192.168.2.100 TCP 54 50721 > http-alt [ACK] Seq=5 Ack=105 Win=17416 Len=0
41 5.196286000 192.168.2.102 192.168.2.100 TCP 54 50721 > http-alt [FIN, ACK] Seq=5 Ack=105 Win=17416 Len=0
42 5.202194000 192.168.2.100 192.168.2.102 TCP 54 http-alt > 50721 [ACK] Seq=105 Ack=6 Win=1460 Len=0
138 24.245036000 192.168.2.100 192.168.2.102 TCP 54 http-alt > 50721 [FIN, ACK] Seq=105 Ack=6 Win=1460 Len=0
139 24.245060000 192.168.2.102 192.168.2.100 TCP 54 50721 > http-alt [ACK] Seq=6 Ack=106 Win=17416 Len=0
約 10 回の送信の後、FIN/ACK カスケードを取得します。上記の最後の FIN/ACK は、このカスケードの一部です。ソケットが完全に閉じられておらず、HW モジュールが開始され、すべてのソケットが連続して閉じられているように見えます。
My Java - client does the following
Socket b = new Socket("192.168.2.100",8080);
OutputStream o = b.getOutputStream();
o.write(10);
o.write(0);
o.write(0);
o.write(0);
o.flush();
InputStream i = b.getInputStream();
int id = i.read();
int gId = i.read();
int lengthA = i.read();
int lengthB = i.read();
int length = (lengthB<<8)|lengthA;
if(length < 0|| length > 1000)
{
b.close();
return;
}
System.out.println(new Date()+" GantryID: "+gId+" Package with id: "+id+" has length: "+length+" payload: ");
DataInputStream ds = new DataInputStream(i);
byte[] buffer = new byte[length];
ds.readFully(buffer);
b.close();
System.out.println(new String(buffer));
サーバーはもう少し複雑ですが、重要なコマンドは次のとおりです。
return recv(handle, data, size, 0); //Read request header
return recv(handle, data, size, 0); //Read request payload
send(handle, data, size, 0); //Write response header
send(handle, data, size, 0); //Write response payload
//No Close only set socket handle to -1
誰が何が起こっているのか考えていますか。助けやアイデアをいただければ幸いです。