このリンクのチュートリアルに従って、rawソケットパケットスニファを作成しています。
http://www.security-freak.net/raw-sockets/sniffer_eth_ip.c
コードはntoa()関数を使用して、送信元/宛先IPアドレスのドット表記バージョンを取得しますが、私が理解していることから、この関数は非推奨であるため、これらの行が問題を引き起こしています。
ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr));
/* print the Source and Destination IP address */
printf("Dest IP address: %d\n", inet_ntoa(ip_header->daddr));
printf("Source IP address: %d\n", inet_ntoa(ip_header->saddr));
printf("TTL = %d\n", ip_header->ttl);
私のシステム(Ubuntu 11.04)では、arpa / inet.hでinet_ntoa()関数しか見つかりませんでしたが、チュートリアルではそのヘッダーも使用していません。arpa / inet.hを含めると、次のコンパイルエラーが発生します。
sniffer.c:154:4: error: incompatible type for argument 1 of ‘inet_ntoa’
/usr/include/arpa/inet.h:54:14: note: expected ‘struct in_addr’ but argument is of type ‘__be32’
したがって、struct in_addrを使用する必要があることは理解していますが、このタイプ'__be32'に精通していません。誰かが助けることができますか?
編集-実際にはかなり複雑なキャストを行うことでこれを機能させることができましたが、より良い方法はありますか?
printf("Dest IP address: %s\n", inet_ntoa(*(struct in_addr*)&ip_header->daddr));
printf("Source IP address: %s\n", inet_ntoa(*(struct in_addr*)&ip_header->saddr));