Невозможно заставить Socket.Poll и Socket.Connected работать так, как нужно - PullRequest
2 голосов
/ 10 марта 2012

Хорошо, я знаю, что есть много информации об этом, и я обещаю вам, что я прочитал все это и попробовал множество различных методов, чтобы заставить это работать !!

У меня есть программа сервера сокетов, которая работает на ноутбуке. Затем у меня есть до 50 ноутбуков, подключенных по беспроводной сети через одну и ту же локальную сеть к серверу. Все клиентские ноутбуки подключаются к серверу (используя Socket.ConnectAsync), а сервер также использует асинхронные методы для отправки и получения данных. Сервер показывает пользователю список подключенных клиентских ноутбуков, и этот список кажется точным и подбирается всякий раз, когда клиент отключается и подключается. Однако клиентские ноутбуки, кажется, никогда не обнаруживают, когда соединение с сервером было потеряно при определенных обстоятельствах (то есть, если происходит сбой программы сервера, если серверный ноутбук переходит в режим ожидания и т. Д.) У меня на клиентских ноутбуках есть таймер, который опрашивает подключение каждые 5 секунд следующим образом:

     bool SocketConnected(Socket s)
    {             
        bool part1 = s.Poll(0, SelectMode.SelectWrite);

        bool part2 = (s.Available == 0);
        if (!part1 && part2)
        {

            return false;
        }
        else
        {
            return true;
        }
    }

Я пытался использовать все режимы выбора (SelectWrite, SelectRead, SelectError) и пытался использовать разные значения времени ожидания. Я попытался проверить значение s.Connected после этих операций и перепробовал все способы других методов, чтобы определить состояние подключения, и ничто не дает надежных результатов !! Я думаю, что могу достичь желаемого результата, отправляя фиктивную информацию каждые 5 секунд и проверяя s.Connected после этого, однако я не очень хочу этого делать, так как каждый ноутбук уже отправляет большое количество данных на сервер как есть. , Любая помощь очень ценится! Спасибо

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Единственный надежный способ проверить, является ли соединение живым, - это отправить что-то на другой конец и посмотреть, получится ли оно. Это можно сделать либо вручную, периодически отправляя и получая значение ping, либо автоматически, включив параметр сокета KeepAlive .

.
1 голос
/ 13 декабря 2012

В документации MSDN для Socket.Poll очень подробно описаны конкретные ситуации (сбои сервера, режим ожидания), о которых вы упомянули:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...