我有两个android 4.03设备,它们使用套接字进行通信。应用程序工作正常,但有时客户端尝试连接(socket.connect())到服务器,而我得到的sockettimeoutexception设置为2500ms。这些设备位于本地网络中,因此在正常情况下,服务器会在几毫秒内响应。我检查了与wireshark的连接,发现唯一发送的数据包是第一个syn。在那之后什么都没有。由于第二个syn数据包(syn的重传)在默认情况下是在3秒之后发送的,因此我尝试将套接字超时提高到4秒(setsotimeout(4000)),并且应用程序始终正常工作!为什么服务器套接字不回复第一个syn?
之后,我试着嗅一嗅正常的通讯,看看正常情况下会发生什么。通信中的每一个数据包都被重新传输!我附上了一个截图我的线鲨捕获。这是什么意思?
谢谢你的帮助。
编辑:路由器不会转发数据包并在没有任何回复的情况下丢弃它。我尝试了下面的代码,但有时不起作用。
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表,因为它正确地插入了路由器。。
暂无答案!
目前还没有任何答案,快来回答吧!