URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7008
[ Назад ]

Исходное сообщение
"Доступ к первому байту IP адреса"

Отправлено geragray , 07-Дек-07 15:45 
Пишу сниффер на libpcap, нужно сделать фильтр broadcast/mutsicast. Те задача сводится к сравнению первого байта адреса получения на равенство 255 (броадкаст) и диапазон 224-239.  Мой код на мой взгляд жутко неоптимален, хотя и работает.

char destIP[4];
int destIPint;

ipq_packet_msg_t *packet = ipq_get_packet(buf);
ip_header = (struct iphdr*)(packet->payload);

strncpy(destIP, inet_ntoa(ip_header->daddr), 3);
destIPint = atoi(destIP);
if ((destIPint >= 224 && destIPint <= 239) || destIPint == 255)
    printf("Multi");
else
    printf("Uni");

По идее это можно сделать гораздо проще если обршаться напрямую к значению байта. IP адресс в заголовке находится по смешению в 16 байт. Те первый байт адреса можно получить как ip_header[16]. Но почему-то когда я делаю вот так
printf("%x", ip_header[16]);  
На экране появляется какая-то чушь вместо 16ричного значения.

Помогите, плиз.


Содержание

Сообщения в этом обсуждении
"Доступ к первому байту IP адреса"
Отправлено geragray , 07-Дек-07 16:07 
Проблемма решена, я же не могу напрямую обращаться к байтам ip_header тк это уже структура, зато packet->payload[16] отлично работает.

"Доступ к первому байту IP адреса"
Отправлено exn , 07-Дек-07 17:26 
strncpy(destIP, inet_ntoa(ip_header->daddr), 3);

ааааа.. ты монстр


"Доступ к первому байту IP адреса"
Отправлено geragray , 07-Дек-07 18:09 
>strncpy(destIP, inet_ntoa(ip_header->daddr), 3);
>
> ааааа.. ты монстр

Ну как умеем так и кодим, благо от меня никто тут хорошего кода не требует :)
В общем сейчас эта жуткая конструкция выглядит как

if ((packet->payload[16] >= 0xE0 && packet->payload[16] <= 0xEF) || packet->payload[16] == 0xFF)

Вроде бы неплохо, есть идее как еще улучшить?


"Доступ к первому байту IP адреса"
Отправлено Slimm , 07-Дек-07 17:31 
>Проблемма решена, я же не могу напрямую обращаться к байтам ip_header тк это уже структура,

бред, этож С, тут можно все
делаешь указатель на байт и грузишь туда адрес поля с IP адресом

а вообще надо работать с IP адресами посредством масок и булевых операций
мы даже в SQL это применяем ...


"Доступ к первому байту IP адреса"
Отправлено geragray , 07-Дек-07 18:10 
>>Проблемма решена, я же не могу напрямую обращаться к байтам ip_header тк это уже структура,
>
>бред, этож С, тут можно все
>делаешь указатель на байт и грузишь туда адрес поля с IP адресом
>
>
>а вообще надо работать с IP адресами посредством масок и булевых операций
>
>мы даже в SQL это применяем ...

Угу, ошибку понял. А сслыкой на пример подобного кода не поделитесь? В гугле только беркли филтры нашел - но вроде бы не совсем то.


"Доступ к первому байту IP адреса"
Отправлено exn , 07-Дек-07 22:02 
http://www.google.com.ua/search?hl=ru&q=%D1%87...


"Доступ к первому байту IP адреса"
Отправлено Slimm , 08-Дек-07 14:42 
>[оверквотинг удален]
>ipq_packet_msg_t *packet = ipq_get_packet(buf);
>ip_header = (struct iphdr*)(packet->payload);
>
>strncpy(destIP, inet_ntoa(ip_header->daddr), 3);
>destIPint = atoi(destIP);
>if ((destIPint >= 224 && destIPint <= 239) || destIPint == 255)
>    printf("Multi");
>else
>    printf("Uni");
>

а почему бы не обопщить задачу ведь адреса класса Е не исполльзуются
проверяйте первый байт на больше или равно 224

char *p;
int b;

p = &ip_header->daddr;
b = *p;

if(b>=224)
    printf("Multi");
else
    printf("Uni");