SteamSocket TCP для проверки подключения устройства - PullRequest
0 голосов
/ 17 октября 2018

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

1 Ответ

0 голосов
/ 17 октября 2018

Как я знаю, лучшего способа сделать это не существует.Существует два способа обнаружения отключения StreamSocket:

  • отправлять сообщение пульса для мониторинга, если другая сторона (сервер) закрыта.
  • read 0-length означает конец потока.

Кроме того, вы можете обнаружить сетевое соединение с помощью NetworkInformation.NetworkStatusChanged . Благодаря этому приложение может узнать, является ли сеть недействительной, поскольку основная причина вызывает StreamSocket.отсоединен.Подробнее см. Реакция на изменения состояния сети .

Если вы измените хост как сервер, все ваше устройство как клиент, подключенный к вашему хосту, вы можете начать прослушивать порт tcpчерез StreamSocketListener .Событие ConnectionReceived может обнаружить входящее соединение и изменение статуса.

        StreamSocketListener listener = new StreamSocketListener();
        listener.ConnectionReceived += OnConnection;


    private async void OnConnection(
        StreamSocketListener sender, 
        StreamSocketListenerConnectionReceivedEventArgs args)
    {
        DataReader reader = new DataReader(args.Socket.InputStream);
        try
        {
            while (true)
            {
                // Read first 4 bytes (length of the subsequent string).
                uint sizeFieldCount = await reader.LoadAsync(sizeof(uint));
                if (sizeFieldCount != sizeof(uint))
                {
                    // The underlying socket was closed before we were able to read the whole data.
                    //Detect disconnection
                    return;
                }

                // Read the string.
                uint stringLength = reader.ReadUInt32();
                uint actualStringLength = await reader.LoadAsync(stringLength);
                if (stringLength != actualStringLength)
                {
                    // The underlying socket was closed before we were able to read the whole data. 
                    //Detect disconnection
                    return;
                }

                //TO DO SOMETHING
            }
        }
        catch (Exception exception)
        {
             //TO DO SOMETHING
        }
    }
...