Как подключиться к StreamSocket универсального приложения Windows из консольного приложения?

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

{"A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 192.168.0.5:1771"}

Универсальное приложение Windows даже не переходит в функцию получения соединения.

Сервер (UWP):

    public async void SetupServer()
    {
        try
        {
            //Create a StreamSocketListener to start listening for TCP connections.
            Windows.Networking.Sockets.StreamSocketListener socketListener = new Windows.Networking.Sockets.StreamSocketListener();

            //Hook up an event handler to call when connections are received.
            socketListener.ConnectionReceived += SocketListener_ConnectionReceived;

            //Get Our IP Address that we will host on.
            IReadOnlyList<HostName> hosts = NetworkInformation.GetHostNames();
            HostName myName = hosts[3];

            //Assign our IP Address
            ipTextBlock.Text = myName.DisplayName+":1771";
            ipTextBlock.Foreground = new SolidColorBrush(Windows.UI.Color.FromArgb(255,0,255,0));

            //Start listening for incoming TCP connections on the specified port. You can specify any port that' s not currently in use.
            await socketListener.BindEndpointAsync(myName, "1771");
        }
        catch (Exception e)
        {
            //Handle exception.
        }
    }

Клиент (консольное приложение):

static void Main(string[] args)
    {
        try
        {
            byte[] data = new byte[1024];
            int sent;
            string ip = "192.168.0.5";
            int port = 1771;
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ip), port);
            TcpClient client = new TcpClient();
            client.Connect(ipep); //**************Stalls HERE************
            using (NetworkStream ns = client.GetStream())
            {
                using (StreamReader sr = new StreamReader(ns))
                {
                    using (StreamWriter sw = new StreamWriter(ns))
                    {
                        sw.WriteLine("Hello!");
                        sw.Flush();
                        System.Threading.Thread.Sleep(1000);
                        Console.WriteLine("Response: " + sr.ReadLine());
                    }
                }
            }
        }
        catch (Exception e)
        {

        }
    }

person Seth Kitchen    schedule 07.11.2016    source источник


Ответы (1)


Я проверил ваш код на своей стороне, и он может работать хорошо. Так что в вашем коде нет ничего плохого. Но я могу воспроизвести вашу проблему, запустив сервер и клиент на одном устройстве, клиент выдаст такое же исключение, как вы показали выше. Поэтому, пожалуйста, убедитесь, что вы подключаетесь с другого компьютера. Мы не можем подключиться к приложению uwp StreamSocketListener из другого приложения или процесса, работающего на том же компьютере, это запрещено. Даже с исключением loopback.

Также убедитесь, что включена Internet(Client&Server) возможность. . А на клиенте можно пинговать сервер 192.168.0.5 успешно.

person Sunteen Wu    schedule 08.11.2016
comment
Спасибо, я не знал, что не могу запустить их на одной машине. Это почему? Будет ли это исправлено? - person Seth Kitchen; 08.11.2016
comment
@SethKitchen, это не ошибка, это так задумано. Это ограничено сетевой изоляцией. Может из соображений безопасности. - person Sunteen Wu; 09.11.2016
comment
Я читал это Примечание. В рамках сетевой изоляции система запрещает устанавливать соединения сокетов (Sockets или WinSock) между двумя приложениями UWP, работающими на одном компьютере, либо через локальный адрес обратной связи (127.0.0.0), либо явно указывая локальный IP-адрес в docs.microsoft.com/en-us/windows/uwp/networking/sockets — но почему я не могу подключиться из приложения, отличного от UWP, например из локального браузера? Не понимаю, в чем на самом деле проблема безопасности, особенно когда они не позволяют использовать IP-адрес и открывать хотя бы какой-то порт брандмауэра. - person George Birbilis; 24.08.2017