Странный разъем RAW в Mac OS X

Когда я запускаю простой анализатор пакетов, написанный на C, в моей Mac OS X, я вообще не получаю никаких результатов, это странно! может кто-нибудь помочь мне понять, что происходит.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(void) {
   int i, recv_length, sockfd;

   u_char buffer[9000];

   if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP)) == -1) {
        printf("Socket failed!!\n");

        return -1;
   }

   for(i=0; i < 3; i++) {
      recv_length = recv(sockfd, buffer, 8000, 0);
      printf("Got some bytes : %d\n", recv_length);
   }

   return 0;
}

Я компилирую его и запускаю на своей машине, и ничего не происходит:

MacOsxBox:Desktop evariste$sudo ./simpleSniffer

Спасибо за вашу помощь.


person funnyCoder    schedule 29.07.2011    source источник
comment
Возможно, вам повезет больше, используя для этого libpcap, вместо того, чтобы пытаться открыть необработанный сокет напрямую.   -  person    schedule 30.07.2011


Ответы (2)


Это не будет работать в *BSD (включая OSX/Darwin). Подробнее см. расследование здесь:

b. FreeBSD
**********

FreeBSD takes another approach. It *never* passes TCP or UDP packets to raw
sockets. Such packets need to be read directly at the datalink layer by using
libraries like libpcap or the bpf API. It also *never* passes any fragmented 
datagram. Each datagram has to be completeley reassembled before it is passed
to a raw socket.
FreeBSD passes to a raw socket:
    a) every IP datagram with a protocol field that is not registered in
    the kernel
    b) all IGMP packets after kernel finishes processing them
    c) all ICMP packets (except echo request, timestamp request and address
    mask request) after kernel finishes processes them

Мораль истории: используйте для этого libpcap. Это сделает вашу жизнь намного проще. (Если вы используете MacPorts, выполните sudo port install libpcap.)

person mpontillo    schedule 30.07.2011
comment
Спасибо за этот ответ. Для lpcap я использовал его раньше, и он отлично работает. Я только что исследовал, почему этот простой необработанный сокет работает в Linux, а не в Mac OS X, и теперь я получил подтверждение. Спасибо. - person funnyCoder; 30.07.2011
comment
Почему морально использовать libpcap? Есть несколько замечательных примеров (если вы продолжите копать, вы найдете хотя бы несколько), которые объясняют, как использовать пакетные фильтры Беркли и т. д.: vankuik.nl bastion.rieck.ru На самом деле, я предпочитаю использовать BPF, а не libpcap. Вам не нужно изучать API; вместо этого вы можете действовать как обычно. - person j3141592653589793238; 25.02.2019
comment
Это хорошая точка; возможно, мой вывод был слишком резко сформулирован. Я рекомендовал использовать libpcap, так как он обычно доступен на всех платформах и сделает ваш код более переносимым. Но если вы хотите перейти на более низкий уровень из соображений производительности или по другим причинам, я говорю, сделайте это! - person mpontillo; 04.03.2020

Запускаю и получаю:

# ./a.out
Got some bytes : 176
Got some bytes : 168
Got some bytes : 168
# 

Я предполагаю, что это будет что-то действительно странное, например, у вас нет разрешения на открытие сокета, а stderr странно перенаправляется.

Я бы предложил старую добрую отладку волчьей ловушки:

   printf("I got ti 1\n");
   if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP)) == -1) {
        printf("Socket failed!!\n");

        return -1;
   }
   printf("I got to 2\n");
   for(i=0; i < 3; i++) {
      printf("About to read socket.\n");
      recv_length = recv(sockfd, buffer, 8000, 0);
      printf("Got some bytes : %d\n", recv_length);
   }
   printf("Past the for loop.\n");

... и посмотреть, что там написано.

person Charlie Martin    schedule 29.07.2011
comment
Спасибо, Чарли, вы запускаете его на MacOSX или Linux (потому что на Linux все в порядке). Кажется, что он останавливается на цикле while! я добавил в код старую отладку printf (спасибо :-) и получил только что: О чтении сокета. Странная вещь на этом Mac Box у меня есть все разрешения на рабочем столе. - person funnyCoder; 30.07.2011