Проверить если TCP соединение живое.

jenya7

Я открываю TCP сервер. Как мне проверить что сокет клиента живой, что соединение с клиентом присутствует?
13 ответов

jenya7

jenya7,только обменяться данными


jenya7

jenya7,только обменяться данными
в эмбедед когда я открываю сокет я включаю KEEPALIVE опцию. А в С# если я создал TCP Listener - у него есть такая опция?


jenya7

jenya7,Опция есть, но работает keepalive совсем не так как многие ожидают


jenya7

jenya7,Опция есть, но работает keepalive совсем не так как многие ожидают
а что вы посоветуете? как сделать?


jenya7

jenya7,Предусмотреть в своём протоколе обмен эхо-пакетами


jenya7

jenya7,Предусмотреть в своём протоколе обмен эхо-пакетами
но keepalive так и работает - он посылает системный пакет (len=0) и получает ответ.


jenya7

jenya7,Параметр означает Не закрывать и переиспользовать соединение. Так что уточняйте вопрос.


jenya7

jenya7,Параметр означает Не закрывать и переиспользовать соединение. Так что уточняйте вопрос.
в эмбеде мы делаем так - если есть ошибка мы закрываем сокет и открываем заново, пытаемся сделать реконект, если нет ошибки а просто нет связи с сервером мы сокет не закрываем. А как это сделать в С#?


jenya7

эмбеде мы делаем так
Фиг знает что это, но думаю, что точно также пишите и тут. Imho.


jenya7

TCP соединение всегда живое, потому что это протокол передачи данных. Имеет смысл проверять, открыт ли нужный порт по протоколу TCP
А в С# если я создал TCP Listener - у него есть такая опция?
Listener пассивно слушает, а вам надо активно проверить.Если не забуду, то завтра с работы дам код


jenya7

но keepalive так и работает - он посылает системный пакет (len=0) и получает ответ.
и как часто?как приложение узнаёт о потере связи?У Стивенса в книге всё хорошо описано


jenya7

public bool PingPort(string IP, int port, int timeout_mcek = 500)
 {
 bool ret = false;
 using (Socket socket = new Socket(AddressFamily.InterNetwork,
 SocketType.Stream,
 ProtocolType.Tcp))
 {
 IPEndPoint point = new IPEndPoint(IPAddress.Parse(IP), port);
 var result = socket.BeginConnect(point, null, null);

 ret = result.AsyncWaitHandle.WaitOne(timeout_mcek, true);
 if (ret)
 {
 if (socket.Connected)
 socket.EndConnect(result);

 }
 else
 {
 socket.Close();
 }
 }
 return ret;
 }


jenya7

Cat2,спасибо. попробую.