簡體   English   中英

如何使用 IPv6 知道 C 中接口的 IP 地址

[英]How to know the IP address for interfaces in C using IPv6

假設我想要使用IPv6IPv4的接口名稱列出 Linux 機器上所有 IP 地址的列表。

我能找到的最好的建議是使用應該支持 IPv6 的getifaddrs() ,類似於這里的帖子。 但是,getifaddrs() 使用 struct ifaddrs,它使用與 IPv6 不兼容的 struct sockaddr。 相反,它也應該是一個指向具有 struct in6_addr 的聯合的指針。

這是如何處理的? getifaddrs() 如何支持 IPv6? 文檔是否過時?

我的 C 非常生疏,並且成員包含聯合的struct sockaddr_in6 (如struct sockaddr_in6 )不再適合我的大腦,因此在最佳剪切和粘貼傳統中,我改編了chrisaycock 的答案(枚舉系統的 IPv4 地址)以使用getnameinfo()代替,在getifaddrs()手冊頁(有一個更好的例子)的幫助下:

#define _GNU_SOURCE    # required for NI_NUMERICHOST
#include <arpa/inet.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>

int main ()
{
  struct ifaddrs *ifap, *ifa;
  struct sockaddr_in6 *sa;
  char addr[INET6_ADDRSTRLEN];

  if (getifaddrs(&ifap) == -1) {
      perror("getifaddrs");
      exit(1);
  }

  for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr && ifa->ifa_addr->sa_family==AF_INET6) {
      sa = (struct sockaddr_in6 *) ifa->ifa_addr;
      getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), addr,
                  sizeof(addr), NULL, 0, NI_NUMERICHOST);
      printf("Interface: %s\tAddress: %s\n", ifa->ifa_name, addr);
    }
  }

  freeifaddrs(ifap);
  return 0;
}

我的系統上的輸出:

Interface: lo   Address: ::1
Interface: br0  Address: fdbf:e684:d5fb:6:6e62:6dff:fed1:dfad
Interface: br0  Address: 2001:db8:1f80:81c6:6e62:6dff:fed1:dfad
Interface: br0  Address: fe80::6e62:6dff:fed1:dfad%br0
Interface: virbr1       Address: fe80::5054:ff:fece:bfec%virbr1
Interface: virbr0       Address: fe80::5054:ff:fef9:c92e%virbr0
Interface: virbr2       Address: fe80::5054:ff:fedd:ea18%virbr2
Interface: vnet0        Address: fe80::fc54:ff:fe90:de19%vnet0
Interface: vnet1        Address: fe80::fc54:ff:fede:b69c%vnet1

請記住為所有內容添加錯誤檢查; 這個例子中省略了一些錯誤檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM