3

コンピューターでデバイスのアドレスを見つけようとしています。これまでのところ、デバイスのリストを(pcap_findalldevsで)取得できましたが、それらのアドレスにアクセスする方法がわかりません。私はこのマンページを見ました - http://www.tcpdump.org/pcap3_man.html このようなものが書かれています

インターフェイスのアドレスのリストの最初の要素へのポインタをアドレス指定します

そして、これ

アドレスのリストの各要素は pcap_addr_t 型で、次のメンバーがあります。

だから私はこのコードを持っています

pcap_if_t *alldevsp , *device;

 char *devname , **devs;
 int count = 1 , n;

 if(pcap_findalldevs(&alldevsp, errbuf))
 {
  printf("Error: %s" , errbuf);
  exit(1);
 }

 device = alldevsp;
 pcap_addr_t list;
 printf("\nDevices:\n");
 while(device != NULL)
 {
  printf("%d. %s - %s", count++ , device->name , device->description);
  list = device->addresses[0];
  printf("address: %s\n",(char *) inet_ntoa(list.addr));
  device = device->next; 
 }

コンパイルは問題ありませんが、実行しようとすると次のようになります。

デバイス: 1. eth0 - (null) アドレス: 144.208.30.8 2. wlan0 - (null) アドレス: 128.213.30.8 セグメンテーション違反

3 番目のデバイスが USB でアドレスがないため、segfault は理解できますが、eth0 と wlan0 の IP が間違っており、一致しません。

私は何を間違っていますか?

4

1 に答える 1

2

あなたのリンクから:

Each element of the list of addresses is of type pcap_addr_t,
and has the following members:
    ...
    addr
        a pointer to a struct sockaddr containing an address
    ...

では、 とは何struct sockaddrですか? ここを参照してください: http://www.retran.com/beej/sockaddr_inman.html

だから、あなたがこれをやっている場所:

printf("address: %s\n",(char *) inet_ntoa(list.addr));

あなたはこのようなことをしているはずです:

printf("address: %s\n", inet_ntoa(((struct sockaddr_in*)list.addr)->sin_addr));

つまり、「IP アドレス」を抽出する必要があります (実際にファミリが である場合AF_INET)。それ以外の場合はinet_ntoa、間違ったタイプの引数を指定しています。

于 2010-11-28T00:00:35.550 に答える