java—重新传输所有tcp数据包

kzipqqlq  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(281)

我有两个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表,因为它正确地插入了路由器。。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题