iOS上的libpcap,pcap_next()始终返回null

时间:2013-04-26 04:03:32

标签: iphone ios pcap libpcap

我是iOS的初学者,我的毕业设计是开发一个可以在iOS上捕获数据包的应用程序。

我使用libpcap库。我的iPhone是JB,我已经可以以root身份运行app了。更具体地说,我可以得到我的net_interface:en0,但是我无法捕获任何数据包.pcap_next()总是返回null。

这是我的代码:

-(IBAction)capture:(id)sender{
    char error_content[PCAP_ERRBUF_SIZE];
    char *net_interface=NULL;
    net_interface=pcap_lookupdev(error_content);
    NSString *devstr = [[NSString alloc] initWithUTF8String:net_interface];
    text1.text=devstr;

    pcap_t *pcap_handle;
    pcap_handle = pcap_open_live(net_interface, BUFSIZ, 0, 2, error_content);

    struct pcap_pkthdr packet_capture;
    const u_char *packet_flag;
    packet_flag= pcap_next(pcap_handle, &packet_capture);
    if (!packet_flag) {
        text2.text=@"capture failed";
    }
    else{
       NSString *length =[[NSString alloc]initWithFormat:@"the length of packet is         %d",packet_capture.len];
       text2.text=length;
       [length release];
    }
       pcap_close(pcap_handle);
    }
@end

如果某人有类似的exp或者知道如何解决它,如果你能通过liangweidarth@gmail.com与我联系,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

packet_flag= pcap_next(pcap_handle, &packet_capture);
if (!packet_flag) {
    text2.text=@"capture failed";
}

引用pcap_next()手册页:

  

pcap_next()在成功时返回指向数据包数据的指针,如果发生错误则返回NULL,或者如果没有从实时捕获中读取数据包(例如,如果它们因为未通过而被丢弃)数据包过滤器,或者,如果在支持在任何数据包到达之前启动的读取超时的平台上,超时在任何数据包到达之前到期,或者如果捕获设备的文件描述符处于非阻塞模式且没有可用的数据包读取),或者如果“savefile”中没有更多的数据包可用。''不幸的是,无法确定是否发生错误。

iOS与OS X一样,是在4.4-Lite派生的操作系统上构建的,并使用BPF; BPF是一个数据包,它支持在任何数据包到达之前开始的读取超时,并且,如果您指定2为pcap_open_live()的超时参数,则超时为2毫秒,因此,如果在您之后的2毫秒内没有数据包到达调用pcap_next()pcap_next()将返回NULL。

您使用pcap_loop()做出了正确的选择。 pcap_next()不是一个非常好的API; pcap_next_ex()更好,pcap_dispatch()pcap_loop()也是如此。