C pcap, обнаруживающий входящие дейтаграммы

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

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

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


person Benubird    schedule 03.11.2010    source источник
comment
Кроме того, функция pcap_setdirection возвращает успех, но не имеет никакого эффекта.   -  person Benubird    schedule 03.11.2010


Ответы (1)


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

символ *команда = malloc(100);

sprintf(command,"ifconfig %s|grep -o \"inet addr:[^ ]\"|grep -o -e \"[0-9]\.[0-9]< em>\.[0-9]\.[0-9]*\"",device);

путь символа[1035];

ФАЙЛ *fp;

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

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

закрыть (fp);

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

memcpy(my_ip, путь, strlen(путь)-1);

my_ip[strlen(путь)-1] = 0;

person Benubird    schedule 03.11.2010