菜鸟教程小白 发表于 2022-12-12 10:45:09

iphone - iOS 上的 libpcap,pcap_next() 总是返回 null


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

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

<p>这是我的代码:</p>

<pre><code>-(IBAction)capture:(id)sender{
    char error_content;
    char *net_interface=NULL;
    net_interface=pcap_lookupdev(error_content);
    NSString *devstr = [ 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, &amp;packet_capture);
    if (!packet_flag) {
      text2.text=@&#34;capture failed&#34;;
    }
    else{
       NSString *length =[initWithFormat:@&#34;the length of packet is         %d&#34;,packet_capture.len];
       text2.text=length;
       ;
    }
       pcap_close(pcap_handle);
    }
@end
</code></pre>

<p>如果有人对此有类似的经验或知道如何解决,如果您可以通过 [email protected] 与我联系,我将不胜感激。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><pre><code>packet_flag= pcap_next(pcap_handle, &amp;packet_capture);
if (!packet_flag) {
    text2.text=@&#34;capture failed&#34;;
}
</code></pre>

<p>引用 <code>pcap_next()</code> 手册页:</p>

<blockquote>
<p>pcap_next() returns a pointer to the packet data on success, and returns NULL ifanerror occured, or if no packets were read from a live capture (if, for example, they were discarded because they didn&#39;t pass the packet filter, or if, on platforms that support a read timeout that starts before any packets arrive, the timeout expires before any packets arrive, or if the file descriptor for the capture device is in non-blocking mode and no packets were available to be read), or if no morepackets are available in a ``savefile.&#39;&#39;Unfortunately, there is no way to determine whether an error occured or not.</p>
</blockquote>

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

<p>您使用 <code>pcap_loop()</code> 做出了正确的选择。 <code>pcap_next()</code> 不是一个很好的 API; <code>pcap_next_ex()</code> 更好,<code>pcap_dispatch()</code> 和 <code>pcap_loop()</code> 也是如此。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - iOS 上的 libpcap,pcap_next() 总是返回 null,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/16228553/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/16228553/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - iOS 上的 libpcap,pcap_next() 总是返回 null