21xrx.com
2025-07-10 21:04:33 Thursday
文章检索 我的文章 写文章
如何在C++内核中获取本机IP地址
2023-07-05 06:41:15 深夜i     22     0
C++ 内核 获取 本机IP地址

在C++内核中获取本机IP地址是一个非常常见的需求,可以用来进行网络编程或者其他与本机网络相关的操作。在本文中,我们将讨论如何在C++内核中获取本机IP地址。

首先,需要明确一点的是,获取本机IP地址需要借助系统提供的接口来实现。在C++内核中,可以通过调用系统提供的函数来获取本机IP地址。

在Linux系统中,可以使用getifaddrs()函数来获取本机IP地址。该函数的作用是获取当前机器上所有的网络接口和相应的网络信息。具体实现可以参考如下代码:

#include <stdio.h>
#include <ifaddrs.h>
#include <netinet/in.h>
int main() {
  struct ifaddrs *ifaddr, *ifa;
  int family, s;
  char host[NI_MAXHOST];
  
  if (getifaddrs(&ifaddr) == -1) {
    perror("getifaddrs");
    return 0;
  }
  // 遍历网络接口
  for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr == NULL)
      continue;
    
    family = ifa->ifa_addr->sa_family;
    // 判断是否是IPv4地址
    if (family == AF_INET) {
      s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in),
              host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
      if (s != 0) {
        printf("getnameinfo() failed: %s\n", gai_strerror(s));
        return 0;
      }
      printf("Interface: %s\t Address: %s\n", ifa->ifa_name, host);
    }
  }
  freeifaddrs(ifaddr);
  return 0;
}

以上代码中,我们调用了getifaddrs()函数获取当前机器上所有的网络接口和相应的网络信息。然后使用循环遍历每个网络接口,判断其是否为IPv4地址。如果是IPv4地址,我们就调用getnameinfo()函数来获取IPv4地址的字符串表示形式,并打印输出。

在Windows系统中,可以使用GetAdaptersAddresses()函数来获取本机IP地址。该函数的作用是获取当前机器上所有的网络接口和相应的网络信息。具体实现可以参考如下代码:

#include <stdio.h>
#include <iphlpapi.h>
#include <ws2tcpip.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
int main() {
  ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
  PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
  DWORD ret = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER, NULL, pAddresses, &outBufLen);
  if (ret == ERROR_BUFFER_OVERFLOW) {
    free(pAddresses);
    pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
    ret = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER, NULL, pAddresses, &outBufLen);
  }
  if (ret != ERROR_SUCCESS) {
    printf("GetAdaptersAddresses failed with error: %u\n", ret);
    return 0;
  }
  PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses;
  while (pCurrAddresses) {
    PIP_ADAPTER_UNICAST_ADDRESS pUnicast = pCurrAddresses->FirstUnicastAddress;
    while (pUnicast) {
      sockaddr_in* pAddr = (sockaddr_in*)pUnicast->Address.lpSockaddr;
      if (pAddr->sin_family == AF_INET) {
        char ipStr[50] = {0};
        inet_ntop(AF_INET, &(pAddr->sin_addr), ipStr, sizeof(ipStr));
        printf("Interface: %S\t Address: %s\n", pCurrAddresses->FriendlyName, ipStr);
      }
      pUnicast = pUnicast->Next;
    }
    pCurrAddresses = pCurrAddresses->Next;
  }
  free(pAddresses);
  return 0;
}

以上代码中,我们调用了GetAdaptersAddresses()函数获取当前机器上所有的网络接口和相应的网络信息。然后使用循环遍历每个网络接口和相应的IP地址,并打印输出。

综上所述,获取本机IP地址是一个非常常见的需求,在C++内核中需要调用系统提供的函数来实现。在Linux系统中,可以使用getifaddrs()函数来获取本机IP地址。在Windows系统中,可以使用GetAdaptersAddresses()函数来获取本机IP地址。无论是哪种系统,以上代码都可以用来实现获取本机IP地址的功能。

  
  

评论区