2010-11-03 3 views
0

В C Я связываю сокет datagram (AF_INET, SOCK_DGRAM) с INADDR_ANY. Затем я периодически использую этот сокет для отправки и получения датаграмм и отслеживания потока пакетов с помощью pcap. Проблема в том, что я не могу определить, является ли пакет входящим или исходящим с помощью pcap.C pcap обнаружение входящих дейтаграмм

Мониторинг передачи/приема и мониторинга pcap работает в отдельных потоках, и по соображениям синхронизации они не могут общаться. Я только хочу отслеживать входящие пакеты, а не те, которые отправляются, и есть ли у кого-нибудь представление о том, как я могу это сделать?

Я уже думал о тестировании IP-адреса назначения, но я не могу найти способ получить свой локальный ip. машина, на которой работает, не имеет статического ip, а тем более назначенного имени домена, и кажется, что getsockname не работает на сокетах, привязанных к INADDR_ANY. Также попытался использовать ioctl (sockfd, SIOCGIFCONF, &), который тоже не работал - устанавливает buffer.ifc_len = 0.

+0

Кроме того, функция pcap_setdirection возвращает успех, но не имеет никакого эффекта. – Benubird

ответ

0

Найдено решение. Я могу получить свой собственный ip, используя это:

char * command = malloc (100);

Sprintf (команда "Ifconfig% s | Grep -о \" инет адр:. [^] \ "| Grep -o -e \" [0-9] \ [0-9] \ . [0-9] \. [0-9] * \ "", устройство);

дорожка для колес [1035];

FILE * fp;

fp = popen (команда, "r");

fgets (путь, 1034, fp);

pclose (fp);

my_ip = malloc (sizeof (char) * (1 + strlen (path)));

memcpy (my_ip, path, strlen (path) -1);

my_ip [strlen (path) -1] = 0;

Смежные вопросы