21xrx.com
2024-09-20 01:01:25 Friday
登录
文章检索 我的文章 写文章
如何在C++内核中获取本机IP地址
2023-07-05 06:41:15 深夜i     --     --
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地址的功能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复