Мгновенно обнаружить отключение клиента от сокета сервера - PullRequest
67 голосов
/ 06 апреля 2009

Как я могу определить, что клиент отключился от моего сервера?

У меня есть следующий код в моем AcceptCallBack методе

static Socket handler = null;
public static void AcceptCallback(IAsyncResult ar)
{
  //Accept incoming connection
  Socket listener = (Socket)ar.AsyncState;
  handler = listener.EndAccept(ar);
}

Мне нужно найти способ как можно быстрее обнаружить, что клиент отключился от handler сокета.

Я пробовал:

  1. handler.Available;
  2. handler.Send(new byte[1], 0, SocketFlags.None);
  3. handler.Receive(new byte[1], 0, SocketFlags.None);

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

Любая помощь будет оценена.

Ответы [ 13 ]

0 голосов
/ 02 января 2011

Пример кода здесь http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.connected.aspx показывает, как определить, подключен ли Socket, не отправляя никаких данных.

Если вы вызвали Socket.BeginReceive () на серверной программе, а затем клиент "изящно" закрыл соединение, ваш обратный вызов будет вызван, а EndReceive () вернет 0 байт. Эти 0 байтов означают, что клиент "мог" отключиться. Затем можно использовать метод, показанный в примере кода MSDN, чтобы точно определить, было ли соединение закрыто.

0 голосов
/ 30 июня 2009

Разве вы не можете просто использовать Select?

Используйте select на подключенной розетке. Если выбор возвращается с вашим сокетом как Ready, но последующее получение возвращает 0 байтов, это означает, что клиент отключил соединение. AFAIK, это самый быстрый способ определить, отключился ли клиент.

Я не знаю C #, поэтому просто игнорируйте, если мое решение не подходит для C # (хотя C # предоставляет select ) или если я неправильно понял контекст.

0 голосов
/ 06 апреля 2009

Вы также можете проверить свойство .IsConnected сокета, если хотите опросить.

...