Strange RAW Socket en Mac OS X

Cuando ejecuto un simple sniffer de paquetes codificado en C en mi Mac OS X, no tengo salida, ¡esto es algo extraño! ¿Puede alguien ayudarme a entender lo que está pasando?

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

Lo compilo y lo ejecuto en mi caja y no pasa nada:

 MacOsxBox:Desktop evariste$sudo ./simpleSniffer 

Gracias por tu ayuda.

Esto no funcionará en * BSD (incluido OSX / Darwin). Vea la investigación aquí para más detalles:

 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 

Moraleja de la historia: usa libpcap para esto. Te hará la vida mucho más fácil. (Si usa MacPorts, haga sudo port install libpcap ).

Lo ejecuto y consigo

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

Supongo que va a ser algo realmente extraño, como que no tienes permiso para abrir un socket y que stderr se redirige de forma extraña.

Yo sugeriría la depuración de la buena trampa de lobos a la antigua:

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

... y ver lo que dice.