При подключении к устройству в локальной сети через TCP * иногда * происходит сбой с ошибкой сокета «No Route To Host» - PullRequest
1 голос
/ 29 мая 2019

Я создаю приложение для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...