2016-04-14 3 views
0

Я пытаюсь создать сервер/клиентское приложение, в котором сервер отправляет данные клиенту, а клиент отправляет данные обратно. Но по какой-то причине мне не удается заставить его работать, так как я не знаю, как обнаружить некачественное отсоединение без записи данных (я не могу писать данные, так как буфер будет заполнен неправильными данными, которые мне не нужны). Есть ли другой способ сделать это? Я использую TCP.Обнаружение некачественного отключения в C#

+1

TCP был разработан, чтобы изящно обрабатывать связи. Возможность восстановления TCP из исчезнувших соединений - это функция, а не ошибка. Другими словами: если связь не происходит, * нет разъединения *. Традиционное решение этого, когда вам нужно знать, остается ли другая сторона еще живым, - включить периодическое биение в протокол: некоторая операция, которая ничего не делает, кроме подтверждения того, что другая сторона все еще существует через ответ. Если такой операции нет, люди иногда используют записи с нулевым байтом, но это не полностью надежно. –

ответ

0

Вы описываете поведение TCP-соединений в ненадежной сети. Поэтому вам нужно использовать другой протокол. Посмотрите на

TCP C#

+0

Это надежная сеть, но если сервер отключается, я не хочу повторно подключать всех моих клиентов вручную. –

+0

какой протокол вы используете? –

+0

Извините, я неправильно понял ваш ответ. Я уже использую TCP. –

0

я не уверен, я полностью понимаю проблему, но вы можете проверить, если сокет все еще подключен:

public bool IsSocketConnected(Socket socket) { 
    return !(socket.Poll(0, SelectMode.SelectRead) && socket.Available == 0) && socket.Connected; 
} 
+0

Спасибо. Это работает для изящного отключения. Но не для некачественного разъединения. (когда сеть сервера случайно отключается) –

+0

Решение о тайм-ауте (отличном от '0', как в примере) может быть прагматичным решением. Если отсоединение происходит беспорядочно, то «выжившая» сторона будет заперта в подключенном состоянии, пока не примет слово для изменения состояния (которое не может, потому что это слово должно было бы со стороны, которое отключено), или вводится механизм тайм-аута. – kasperhj

0

Я установил его с KeepAlive функция.