C # TCP сервер: Требуется ли повторная отправка на уровне приложения? - PullRequest
1 голос
/ 18 октября 2011

Я относительно новичок в C #, поэтому, пожалуйста, потерпите меня.

Я пишу клиент-серверное приложение TCP и должен убедиться, что все отправляемые клиентом сообщения доставляются на сервер. Клиент отправит данные, а сервер отправит обратно ACK (реализовано на уровне приложения).

Я знаю, что сетевой уровень гарантирует (или выдает исключение), что компьютер конечной точки получает данные.

Я хочу знать, есть ли вероятность того, что серверный компьютер получает данные от клиента, но данные не доставляются в серверное приложение (если с серверным приложением все в порядке).

Спасибо за ваши ответы.

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

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

Лучший способ удовлетворить этот подход - включить порядковый номер в сообщения от клиента-> сервера.

Если клиент не получает ACK, он может переслать со старым порядковым номером; если сервер уже получил сообщение с таким же порядковым номером, он может его игнорировать.

2 голосов
/ 18 октября 2011

Протокол TCP обрабатывает большинство случаев потери / отбрасывания / коллизии пакетов, поэтому вам не нужно обрабатывать это на уровне кода.Однако вам НЕОБХОДИМО обрабатывать случаи тайм-аутов соединения / связи, ошибок транспортного уровня и т. Д. Они выбрасываются из библиотеки .NET Sockets как исключения, что приведет к аварийному завершению всего приложения, если вы их не перехватите и не обработаете.Обычная обработка ошибок для этих исключений - это просто повторить попытку подключения.

...