2014-09-09 3 views
0

Я разрабатываю приложение (получил код от here), чтобы показать содержимое сетевых пакетов в OS X с помощью C и вот мой код:Почему IPPROTO_DIVERT в C перестает работать после нескольких тестов?

/* open a divert socket */ 
fd=socket(AF_INET, SOCK_RAW, IPPROTO_DIVERT); 

if (fd==-1) { 
    fprintf(stderr,"We could not open a divert socket\n"); 
    exit(1); 
} 

bindPort.sin_family=AF_INET; 
bindPort.sin_port=htons(5060); 
bindPort.sin_addr.s_addr=0; 

fprintf(stderr,"Binding a socket\n"); 
ret=bind(fd, (struct sockaddr *)&bindPort, sizeof(struct sockaddr_in)); 

if (ret!=0) { 
    close(fd); 
    fprintf(stderr, "Error bind(): %s",strerror(ret)); 
    exit(2); 
} 
/* read data in */ 
sinlen=sizeof(struct sockaddr_in); 
while (1) { 
    n = (int)recvfrom(fd, packet, 1514, 0, (struct sockaddr*)&sin, (socklen_t*)&sinlen); 
    hdr = (struct ip *) packet; 
    fprintf(stdout, "\n{{packet size: [%d]}}\n", htons(hdr->ip_len));fflush(stdout); 
    printf("The packet looks like this:\n"); 
    for (i = 0; i < 40; i++) { 
     printf("%02x ", (int)*(packet + i)); 
     if (!((i + 1) % 16)) 
      printf("\n"); 
    }; 
    printf("\n"); 

    printf("Source address: %s\n", inet_ntoa(hdr->ip_src)); 
    printf("Destination address: %s\n", inet_ntoa(hdr->ip_dst)); 
    printf("Receiving IF address: %s\n", inet_ntoa(sin.sin_addr)); 
    printf("Protocol number: %i\n", hdr->ip_p); 
} 

Перед тем, как запустить код, я запускаю следующую команду :

ipfw add divert 5060 all from any to 192.168.1.34 

Проблема с кодом заключается в том, что он ненадежный. Иногда это работает, а иногда нет. Я должен перезагрузить машину, а затем она работает (но только несколько раз). Есть ли другой способ отправить пакеты из пространства ядра в пространство пользователя? В конечном счете, я хочу изменить пакет и повторно вставить их в сетевой поток.

ответ

1

Я нашел решение, которое решает проблему.

pfctl -d // эта команда позволит вам без проблем использовать ipfw.

PS: IPFW лишен Йосемити!

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