我有两个使用套接字进行通信的android 4.03设备。应用程序工作正常,但有时客户端尝试连接(Socket.connect())到服务器,我得到我设置为2500毫秒的SocketTimeOutException。设备位于本地网络中,因此在正常情况下服务器会在几毫秒内响应。我检查了与WireShark的连接,我发现发送的唯一数据包是第一个SYN。之后什么都没有。 由于默认情况下在3秒后发送第二个SYN数据包(SYN的重新传输),我尝试将套接字超时提升到4秒(setSoTimeout(4000))并且应用程序始终有效! 为什么服务器套接字不回复第一个SYN?
在那之后,我试图嗅探正常的通信,看看通常会发生什么。通信中的每个数据包都被重传!我附上了wirehark捕获的截图。这是什么意思?
感谢您的帮助。
修改 路由器不转发数据包并丢弃它而没有任何回复。我尝试了以下有时不起作用的代码。
public static Socket connect2(InetSocketAddress sa, int SOTimeout)
throws SocketTimeoutException, IOException {
try {
Socket socket = new Socket();
// dummy packet to cause the ARP cache of the router to update
socket.connect(sa, 20);
Log.d("NICO", " CONNECTION GONE BY DUMMY PACKET!");
return socket;
} catch (SocketTimeoutException e) {
Log.d("NICO", "TCP Socket Dummy Packet gone");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new IOException();
}
int i = 0;
int t = 1000;
boolean finish = false;
while (!finish) {
Socket socket = new Socket();
try {
socket.connect(sa, t);
Log.d("NICO", " CONNECTION GONE!");
return socket;
} catch (SocketTimeoutException e) {
Log.d("NICO", " ANOTHER CONNECTION!");
if (finish)
throw new SocketTimeoutException();
i++;
if (i * t > SOTimeout) {
t = i * t - SOTimeout;
finish = true;
}
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
throw new SocketTimeoutException();
}
路由器也丢弃其他数据包.. 它不依赖于ARP表,因为它已正确插入路由器..