2012-02-20 11 views
3

パケットスニファのハンドラを書き込もうとしています。キャストに問題があり、inet_ntoa()ですコードは以下の通りである:私はprintf("%s\n", test)にしようとした場合生のパケットデータとinet_ntoa()でキャストする

uint32_t *iphdr_srcaddr = malloc(sizeof(uint32_t)); 
if (*packet_ethertype == ETHERTYPE_IP) { /* IPv4 */ 
    // copy packet data to vars 
    memcpy(iphdr_srcaddr, packet+26, 4); 

    // change to host-byte-order 
    *iphdr_srcaddr = ntohl(*iphdr_srcaddr); 

    struct in_addr *test; 
    test = (struct in_addr*) iphdr_srcaddr; 

    printf("uint32_t: %u\n", *iphdr_srcaddr); // Gives the correct long integer for the address 
    printf("struct in_addr: %u\n", test->s_addr); // Gives the correct long integer through the cast 

    char *test2; 
    test2 = inet_ntoa(*test); 
} 

は今、私はSEGVを取得します。私はポインタ、値を混ぜ合わせていて、なんらかの愚かなキャストをしていると確信しています。私はこれが正しい方向に私を指していると確信しているが、私はそれが何を意味するのかをわからないんだけど、私はそれを修正することができますどのように、同様

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff787ec61 in __strlen_sse2() from /lib/libc.so.6 

コンパイル警告:

エラーは以下の実行中に受信しました
mypcap.c: In function ‘handle_sniffed’: 
mypcap.c:61:15: warning: assignment makes pointer from integer without a cast [enabled by default] 

これは(あなたが右のヘッダを含めていないので)test2 = inet_ntoa(*test);

+0

あなたのサンプル呼び出しは 'test'を印刷しようとします。代わりに 'test2'を印刷することを意味しましたか? – reuben

+1

ローカル変数を使うのではなく、なぜ 'malloc'を使って単一の' uint32_t'を得るのですか? –

答えて

7

警告は、おそらくあなたがinet_ntoa()のためのスコープで正しいプロトタイプを持っていないことを示している行を指します。つまり、コンパイラは戻り値の型がintであるとみなします。

また、test2を渡す必要がある場合は、testprintf()に渡しています。また

  • 単一uint32_tを割り当てるmalloc()を使用する必要はありません。
  • inet_ntoa()はネットワークバイトオーダーで入力されるため、ntohl()に電話する必要はありません。
  • inet_ntoa()は古いです - inet_ntop()は新しいコードで使用する必要があります。

試してみてください。

#include <arpa/inet.h> 

if (*packet_ethertype == ETHERTYPE_IP) { /* IPv4 */ 
    struct in_addr sin_addr; 
    char straddr[INET_ADDRSTRLEN]; 

    memcpy(&sin_addr.s_addr, packet+26, 4); 

    if (inet_ntop(AF_INET, &sin_addr, straddr, sizeof straddr)) 
     printf("%s\n", straddr); 
    else 
     perror("inet_ntop"); 
} 
+0

これは正しい方向に私を指摘し、大いに助けてくれました。ありがとう。 – axon

関連する問題