Проверка подключения сокетов - PullRequest
1 голос
/ 19 января 2012

Попробовал несколько разных способов определения, отключен ли удаленный сокет.

В настоящее время я делаю это, чтобы проверить, подключен ли сокет.

public void CheckSocket()
{
    try
    {
        bool test1 = s.Poll(_MicrosecondFaultTolerance, SelectMode.SelectRead);
        bool test2 = (s.Available == 0);
        if (test1 && test2)
            _Active = false;
    }
    catch
    {
        _Active = false;
    }
}

По какой-то причине это прекрасно работает при первом отбрасывании каждый раз, когда не задается никаких вопросов, но после этого проверка не устанавливает для _Active значение false, и, следовательно, клиент никогда не считается «отключенным». Существуют ли другие способы проверить соединение или получить более надежный результат.

1 Ответ

2 голосов
/ 19 января 2012

Я не уверен, что вы подразумеваете под "первым сбросом", поскольку после разрыва соединения под сокетом сокет должен быть закрыт. Все зависит от того, что вы делаете вне функции CheckSocket(). Но при условии, что все это обрабатывается правильно, простой опрос сокета не будет работать надежно, если базовое соединение не используется.

Отключение может быть обнаружено только в том случае, если на базовом транспорте имеется некоторый трафик. Если соединение не используется (не закрыто) во время простоя, оно будет спокойно сидеть там вечно. Чтобы обнаружить потерянное соединение во время простоя, используйте setsockopt() с SO_KEEPALIVE. TCP будет периодически обмениваться фиктивным трафиком с другой стороной, чтобы проверить, является ли соединение все еще живым, и предотвратить тайм-аут любых NAT или других правил динамической маршрутизации. Обратите внимание, что для обнаружения сброса все еще может потребоваться 30 секунд или более, так как это время ожидания TCP по умолчанию.

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