我正在制作一个Android应用程序(使用Unity和C#),该应用程序需要通过TCP连接到在另一台设备上运行的其他应用程序(使用.NET System.Net.Sockets.TcpClient
和TcpListener
类)。这种工作方式是主机应用程序广播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