The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Доступ к первому байту IP адреса"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Доступ к первому байту IP адреса"  
Сообщение от geragray email(ok) on 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ричного значения.

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

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Доступ к первому байту IP адреса"  
Сообщение от geragray email(ok) on 07-Дек-07, 16:07 
Проблемма решена, я же не могу напрямую обращаться к байтам ip_header тк это уже структура, зато packet->payload[16] отлично работает.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Доступ к первому байту IP адреса"  
Сообщение от exn (??) on 07-Дек-07, 17:26 
strncpy(destIP, inet_ntoa(ip_header->daddr), 3);

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Доступ к первому байту IP адреса"  
Сообщение от geragray email(ok) on 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)

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Доступ к первому байту IP адреса"  
Сообщение от Slimm (??) on 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");

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру