RAW Socket étrange sur Mac OS X

Lorsque je lance un simple renifleur de paquets codé en C sur mon Mac OS X, je n’ai aucune sortie, c’est une chose étrange! quelqu’un peut-il m’aider à comprendre ce qui se passe?

#include  #include  #include  #include  #include  #include  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; } 

Je le comstack et le lance sur ma boîte et rien ne se passe:

 MacOsxBox:Desktop evariste$sudo ./simpleSniffer 

Merci de votre aide.

Cela ne fonctionnera pas sur * BSD (y compris OSX / Darwin). Voir l’enquête ici pour plus de détails:

 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 

Morale de l’histoire: utilisez libpcap pour cela. Cela vous facilitera beaucoup la vie. (Si vous utilisez MacPorts, sudo port install libpcap )

Je le lance et reçois:

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

Je suppose que ça va être quelque chose de vraiment étrange, comme si vous n’aviez pas la permission d’ouvrir une socket et que stderr est redirigé bizarrement.

Je suggérerais le bon vieux démodage du piège à loups:

  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"); 

... et voir ce que ça dit.