通过TCP连接到本地网络上的设备*有时*会失败,并显示“无路由到主机”套接字错误

时间:2019-05-29 12:13:55

标签: c# android sockets networking tcp

我正在制作一个Android应用程序(使用Unity和C#),该应用程序需要通过TCP连接到在另一台设备上运行的其他应用程序(使用.NET System.Net.Sockets.TcpClientTcpListener类)。这种工作方式是主机应用程序广播UDP数据包,以在其本地IP(192.168.x.x)和TCP侦听端口上提供信息。收到UDP数据包后,Android应用会尝试连接到给定的TCP端点。大多数情况下(〜80%),这可以正常工作,并且两个设备都建立有效的TCP连接。不过,有时候,Android应用会收到UDP数据包,尝试通过TCP进行连接,但会显示“ No Route To Host”套接字错误;甚至在收到下一个UDP数据包时再次尝试失败。

我怀疑这与路由器创建不同子网有关。我对网络代码不是很熟悉,所以我不确定如何将TCP请求转发到本地网络的另一个子网。奇怪的是,无论如何,总是会收到UDP数据包。而且在大多数情况下,TCP请求将连续10分钟失败,然后像什么都没有发生一样再次开始工作。

public async Task<bool> ConnectToHost(IPEndPoint endpoint) {
    try {
        TcpClient client = new TcpClient();
        client.NoDelay = true;
        IPAddress ipv4 = endpoint.Address;
        Debug.Log("IPv4: " + ipv4);
        await client.ConnectAsync(ipv4, endpoint.Port);   // <--- this call throws the SocketException
        Debug.Log("Connected.");

        // ...

        return true;
    }catch(SocketException se) {
        Debug.LogError("[TCPClient] Socket Exception (" + se.ErrorCode + "), cannot connect to host: " + se.ToString(), this);
    }catch(Exception e) {
        Debug.LogError("[TCPClient] Error, cannot connect to host: " + e.ToString(), this);
    }
    return false;//Could not connect
}

ConnectAsync()调用在客户端失败,给出以下SocketException(错误代码10065,WSAEHOSTUNREACH);在服务器端,看不到任何消息。

05-29 13:31:54.591: I/Unity(24587): IPv4: 192.168.1.21
05-29 13:31:54.591: I/Unity(24587):  
05-29 13:31:54.591: I/Unity(24587): (Filename: ./Runtime/Export/Debug/Debug.bindings.h Line: 48)
05-29 13:31:58.103: E/Unity(24587): [TCPClient] Socket Exception (10065), cannot connect to host: System.Net.Sockets.SocketException (0x80004005): No route to host
05-29 13:31:58.103: E/Unity(24587):   at System.Net.Sockets.SocketAsyncResult.CheckIfThrowDelayedException () [0x00014] in <9eab73f5583e4ab3921ff80e74ccdb29>:0 
05-29 13:31:58.103: E/Unity(24587):   at System.Net.Sockets.Socket.EndConnect (System.IAsyncResult asyncResult) [0x0002c] in <9eab73f5583e4ab3921ff80e74ccdb29>:0 
05-29 13:31:58.103: E/Unity(24587):   at System.Net.Sockets.TcpClient.EndConnect (System.IAsyncResult asyncResult) [0x0000c] in <9eab73f5583e4ab3921ff80e74ccdb29>:0 
05-29 13:31:58.103: E/Unity(24587):   at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func`2[T,TResult] endFunction, System.Action`1[T] endAction, System.Threading.Tasks.Task`1[TResult] promise, System.Boolean requiresSynchronization) [0x00019] in <a6266edc72ee4a578659208aefcdd5e1>:0

0 个答案:

没有答案