![]() |
|
Модераторы: feodorv |
![]()
|
|
| vodiv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 11.11.2010 Репутация: нет Всего: нет |
Привет знатокам!
При приеме массива данных через сокет, соединенный по TCP в буфер попадают только сами передаваемые данные, а заголовки пакетов остаются где-то на уровне сетевого стека. В то же время они несут некоторую информацию, которая может быть полезна получателю, в частности флаг передачи PSH сигнализирует о передаче последнего сегмента, при получении пакета с этим флагом можно переходить к обработке всего принятого массива. Существуют ли какие-нибудь функции, позволяющие получить доступ к полям заголовков? |
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Вообще то говоря, сигнализировать передачу последнего сегмента флаг никак не может. Дело в том, что знает о "последнем сегменте" - только приложение пользователя(программер). Модуль TCP понятия об этом не имеет. И приказать из пользовательского приложения модулю TCP установить флаг - такой возможномти - т.е. функции - просто нету.... Идея, о которой вы говорите - поднималась в самых первых версиях стека - очень давно. Сейчас многие ОС - типа BSD - шлют все сегменты с этим флагом...... Но некоторые поля заголовков можно модифицировать из приложения - setsockopt() Это сообщение отредактировал(а) Олег2005 - 13.11.2010, 21:09 |
|||
|
||||
| vodiv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 11.11.2010 Репутация: нет Всего: нет |
Тем не менее при посылке массива функцией send именно последний кадр приходит с этим флагом. Это я проверил на ARM системе с доступным сетевым стеком. Обратную посылку я тоже отправляю таким же образом, но на приемном конце это никак не проявляется.
|
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Вот объяснение вашего эффекта - в соответствии с RFC1122.
В старом режиме работы приложение отправитель указывало своему TCP, когда необходимо установить флаг PUSH (вызывая особым образом функцию SEND), теперь же приложение делать этого не может - приложение отправитель вообще освобождается от необходимости заботиться о необходимости установки флага PUSH, забота об установке флага PUSH перекладывается на протокол TCP отправителя. TCP отправителя устанавливает флаг PUSH в сегменте ВСЕГДА, когда при передаче данного сегмента выходной буфер полностью освобождается, т.е. в «последнем» сегменте, уносящем из буфера все данные. По сути это означает следующее: если приложение записывает данные в буфер большими порциями (например, по 64 Кбайта), то стек формирует из этих данных сегменты максимального размера без установки в них флага PUSH (он там и не нужен), но когда в последнем сегменте передается последняя порция данных, записанная приложением отправителем в буфер, этот сегмент снабжается флагом PUSH (что, кстати, полезно, так как этот сегмент обычно не бывает полноразмерным по описанным выше причинам). После этого приложение отправитель делает очередную запись большой порции данных в буфер, и эти данные отправляются аналогично: во всех сегментах, кроме последнего флаг PUSH не устанавливается, но устанавливается в последнем сегменте. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |