| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > извлечь data из ethernet пакета (TCP) |
| Автор: lazycat2012 2.9.2012, 17:47 | ||
| Помогите разобрать на составляющие Ethernet пакет. принимаю так:
получаю TCP пакет выделенный из Ethernet пакета (я надеюсь). Но мне нучно выделить данные из TCP, a там заголовок может быть разного размера, как быть? подскажите как эти пакеты разбирают (чистый Си - под линукс) |
| Автор: leniviy 2.9.2012, 19:04 | ||||
переделай структуру:
указатель на данные:
|
| Автор: leniviy 2.9.2012, 19:49 |
| переделал |
| Автор: lazycat2012 3.9.2012, 17:02 | ||
Использовал структуры заголовков IP и TCP, получилось так:
работает, пишет что нужно. |
| Автор: leniviy 3.9.2012, 18:05 | ||
| по мне так, первые 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.9.2012, 18:21 | ||||
да работает 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, а их надо. |