Как узнать, когда вы закончите получать поток TCP? - PullRequest
1 голос
/ 23 сентября 2011

Я не уверен, как сказать в TCP, когда отправитель завершил отправку мне информации.

Например, если A нужно отправить 200 байтов B, как B узнает, что A завершил отправку, ичто информация готова для передачи на прикладной уровень?

Есть флаг FIN, но, насколько я знаю, он только там символизирует, что вы собираетесь закрыть соединение.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

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

Однако он сообщит вам, если соединение закрывается (тогда вы увидите последовательность FIN, FIN-ACK) в трассировке сети. С точки зрения программирования, предполагая, что вы используете C, функция recv вернет 0, когда узел закрывает соединение.

0 голосов
/ 23 сентября 2011

Вы определяете протокол, такой как первая отправка 4-байтового int в указанном порядке байтов, который указывает, сколько байтов будет следовать в теле сообщения.

0 голосов
/ 23 сентября 2011

Если вы используете unix / linux, select и poll могут сигнализировать вам, что другой конец завершил передачу (сделал половину / полное закрытие).read также вернется с ошибкой, если вы прочитали все данные и хотите прочитать из закрытого соединения.

Если вы делаете несколько передач на одном соединении и хотите сообщить об окончании пакета«Вы должны встроить это в свой протокол.

...