2

私はiOSの初心者で、卒業の設計はiOSでパケットをキャプチャできるアプリを開発することです。

私は 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 経由で私に連絡していただければ幸いです。

4

1 に答える 1

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

pcap_next()マニュアルページを引用するには:

pcap_next() は、成功するとパケット データへのポインターを返し、エラーが発生した場合、またはライブ キャプチャからパケットが読み取られなかった場合 (たとえば、パケット フィルターを通過しなかったために破棄された場合) は NULL を返します。または、パケットが到着する前に開始する読み取りタイムアウトをサポートするプラットフォームで、パケットが到着する前にタイムアウトが期限切れになった場合、またはキャプチャデバイスのファイル記述子が非ブロックモードで、読み取り可能なパケットがなかった場合)、残念ながら、エラーが発生したかどうかを判断する方法はありません。

iOS は、OS X と同様に、4.4-Lite から派生した OS の上に構築され、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()

于 2013-06-12T07:23:44.233 に答える