【问题标题】:libpcap on iOS ,the pcap_next() always return nulliOS 上的 libpcap,pcap_next() 总是返回 null
【发布时间】:2013-04-20 03:53:48
【问题描述】:

我是iOS初学者,毕业设计是开发一个可以在iOS上抓包的app。

我使用 libpcap 库。我的 iPhone 是 JB,我已经可以以 root 身份运行应用程序。更具体地说,我可以获得我的 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

如果有人对此有类似的经验或知道如何解决,如果您可以通过 liangweidarth@gmail.com 与我联系,我将不胜感激。

【问题讨论】:

  • 它解决了。我使用 pcap_loop 而不是 pcap_next。它工作得很好。

标签: iphone ios pcap libpcap


【解决方案1】:
packet_flag= pcap_next(pcap_handle, &packet_capture);
if (!packet_flag) {
    text2.text=@"capture failed";
}

引用pcap_next() 手册页:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2016-12-12
    • 2020-03-23
    • 1970-01-01
    • 2014-03-04
    • 2016-11-02
    • 2014-05-06
    相关资源
    最近更新 更多