Я создаю приложение для Android (с использованием Unity и C #), которое должно подключаться через TCP к другому приложению, работающему на другом устройстве (с использованием классов .NET System.Net.Sockets.TcpClient
и TcpListener
).Это работает так, что приложение хоста передает пакет UDP, дающий информацию о своем локальном IP (192.168.xx) и своем прослушивающем порте 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