Автор
|
Тема: определение конца пакета TCP
|
alexsh |
опубликован 21-11-2001 14:23 MSK
Пакет бъется на куски, которые я принимаю recv() занесколько раз. А как определить, что пакет пришол весь и больше ждать не надо?
|
Valery
|
опубликован 22-11-2001 11:06 MSK
TCP - протокол потоковый, а посему понятие пакет и соответственно конец пакета не существует. Либо посылаешь сначала размер записи, потом ее тело, либо встраиваешь в поток символы-разделители, либо, если все данные переданы (не пакет а данные всего сеанса), то делаешь шатдаун передающей стороны, принимающая при этом получает признак конца файла. |
alexsh
|
опубликован 22-11-2001 12:44 MSK
Функцию маршаллинга пакета писал другой программист, и на ней работает туча пакости в фирме. Так что изменить структуру пакета не могу. Но в одной из статей прочел, что последний фрагмент пакета ТСР имеет флаг FIN. Но в винде я не нашел его определения. Или это реализация юникса? |
Valery
|
опубликован 22-11-2001 14:11 MSK
Насколько я помню, этот флаг как раз определяет конец передачи в целом, то есть как раз EOF. Могу конечно ошибаться, книжка дельная дома, в том что у меня на работе есть копаться не охота. |
Heromantor
|
опубликован 22-11-2001 15:43 MSK
1. FIN означает что прекращаеться передача от того кто послал этот пакет. 2. recv() для TCP соединения не обязательно принимает один пакет. 3. Как ты собираешься определять тип пакета?( Особенно если все это для Вынь) 4. FIN грубо говоря посылаеться при closesocket(). Делаеться так:Client: FIN Server: ACK FIN Server: FIN Client: ACK FIN Только зачем такой гемор себе устраивать... |