重传所有TCP数据包Android Socket

时间:2015-01-15 10:31:53

标签: java android sockets networking tcp

我有两个使用套接字进行通信的android 4.03设备。应用程序工作正常,但有时客户端尝试连接(Socket.connect())到服务器,我得到我设置为2500毫秒的SocketTimeOutException。设备位于本地网络中,因此在正常情况下服务器会在几毫秒内响应。我检查了与WireShark的连接,我发现发送的唯一数据包是第一个SYN。之后什么都没有。 由于默认情况下在3秒后发送第二个SYN数据包(SYN的重新传输),我尝试将套接字超时提升到4秒(setSoTimeout(4000))并且应用程序始终有效! 为什么服务器套接字不回复第一个SYN?

在那之后,我试图嗅探正常的通信,看看通常会发生什么。通信中的每个数据包都被重传!我附上了wirehark捕获的截图。这是什么意思?

感谢您的帮助。

enter image description here

修改 路由器不转发数据包并丢弃它而没有任何回复。我尝试了以下有时不起作用的代码。

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表,因为它已正确插入路由器..

0 个答案:

没有答案