Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> доступ к заголовкам TCP и IP кадров 
:(
    Опции темы
vodiv
  Дата 12.11.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 11.11.2010

Репутация: нет
Всего: нет



Привет знатокам!
При приеме массива данных через сокет, соединенный по TCP в буфер попадают только сами передаваемые данные, а заголовки пакетов остаются где-то на уровне сетевого стека. В то же время они несут некоторую информацию, которая может быть полезна получателю, в частности флаг передачи PSH сигнализирует о передаче последнего сегмента, при получении пакета с этим флагом можно переходить к обработке всего принятого массива. Существуют ли какие-нибудь функции, позволяющие получить доступ к полям заголовков?
PM MAIL   Вверх
Олег2005
Дата 13.11.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Цитата(vodiv @  12.11.2010,  11:33 Найти цитируемый пост)
 в частности флаг передачи PSH сигнализирует о передаче последнего сегмента,

Вообще то говоря, сигнализировать передачу последнего сегмента флаг никак не может.
Дело в том, что знает о "последнем сегменте" - только приложение пользователя(программер).
Модуль TCP понятия об этом не имеет.
И приказать из пользовательского приложения модулю TCP установить флаг - такой возможномти - т.е. функции - просто нету....
Идея, о которой вы говорите - поднималась в самых первых версиях стека - очень давно.
Сейчас многие ОС - типа BSD - шлют все сегменты с этим флагом......
Но некоторые поля заголовков можно модифицировать из приложения - setsockopt()

Это сообщение отредактировал(а) Олег2005 - 13.11.2010, 21:09
PM MAIL WWW MSN   Вверх
vodiv
Дата 14.11.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 11.11.2010

Репутация: нет
Всего: нет



Тем не менее при посылке массива функцией send именно последний кадр приходит с этим флагом. Это я проверил на ARM системе с доступным сетевым стеком. Обратную посылку я тоже отправляю таким же образом, но на приемном конце это никак не проявляется.
PM MAIL   Вверх
Олег2005
Дата 14.11.2010, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



 Вот объяснение вашего эффекта - в соответствии с RFC1122.

 В старом режиме работы приложение отправитель указывало своему TCP, когда необходимо установить флаг PUSH (вызывая особым образом функцию SEND), теперь же приложение делать этого не может - приложение отправитель вообще освобождается от необходимости заботиться о необходимости установки флага PUSH, забота об установке флага PUSH перекладывается на протокол TCP отправителя. TCP отправителя устанавливает флаг PUSH в сегменте ВСЕГДА, когда при передаче данного сегмента выходной буфер полностью освобождается, т.е. в «последнем» сегменте, уносящем из буфера все данные. 
По сути это означает следующее: если приложение записывает данные в буфер большими порциями (например, по 64 Кбайта), то стек формирует из этих данных сегменты максимального размера без установки в них флага PUSH (он там и не нужен), но когда в последнем сегменте передается последняя порция данных, записанная приложением отправителем в буфер, этот сегмент снабжается флагом PUSH (что, кстати, полезно, так как этот сегмент обычно не бывает полноразмерным по описанным выше причинам). После этого приложение отправитель делает очередную запись большой порции данных в буфер, и эти данные отправляются аналогично: во всех сегментах, кроме последнего флаг PUSH не устанавливается, но устанавливается в последнем сегменте. 

PM MAIL WWW MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.