2

このリンクのチュートリアルに従って、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));
4

2 に答える 2

9

inet_ntoa正式に非推奨ではありませんが、静的バッファを使用するため、少し古いスタイルです。通常getnameinfo、バイナリアドレスでドット付き文字に変換するためにを使用することをお勧めしますが、この場合inet_ntopはより適切に機能します。

char ipbuf[INET_ADDRSTRLEN];
printf("Dest IP address: %s\n", inet_ntop(AF_INET, &ip_header->daddr, ipbuf, sizeof(ipbuf)));
printf("Source IP address: %s\n", inet_ntop(AF_INET, &ip_header->saddr, ipbuf, sizeof(ipbuf)));

後で使用するために文字列を保持する必要がある場合は、個別のバッファを使用する必要があることに注意してください。

于 2011-09-12T08:52:06.437 に答える
0

ほとんどのLinuxディストリビューション(x86バージョンとx64バージョンの両方)で動作し、次のものが含まれます。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

ただし、それらすべてが必須であるかどうかは100%わかりません。

于 2013-05-04T14:20:53.250 に答える