Как проверить, соединен ли сокет/разъединен в C#?

Как можно проверить если сетевой сокет (Система. Сеть. Сокеты. Сокет), все еще соединен, если другой хост не отправляет Вам пакет, когда он разъединяется (например, потому что он разъединился неизящно)?

59
задан lesderid 12 February 2013 в 18:16
поделиться

4 ответа

Как Пол Тернер ответил, Socket.Connected не может использоваться в этой ситуации. Вам нужно каждый раз опрашивать соединение, чтобы видеть, активно ли оно. Это код, который я использовал:

bool SocketConnected(Socket s)
{
    bool part1 = s.Poll(1000, SelectMode.SelectRead);
    bool part2 = (s.Available == 0);
    if (part1 && part2)
        return false;
    else
        return true;
}

Он работает следующим образом:

  • s.Poll возвращает истину, если
    • соединение закрыто, сброшено, прервано или ожидает (то есть нет активного соединения)
    • соединение активно и есть данные для чтения
  • s.Available возвращает количество байтов, доступных для чтения
  • , если оба значения истинны: {{1} }
    • нет данных для чтения, поэтому соединение неактивно
91
ответ дан 24 November 2019 в 18:15
поделиться

Свойство Socket.Connected сообщит вам, считает ли сокет , что он подключен . Фактически он отражает состояние последней операции отправки / получения, выполненной в сокете.

Если сокет был закрыт вашими собственными действиями (удаление сокета, вызов методов для отключения), Socket.Connected вернет false . Если сокет был отключен другим способом, свойство вернет true до следующей попытки отправить или получить информацию, после чего либо SocketException , либо ObjectDisposedException ] будет брошен.

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

15
ответ дан 24 November 2019 в 18:15
поделиться

Использовать свойство Socket.Connected .

-12
ответ дан 24 November 2019 в 18:15
поделиться

Лучше всего, чтобы ваш клиент отправлял PING каждые X секунд, а сервер предположим, что он отключен после того, как какое-то время не получал его.

Я столкнулся с той же проблемой, что и вы, при использовании сокетов, и это был единственный способ сделать это. Свойство socket.connected никогда не было правильным.

В конце концов, я переключился на использование WCF, потому что он был намного надежнее сокетов.

1
ответ дан 24 November 2019 в 18:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: