Как сделать неблокирующий вызов сокета в C #, чтобы определить состояние соединения? - PullRequest
6 голосов
/ 01 сентября 2009

документы MSDN для свойства Connected в Socket говорят следующее:

Значение свойства Connected отражает состояние соединения по состоянию на самую последнюю операцию. Если вам нужно определить текущий состояние соединения, сделать Неблокируемый, нулевой байт Отправить звонок. Если звонок успешно завершен или выдает код ошибки WAEWOULDBLOCK (10035), то розетка еще связано; в противном случае сокета нет больше подключен.

Мне нужно определить текущее состояние соединения - как сделать неблокирующий нулевой байт для отправки?

Ответы [ 3 ]

7 голосов
/ 01 сентября 2009

Пример внизу документации MSDN для свойства Socket.Connected (по крайней мере, версии .NET 3.5) показывает, как это сделать:

// .Connect throws an exception if unsuccessful
client.Connect(anEndPoint);

// This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking;
try
{
    byte [] tmp = new byte[1];

    client.Blocking = false;
    client.Send(tmp, 0, 0);
    Console.WriteLine("Connected!");
}
catch (SocketException e) 
{
    // 10035 == WSAEWOULDBLOCK
    if (e.NativeErrorCode.Equals(10035))
        Console.WriteLine("Still Connected, but the Send would block");
    else
    {
        Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
    }
}
finally
{
    client.Blocking = blockingState;
}

 Console.WriteLine("Connected: {0}", client.Connected);
3 голосов
/ 01 сентября 2009
0 голосов
/ 18 февраля 2013

Просто предоставление дополнительной информации на основе опыта: комментарии внизу версий 3.5 и 4 этой страницы документации для Socket.Connect описывают мой опыт - пример просто не сработал Очень жаль, что я не знаю, почему это работает для некоторых, а не для других.

В качестве обходного пути, несмотря на то, что говорится в документации, я изменил пример, чтобы фактически отправить 1 байт без флагов. Это успешно обновило состояние свойства Connected и эквивалентно отправке пакета keep-alive с интервалом.

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