2016-03-27 13 views
0

私は、inetアドレス127.0.0.1(ループバックアドレス)を使用してサーバからクライアントに送信されるテキストを読み取るスニファを作成しようとしています。クライアントがサーバーからデータを受信して​​も、プログラムは停止状態を維持します。スニファのクライアントとサーバ間のLinuxスニファLibpcap

CODE:

int main(int argc,char **argv) 
{ 
    char *dev; 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    pcap_t* descr; 
    bpf_u_int32 maskp;   /* subnet mask    */ 
    bpf_u_int32 netp;   /* ip*/ 
    struct bpf_program fp;  /* hold compiled program   */ 
    char *filter = "host 127.0.0.1"; 
    //char *filter = "port 5000"; 

    dev = pcap_lookupdev(errbuf); 
    if(dev == NULL) 
    { printf("%s\n",errbuf); exit(1); } 
       printf("call success"); 

    /* ask pcap for the network address and mask of the device */ 
    pcap_lookupnet(dev,&netp,&maskp,errbuf); 

    descr = pcap_open_live(dev,BUFSIZ,1,-1,errbuf); 
    if(descr == NULL) 
    { printf("pcap_open_live(): %s\n",errbuf); exit(1); } 

        /* Lets try and compile the program.. non-optimized */ 
    if(pcap_compile(descr,&fp,filter,0,netp) == -1) 
    { fprintf(stderr,"Error calling pcap_compile\n"); exit(1); } 

    /* set the compiled program as the filter */ 
    if(pcap_setfilter(descr,&fp) == -1) 
    { fprintf(stderr,"Error setting filter\n"); exit(1); } 


    pcap_loop(descr,2,callback,NULL); 

    fprintf(stdout,"\nfinished\n"); 
    return 0; 
} 
+0

サーバーとクライアントがポート5000を使用しています – Usman

答えて

0

あなたが渡している-1 pcap_open_live()からto_ms引数として。負のタイムアウトの動作は未定義です。 が正の値の値を指定する必要があります。値はミリ秒単位です。 tcpdumpは1000、すなわち1秒を使用し、Wiresharkは250、すなわち1/4秒を使用する。

pcap_lookupdev()を使用しているので、既定のデバイスでもキャプチャしています。これはループバックデバイスであることはめったにありません。そのため、デフォルトのデバイスでキャプチャした場合は、host 127.0.0.1というフィルタを使用すると、のトラフィックが発生することはほとんどありません。サーバーとクライアントがの場合は、プログラムを実行しているマシンと同じマシン上でが実行されている場合は、Linuxの"lo"という名前のループバックデバイスでキャプチャする必要があります。サーバとクライアントがでない場合、が同じマシン上で実行されている場合、トラフィックはではなく、のアドレス127.0.0.1を使用するため、別のアドレスを選択する必要があります。

+0

ありがとうございます。私はそれを見るでしょう。しかし、ループバックアドレス "char filter =" 127.0.0.1 ""に対してフィルタを使用する方法は正しいですか? – Usman

+0

またはポート5000でフィルタリングする必要がありますか? – Usman

関連する問題