У меня странная проблема. Я пытаюсь получить 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 для каждого адреса локальной сети.