Russian Qt Forum

Qt => Работа с сетью => Тема начата: ManOfOrange от Октября 21, 2013, 13:33



Название: Работа с заголовком и телом IP-пакета
Отправлено: ManOfOrange от Октября 21, 2013, 13:33
Приветствую всех! :-)

Есть аппаратура, принимающая довольно специфичные команды. Команда выглядит примерно так: Ф_1011001123/120113430009=ТекстСообщения
Каждый символ в команде что-то значит для устройства (и да, поддерживаются русские буквы). Потом всё это переводится toHex, считается контрольная сумма и подаётся через com-порт в устройство. Этот процесс налажен и работает :-)

Но неожиданно передо мною возник вопрос работы с IP-пакетами по кускам: как выяснилось, аппаратура в определённом режиме может конвертировать IP-пакеты в вышеизложенный формат. Выглядит примерно так: Ф_1011001123/120113430009103991...n...=Данные IP-пакета
Жирным выделен добавленный кусок, первые цифры имеют смысл для устройства.
...n... — IP-заголовок.

Соответственно, встал вопрос, как получить из IP-пакета отдельно заголовок и отдельно данные, чтобы потом запихать их внутрь команды; да и как вообще получить для работы IP-пакет. Пока что я работал только с QTcpSocket и QTcpServer для передачи мелких файлов по локалке.

Во время поиска наткнулся на raw-socket'ы. Имеет ли смысл копать в этом направлении и разбираться с ними?

Заранее спасибо :-)

Qt 4.7.2, ОС «Заря» (переделанный Red Hat).


Название: Re: Работа с заголовком и телом IP-пакета
Отправлено: kuzulis от Октября 21, 2013, 14:24
Гы, хитрые штучки придумывают наши ОКБ. Теперь я за отчизну спокоен. :)

1. Попробуй setSockOptions() для перевода девайса в нужный режим.
2. Если не получается, то в чем проблема парсить входной поток самостоятельно отсекая заголовки (или что там надо отсечь)?


Название: Re: Работа с заголовком и телом IP-пакета
Отправлено: stima от Октября 22, 2013, 18:48
Не совсем понятно откуда Вы получаете данный буфер.

1. Если он приходит Вам на TCP сокет то там уже должно быть все распарсчено, Вам нужно взять только payload.
2. Если он приходит из другого места (массивом байт), и вы знаете что это TCP пакет можете распарсить его вручную. Для этого воспользуйтесь описанием TCP пакета, например с той-же вики.
http://ru.wikipedia.org/wiki/TCP
3. Если у вас уже установленно соединение, но испоьзуется RAW сокет (т.е. вся мета информация формируется в ручную), то тут тоже следует произвести п. 2.