С# TCP-сервер: нужна ли повторная отправка на уровне приложения?

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

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

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

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

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


person Ben    schedule 18.10.2011    source источник


Ответы (2)


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

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

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

person Phil Lello    schedule 18.10.2011

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

person KeithS    schedule 18.10.2011