Пишу сниффер на 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_header тк это уже структура, зато packet->payload[16] отлично работает.
strncpy(destIP, inet_ntoa(ip_header->daddr), 3);ааааа.. ты монстр
>strncpy(destIP, inet_ntoa(ip_header->daddr), 3);
>
> ааааа.. ты монстрНу как умеем так и кодим, благо от меня никто тут хорошего кода не требует :)
В общем сейчас эта жуткая конструкция выглядит какif ((packet->payload[16] >= 0xE0 && packet->payload[16] <= 0xEF) || packet->payload[16] == 0xFF)
Вроде бы неплохо, есть идее как еще улучшить?
>Проблемма решена, я же не могу напрямую обращаться к байтам ip_header тк это уже структура,бред, этож С, тут можно все
делаешь указатель на байт и грузишь туда адрес поля с IP адресома вообще надо работать с IP адресами посредством масок и булевых операций
мы даже в SQL это применяем ...
>>Проблемма решена, я же не могу напрямую обращаться к байтам ip_header тк это уже структура,
>
>бред, этож С, тут можно все
>делаешь указатель на байт и грузишь туда адрес поля с IP адресом
>
>
>а вообще надо работать с IP адресами посредством масок и булевых операций
>
>мы даже в SQL это применяем ...Угу, ошибку понял. А сслыкой на пример подобного кода не поделитесь? В гугле только беркли филтры нашел - но вроде бы не совсем то.
http://www.google.com.ua/search?hl=ru&q=%D1%87...
>[оверквотинг удален]
>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");
>а почему бы не обопщить задачу ведь адреса класса Е не исполльзуются
проверяйте первый байт на больше или равно 224char *p;
int b;p = &ip_header->daddr;
b = *p;if(b>=224)
printf("Multi");
else
printf("Uni");