0

インターフェイスの mac アドレスと ipv4 アドレスを取得するサンプル コードを見ました。そのインターフェイスのipv6アドレスを取得しようとして少し変更しましたが、プログラムは「27:13:エラー:タイプ「struct libnet_in6_addrからタイプ「u_int32_t」に割り当てるときに互換性のないタイプです」と言って失敗します

#include <stdlib.h>
#include <libnet.h>
#include <stdint.h>

int main() {

  libnet_t *l;  /* libnet context */
  char errbuf[LIBNET_ERRBUF_SIZE];
  u_int32_t ip_addr;
  struct libnet_ether_addr *mac_addr;

  l = libnet_init(LIBNET_RAW4, NULL, errbuf);
  if ( l == NULL ) {
    fprintf(stderr, "libnet_init() failed: %s\n", errbuf);
    exit(EXIT_FAILURE);
  }

  ip_addr = libnet_get_ipaddr4(l);
  if ( ip_addr != -1 )
    printf("IP address: %s\n", libnet_addr2name4(ip_addr,\
                            LIBNET_DONT_RESOLVE));
  else
    fprintf(stderr, "Couldn't get own IP address: %s\n",\
                    libnet_geterror(l));

  u_int32_t ipv6_addr;
  ipv6_addr = libnet_get_ipaddr6(l);
  if ( ip_addr != -1 )
    printf("IPv6 address: %s\n", libnet_addr2name6(ip_addr,\
                            LIBNET_DONT_RESOLVE));
  else
    fprintf(stderr, "Couldn't get own IPv6 address: %s\n",\
                    libnet_geterror(l));

  mac_addr = libnet_get_hwaddr(l);
  if ( mac_addr != NULL )
    printf("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",\
        mac_addr->ether_addr_octet[0],\
        mac_addr->ether_addr_octet[1],\
        mac_addr->ether_addr_octet[2],\
        mac_addr->ether_addr_octet[3],\
        mac_addr->ether_addr_octet[4],\
        mac_addr->ether_addr_octet[5]);
  else
    fprintf(stderr, "Couldn't get own MAC address: %s\n",\
                    libnet_geterror(l));

  libnet_destroy(l);
  return 0;
}

IPv6アドレスを保存するために何を使用すればよいかわからないため、 u_int32_t を使用します。 u_int64_t を試しましたが、機能しません。このような基本的な問題に再び遭遇した場合、どこで解決策を見つければよいか知りたいです。IPv6 アドレスに関する例が見つかりません。

4

1 に答える 1

0

まず、libnet を知りません。

とはいえ、コードから答えを導き出すことは可能です。

もしも

u_int32_t ipv6_addr;
ipv6_addr = libnet_get_ipaddr6(l);

で失敗します

error: incompatible types when assigning to type ‘u_int32_t’ from type ‘struct libnet_in6_addr’

ipv6_addr、タイプを持つべきだと言えstruct libnet_in6_addrます。

さらに、

if ( ip_addr != -1 )
    printf("IPv6 address: %s\n", libnet_addr2name6(ip_addr,\
                        LIBNET_DONT_RESOLVE));

によって変更する必要があります

  • ip_addrで置き換えるip_addr6
  • (ip_addr != -1)ドキュメントでlibnetが推奨するものに変更します。

IPv6 アドレスが見つかったかどうかを知るため。

ところで: IPv6 アドレスは 1 つ以上存在する可能性があります。

于 2012-03-27T14:28:01.170 に答える