![]() |
|
Модераторы: xvr |
![]()
|
|
| lazycat2012 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 2.9.2012 Репутация: нет Всего: нет |
Помогите разобрать на составляющие Ethernet пакет.
принимаю так:
получаю TCP пакет выделенный из Ethernet пакета (я надеюсь). Но мне нучно выделить данные из TCP, a там заголовок может быть разного размера, как быть? подскажите как эти пакеты разбирают (чистый Си - под линукс) |
|||
|
||||
| leniviy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
переделай структуру:
указатель на данные:
Это сообщение отредактировал(а) leniviy - 2.9.2012, 19:53 |
||||
|
|||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
переделал
|
|||
|
||||
| lazycat2012 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 2.9.2012 Репутация: нет Всего: нет |
Использовал структуры заголовков IP и TCP, получилось так:
работает, пишет что нужно. |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
по мне так, первые 2 memcpy - это лишнее, так как длина полей
ip.version,ip.protocol,ip.ihl,tcp.dest не превышает 16 бит, то unaligned access не случится. айпишники длиной 32+ бита действительно надо копировать с помощью memcpy, но здесь они не проверяются. Оптимальнее всего в recvfrom() передавать указатель на буфер+ (offsetof(чего-нибудь)), чтобы начало ip пакета делилось на 4.
Это работает? Если я правильно прочитал википедию, tcp.doff и ip.ihl - оба указывают на начало полезных данных, а длина пакета в другом поле |
|||
|
||||
| lazycat2012 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 2.9.2012 Репутация: нет Всего: нет |
да работает size_data = (rec-tcp.doff*4-ip.ihl*4-ETH_HLEN) tcp.doff*4 заголовок tcp ip.ihl*4 заголовок ip ETH_HLEN заголовок ETH в итоге размер "чистых данных"
Иначе я не смогу получить параметры ip.version, ip.protocol, tcp.dest, tcp.doff, ip.ihl, а их надо. |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |