Как проверить (TCP) сокет, чтобы узнать, подключен ли он?
Я прочитал о свойстве Socket.Connected
в MSDN, но он говорит, что он показывает только состояние в соответствии с последним I/О. Это не полезно для меня, так как я хочу сделать это, прежде чем пытаться читать из сокета. В разделе замечаний также отмечается, что:
Если вам нужно определить текущий состояния соединения, неблокирующий, нулевой байтовый вызов. Если вызов возвращается успешно или выдает код ошибки WAEWOULDBLOCK (10035), то сокет все еще связанный; в противном случае сокет не будет более длинный.
Пример на той же странице показывает, как это сделать. (1) Но сообщение Яна Гриффитса говорит, что я должен читать из сокета, а не отправлять его.
Другое сообщение Пита Дунихо говорит:
... после того, как вы вызвали
Shutdown()
, вызовитеReceive()
, пока он не вернет0
(предполагая, что удаленная конечная точка не на самом деле собираюсь отправить вам что угодно, это произойдет, как только удаленный конечная точка получила все ваши данные). Если вы этого не сделаете, нет уверенности в том, что удаленная конечная точка фактически получил все данные вы отправили, даже используя затяжные сокет.
Я не очень понимаю его утверждение о вызове Receive()
, чтобы убедиться, что удаленная конечная точка фактически получила все отправленные мной данные. (Выполняет ли прием сокетов, пока буфер отправки не будет пустым?)
Меня путают различные предложенные методы. Не могли бы вы объяснить их?
(1) Интересно, почему пример для свойства Socket.Connected
выделяет 1-байтовый массив, хотя он вызывает Send
с длиной 0