TCPListener и StreamSocket - PullRequest
       14

TCPListener и StreamSocket

0 голосов
/ 26 апреля 2018

У меня странная проблема. Я пытаюсь получить TCP-соединение, идущее от моего локального ПК к удаленному гололинзу. На ПК я использую стандартные API C # (TCPClient, TCPListener), а на Hololens я вынужден использовать UWP (StreamSocket, StreamSocketListener).

Я протестировал следующие конфигурации:

StreamSocket (локальный ПК) <-> StreamSocketListener (Hololens): Работает

StreamSocketListener (локальный ПК) <-> StreamSocket (Hololens): Работает

TCPClient (локальный ПК) <-> StreamSocketListener (Hololens): Работает

TCPClient (локальный ПК) <-> TCPListener (также локальный клиент): Работает

Но!

TCPListener (локальный ПК) <-> StreamSocket (Hololens): не работает!

Еще более запутанно!

TCPListener (локальный ПК) <-> StreamSocket (как приложение UWP на локальном ПК): Работает! (Даже если localhost должен быть заблокирован UWP API по умолчанию)

Это как-то явно запрещено? И есть ли способ обойти это? Не уверен, стоит ли показывать код, он типичный, минимальный и скопированный из ссылок на документы.

Так что по какой-то причине мои Hololens не могут инициировать контакт с ПК, но работает наоборот (StreamSocketListener на Hololens, TCPClient на ПК).

Есть связанный вопрос на

Невозможно использовать StreamSocket для подключения к TcpListener

но я не тестирую локальный хост. Я тестирую между Гололенсом и ПК.

Вот как выглядит использование TCPListener:

var connectionListener = new TcpListener(localAddress, port);
connectionListener.Start();
connectionListener.BeginAcceptTcpClient(AcceptTCPClient, connectionListener);

//somewhere else
private void AcceptTCPClient(IAsyncResult result)
        {

            var client = connectionListener.EndAcceptTcpClient(result);

            OnConnectEvent(client); //custom callback, registered somewhere outside

            connectionListener.BeginAcceptTcpClient(AcceptTCPClient, connectionListener); //accept next client
        }

И, возможно, также актуально, использование StreamSocket:

//this all happens in a separate thread.
var networkSocket = new StreamSocket();

 while (!IsConnected)
            {
                try
                {
                    await networkSocket.ConnectAsync(new HostName("192.168.0.101"), "7777");
                    //do stuff with socket here
                }
                catch (Exception e)
                {
                    //errorhandling here
                }
            }

Я должен отметить, что у меня есть отдельные TCPListeners для каждого адреса локальной сети.

1 Ответ

0 голосов
/ 15 августа 2018

Та же проблема решена путем настройки TcpListener для прослушивания любого IP-адреса.

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, ConnectionPort);
networkListener = new TcpListener (ipEndPoint);
networkListener.Start (10);
...