21xrx.com
2024-09-20 00:47:49 Friday
登录
文章检索 我的文章 写文章
如何使用C++获取本机的IPv4地址
2023-07-02 10:28:25 深夜i     --     --
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地址即可。此外,需要注意代码中的内存管理以避免内存泄漏。

  
  

评论区

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