21xrx.com
2025-04-02 04:01:04 Wednesday
文章检索 我的文章 写文章
如何使用C++获取本机的IPv4地址
2023-07-02 10:28:25 深夜i     28     0
C++ IPv4地址 获取 本机

IP地址是互联网中用于标识计算机位置的一种编号。IPv4地址是目前互联网中最常用的版本,由32位二进制数字组成。在C++编程中,使用socket编程库可以实现获取本机IPv4地址的功能。下面介绍如何使用C++获取本机的IPv4地址。

步骤一:引入头文件

使用socket编程库获取本机IPv4地址需要引入以下头文件:

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <iostream>

步骤二:创建漏洞Socket

为了获取本机IPv4地址,需要创建一个漏洞Socket。可以使用以下代码创建一个UDP Socket:

int sock = socket(AF_INET, SOCK_DGRAM, 0);

步骤三:获取网络接口列表

使用getifaddrs函数可以获取本机的网络接口列表。网络接口是向本机附加的物理或逻辑网络连接。在网络接口列表中,可以找到本机所连接的所有网络接口及其IP地址。getifaddrs函数返回一个ifaddrs结构体的指针,该结构体定义如下:

struct ifaddrs {
  struct ifaddrs* ifa_next;
  char*      ifa_name;
  unsigned int  ifa_flags;
  struct sockaddr* ifa_addr;
  struct sockaddr* ifa_netmask;
  struct sockaddr* ifa_dstaddr;
  void*      ifa_data;
};

其中,ifa_name表示网络接口的名称,ifa_flags表示一些标志位,ifa_addr表示网络接口的IP地址。

下面的代码展示了如何获取网络接口列表:

struct ifaddrs *ifAddrStruct = NULL;
if(getifaddrs(&ifAddrStruct) == -1){
  std::cout << "Fail to get network interfaces." << std::endl;
  exit(1);
}

步骤四:遍历网络接口列表

遍历网络接口列表,找到第一个IPv4地址并打印出来。IPv4地址的类型是AF_INET,可以通过sockaddr_in类型的变量获取IPv4地址。以下代码展示了如何遍历网络接口列表并获取IPv4地址:

struct ifaddrs *ifa = NULL;
for(ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next){
  if(!ifa->ifa_addr)
    continue;
  if(ifa->ifa_addr->sa_family != AF_INET)
    continue;
  void* tmpAddrPtr = &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr;
  char addressBuffer[INET_ADDRSTRLEN];
  inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
  std::cout << "IPv4 Address of " << ifa->ifa_name << " is: " << addressBuffer << std::endl;
}

步骤五:释放资源

获取网络接口列表之后需要释放资源,以免造成内存泄漏。以下代码展示了如何释放资源:

if(ifAddrStruct != NULL)
  freeifaddrs(ifAddrStruct);

完整代码如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <iostream>
int main(){
  int sock = socket(AF_INET, SOCK_DGRAM, 0);
  struct ifaddrs *ifAddrStruct = NULL;
  if(getifaddrs(&ifAddrStruct) == -1){
    std::cout << "Fail to get network interfaces." << std::endl;
    exit(1);
  }
  struct ifaddrs *ifa = NULL;
  for(ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next){
    if(!ifa->ifa_addr)
      continue;
    if(ifa->ifa_addr->sa_family != AF_INET)
      continue;
    void* tmpAddrPtr = &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr;
    char addressBuffer[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
    std::cout << "IPv4 Address of " << ifa->ifa_name << " is: " << addressBuffer << std::endl;
  }
  if(ifAddrStruct != NULL)
    freeifaddrs(ifAddrStruct);
  return 0;
}

总结

通过使用socket编程库,可以在C++程序中轻松获取本机的IPv4地址。只需创建漏洞Socket,然后使用getifaddrs函数获取网络接口列表,遍历网络接口列表找到IPv4地址即可。此外,需要注意代码中的内存管理以避免内存泄漏。

  
  

评论区

请求出错了