Невозможно получить доступ к TCP-серверу внутри универсального приложения Windows

У меня есть универсальное приложение Windows, которое должно действовать как TCP-сервер.

m_Listener = new StreamSocketListener();
m_Listener.ConnectionReceived += (s, e) => ProcessRequestAsync(e.Socket);
var bind = m_Listener.BindServiceNameAsync("8080").Wait();

Перед запуском приложения порт ни к чему не привязывается:

C:\Users\jsant>netstat -a | grep 8080
^C (Cancelled after some seconds because no reasults were found)

Затем, когда я запускаю приложение:

C:\Users\jsant>netstat -a | grep 8080
  TCP    0.0.0.0:8080           Laptop:0       LISTENING

Итак, сокет прослушивает мой компьютер! Попытка как-то получить к нему доступ приводит к ошибке

C:\Users\jsant>telnet 127.0.0.1 8080
Connecting To 127.0.0.1...Could not open connection to the host, on port 8080: Connect failed
C:\Users\jsant>telnet 192.168.1.167 8080
Connecting To 192.168.1.167...Could not open connection to the host, on port 8080: Connect failed    
C:\Users\jsant>telnet Laptop 8080
Connecting To Laptop...Could not open connection to the host, on port 8080: Connect failed    
C:\Users\jsant>telnet localhost 8080
Connecting To localhost...Could not open connection to the host, on port 8080: Connect failed

Я активировал все возможности, чтобы устранить это как возможную причину.

Тот же код, запущенный в консольном приложении, работает нормально.

Кроме того, запуск примера MS из https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/DatagramSocket дал тот же результат. Внутри приложения сокет был виден, снаружи нет!

Есть ли какие-либо ограничения на запуск сервера в универсальном приложении Windows или я что-то упустил?

Спасибо!

Жоао

Изменить Думаю, я недостаточно ясно выразился. Моя проблема связана с доступом к TCP-серверу из внешнего приложения. Приложение может быть telnet, веб-браузером и т. д. Сервер находится внутри универсального приложения Windows.

Изменить №2
Последний час я потратил на изменение этого примера: https://ms-iot.github.io/content/en-US/win10/samples/BlinkyWebServer.htm и запустить его на своем Raspberry Pi 2. в состоянии получить доступ к веб-серверу с моего компьютера. Запустив то же приложение на моем компьютере, я не смог подключиться. Это действительно странно!

Редактировать №3. Я изменил свое приложение, оставив только возможности Интернета (клиент и сервер) и никаких объявлений. Запуск в Raspberry Pi работает безупречно, на моем локальном компьютере все еще не повезло (локальный или удаленный). И да, брандмауэр отключен :). Судя по комментариям Джареда, в которых он подтверждает ту же проблему со своим компьютером, мне кажется, что это ошибка. Я продолжу расследование.

Изменить #4 после того, как я узнал о команде «CheckNetIsolation», добавление возможности «PrivateNetworkClientServer» позволило мне получить доступ с внешнего устройства. Тем не менее, невозможно получить к нему доступ с локального компьютера (даже с добавленным правилом LoopbackExempt)


person JoaoSantos    schedule 23.12.2015    source источник
comment
stackoverflow.com/ вопросы/17833232/   -  person Aron Hardy-Bardsley    schedule 03.04.2016


Ответы (4)


У меня такая же проблема. Эта статья дает хорошее описание поведение. В двух словах, когда ваше приложение UWP прослушивает TCP-сокет и вы пытаетесь подключиться из не UWP-приложения, вам нужно, чтобы CheckNetIsolation.exe работал непрерывно с параметром - такой флаг:

CheckNetIsolation.exe LoopbackExempt -is -n=b6823a8d-d94d-4de4-b7db-4e3567ca11c8_t0fze8msm45va
person Alon Catz    schedule 15.06.2020

Я не уверен, что telnet будет работать даже для подключения к StreamSocketListener. Я никогда этого не пробовал. Попробуйте использовать ниже и дайте мне знать, если это работает. Я немного изменил вызов для привязки слушателя, поскольку именно так он работает в моей настройке. Кроме того, имейте в виду, что петля в локальной сети, подобная этой, будет работать при отладке, но не будет работать для приложений, опубликованных в магазине.

Если это работает, вы должны получить диалоговое окно сообщения, показывающее, что событие ConnectionReceived запущено. :) Надеюсь, это поможет!

m_Listener = new StreamSocketListener();
m_Listener.ConnectionReceived += (s, e) => ProcessRequestAsync(e.Socket);
await m_Listener.BindServiceNameAsync("8080");

var ss = new StreamSocket();
await ss.ConnectAsync(new HostName("127.0.0.1"), 8080);

private async void ProcessRequestAsync(StreamSocket e)
{
    await new MessageDialog("Connection received!", "New Connection").ShowAsync();
    // The rest of your code goes here.
}
person Jared    schedule 23.12.2015
comment
Спасибо, Джаред, однако моя проблема не в том, чтобы подключиться к слушателю из того же приложения. Я знаю, что это работает без проблем. Проблема здесь заключается в подключении из другого приложения (клиент/сервер). - person JoaoSantos; 23.12.2015
comment
Что касается Telnet, я знаю, что он работает, потому что я протестировал точно такой же код из простого консольного приложения (не универсального для Windows). - person JoaoSantos; 23.12.2015
comment
Привет, Жоао. Я пробовал подключиться к UWP StreamSocketListener с помощью приложения WPF с помощью сокетов, и это не сработало. Однако тот же сервер принимает подключения с другого компьютера с помощью клиента UWP. Это наводит меня на мысль, что вы должны использовать API-интерфейсы сокетов UWP для подключения к серверу UWP. - person Jared; 24.12.2015
comment
Попробуйте подключиться к своему серверу с помощью клиента UWP StreamSocket и сообщите мне, работает ли он. У меня есть работающий сервер UWP, который я размещаю на виртуальной машине Azure, и я могу подключиться к нему с любого устройства Windows 10. Кроме того, не забудьте открыть порт в брандмауэре и настроить переадресацию портов, если он находится за другим маршрутизатором. :) - person Jared; 24.12.2015
comment
Итак, вы подтверждаете то, что я утверждаю. На том же компьютере (по крайней мере) нет возможности подключиться к серверу UWP с помощью приложения, отличного от UWP? - person JoaoSantos; 24.12.2015
comment
Извините, я не видел вашу правку до сих пор. Нет, я не думаю, что есть. Я тоже пытался и не смог найти способ. Я даже пытался ссылаться на API сокетов WinRT в настольном приложении WPF. Если вы что-то обнаружите, мне будет очень интересно об этом узнать! :) - person Jared; 24.12.2015
comment
Я потратил последний час на изменение этого примера: ms -iot.github.io/content/en-US/win10/samples/ и запустив его на своем Raspberry Pi 2, я смог получить доступ к веб-серверу со своего компьютера. Запустив то же приложение на моем компьютере, я не смог подключиться. Это действительно странно! - person JoaoSantos; 24.12.2015

Вы пытались включить возможность частной сети на своем UWP? Я использую его для аналогичного проекта.

Я думаю, что вам нужна эта возможность, если вы хотите управлять локальным сетевым подключением.

person ganchito55    schedule 24.12.2015
comment
Да, я уже сделал это (редактирование № 4). Я разрешил мне доступ к приложению с другого устройства в моей сети, но с локальным хостом все равно не повезло. Также попытался добавить LoopbackExempt для приложения, но с тем же результатом. - person JoaoSantos; 24.12.2015

Разрешить замыкание на себя в локальной сети в «Проект -> Свойства -> Отладка -> Разрешить замыкание на себя в локальной сети».

person user5784032    schedule 13.01.2016