パケットスニファのハンドラを書き込もうとしています。キャストに問題があり、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);
あなたのサンプル呼び出しは 'test'を印刷しようとします。代わりに 'test2'を印刷することを意味しましたか? – reuben
ローカル変数を使うのではなく、なぜ 'malloc'を使って単一の' uint32_t'を得るのですか? –