UWP - ошибка соединения StreamSocket для некоторых соединений - PullRequest
0 голосов
/ 25 января 2020

У нас есть 2 приложения UWP. Одно приложение обменивается данными с другим приложением через StreamSocket. Серверное приложение отправит данные клиентскому приложению. Будет 30-40 или более устройств, работающих с клиентским приложением и подключающихся к сокету сервера для получения данных.

При тестировании с одним клиентским приложением весь обмен данными происходит без каких-либо проблем. Но когда мы начали тестирование примерно с 10 устройствами с использованием клиентского приложения, иногда некоторые приложения не получают данные. И, похоже, произошла ошибка: Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, потому что подключенный хост не смог ответить

В В общем, оно доступно большинству устройств, но иногда происходит сбой, но случайным образом. Что может быть причиной этого? Есть ли предел соединения для подключения к сокету с данным IP и портом с использованием Stream Socket?

Вот некоторые части нашего кода. Пожалуйста, дайте мне знать, что мы должны исправить здесь, чтобы избежать этой ошибки.

На стороне сервера

        public async Task StartServer(string serverIp, string serverPort)
        {
            try
            {

                HostName serverAddress = new HostName(serverIp);
                //Create a StreamSocketListener to start listening for TCP connections.
                StreamSocketListener socketListener = new StreamSocketListener();

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

                //Start listening for incoming TCP connections on the specified port.
                await socketListener.BindEndpointAsync(serverAddress, serverPort);                                              
            }              
            catch (Exception e)
            {

            }
        }

        private async void SocketListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
        {
            try
            {
                await Task.Run(() => ShareFile(args.Socket));
            }
            catch (Exception e)
            {

            }
        }

На стороне клиента

        public async Task ServerConnect(string serverIP, string serverPort)
        {
            try
            {
                HostName serverAddress = new HostName(serverIP);
                StreamSocket socket = new StreamSocket();

                socket.Control.KeepAlive = false;            

                // Connect to the server.
                await socket.ConnectAsync(serverAddress, serverPort, SocketProtectionLevel.PlainSocket);            
            }
            catch (Exception e)
            {

            }
        }

Также хотелось бы уточнить это

- В чем разница между BindServiceNameAsyn c и BindEndpointAsyn c? Большинство примеров, кажется, используют первый. Когда мы должны использовать второй?

- Если мы вызываем sender.Dispose (); в SocketListener_ConnectionReceived повлияет ли это на других клиентов, пытающихся присоединиться к одному и тому же сокету?

-В функции ShareFile (), если мы закрываем args.Socket () после отправки данных, может ли он закрыть сокет перед клиентом на самом деле читать данные с этой стороны?

...