Программирование сокета TCP C # - определение, было ли разорвано соединение - PullRequest
1 голос
/ 14 октября 2010

Я пытаюсь выяснить, прерывается ли TCP-соединение на сервере через заданный интервал, и написал следующий код;

 var tcpClient = new TcpClient();

 tcpClient.Client.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.KeepAlive, true);

 tcpClient.Connect(Ip, Port);
 var status = tcpClient.Connected ? "Connected" : "Failed to Connect";

 if (connected)
 {
    Console.WriteLn(string.Format("Connected - Waiting for '{0}' to see if the connection is dropped", ConnectionDuration));
    Thread.Sleep(ConnectionDuration);
    status = tcpClient.Connected ? "Stayed Connected" : "Connection Dropped";
 }

 Console.WriteLn(string.Format("Connection Status: '{0}'", status);

С этим кодом, если соединение установлено изначально, я всегда получу сообщение о статусе «Не отключен».

Поскольку сервер находится за пределами нашей компании, нежелательно записывать данныек сокету, есть ли другой способ определить, было ли разорвано соединение?

Спасибо

Ответы [ 2 ]

1 голос
/ 14 октября 2010

Сделайте неблокирующим нулевой байт Отправить вызов, если вы получили код ошибки WOULDBLOCK или успешно, вы все еще подключены.

0 голосов
/ 14 октября 2010

Я не думаю, что это делает то, что вы хотите:

true, если сокет клиента был подключен к удаленному ресурсу на момент последней операции;в противном случае - false.

Говорит MSDN

Кроме того, установка параметра keepalive будет отправлять данные на уровне tcp, просто вы отправляете не данные, а ОС.1009 *

Я думаю, вам придется что-то построить вокруг выберите

hth

Марио

...