2016-09-09 7 views
0

C言語のパケット(ヘッダーとペイロードを含む)で文字列検索を行うにはどうすればよいですか?私はstrstr()を使ってみましたが、私のdestのMACアドレスが0x00で始まるので、strstr()関数はそれ以上パケットに入りませんでした。さらに、パケット内に0x00バイト以上が存在する可能性があります。バイト単位で検索する必要がありますか、それともより高速な方法がありますか?パケット内の文字列検索とパケットデータの印刷

また、%sを使用してパケットデータを印刷できますか?私は以下を試みたが、出力はなかった。

while ((rc = pcap_next_ex(pcap, &pkthdr, &data)) >= 0) 
    printf("%s\n", data); 
+0

を?固定長ですか? 'rc'? – chux

+0

パケット全体を検索したい。 – Rayne

答えて

1

印刷:

あなたはパケット使用のprintf( "%sの"、データ)を印刷することはできません。これは、NULLバイト( '\ 0')が発生したときに印刷が終了するためです。これは、送信データを参照する際に非常に頻繁に発生します。あなたは%のlen NULLバイトを無視して%列strのうち、バイト印刷するには、以下を使用できますが、それはどの断然バイトが見えないので、あなたを得ることはありません。

// len = pkthdr.len 
printf("%.*s", len, str); 

検索すると、あなたが非を使用することができます - 標準機能strnstr:

#include <stdio.h> 
#include <string.h> 

char *strnstr(const char *haystack, const char *needle, size_t len) 
{ 
     int i; 
     size_t needle_len; 

     /* segfault here if needle is not NULL terminated */ 
     if (0 == (needle_len = strlen(needle))) 
       return (char *)haystack; 

     for (i=0; i<=(int)(len-needle_len); i++) 
     { 
       if ((haystack[0] == needle[0]) && 
         (0 == strncmp(haystack, needle, needle_len))) 
         return (char *)haystack; 

       haystack++; 
     } 
     return NULL; 
} 

int main() 
{ 
    char big_str[] = "abc\0cde\0efg\0"; 

    printf("%s", strnstr(big_str, "efg", 12)); 

    return 0; 
} 

が、この読み:MACアドレスはどのようにあなたがその終了を決定します、$ 00で始まる可能性がある場合https://stackoverflow.com/a/25705264/6814540