21xrx.com
2024-12-28 09:11:59 Saturday
登录
文章检索 我的文章 写文章
C++如何获取本地IP地址
2023-06-26 04:23:54 深夜i     --     --
C++ 本地IP地址 获取

C++作为一种面向对象的编程语言,能够在各种不同的应用场景中使用。而在网络编程中,获取本地IP地址则是非常重要的一步。本文将向您介绍如何使用C++获取本地IP地址。

首先,我们需要用到一个Winsock库。这个库提供了一些用于网络编程的C++函数和结构体。我们需要先包含它的头文件:


#include <winsock2.h>

然后,我们需要初始化Winsock库。这可以通过调用WSAStartup函数实现:


WSADATA wsaData;

if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0)

  // 错误处理代码

这里的MAKEWORD宏指定了Winsock库的版本号。我们使用2.0版本。

下一步,我们需要获取所有可用的网络接口的信息。这可以通过调用GetAdaptersAddresses函数实现:


PIP_ADAPTER_ADDRESSES addresses = nullptr;

ULONG len = 0;

DWORD ret = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, addresses, &len);

if (ret != ERROR_BUFFER_OVERFLOW)

  // 错误处理代码

这里的AF_UNSPEC表示获取IPv4和IPv6地址,GAA_FLAG_INCLUDE_PREFIX表示同时获取网关和子网掩码信息。

但是,由于我们不确定要获取多少个接口信息,因此需要先调用一次函数,以获取接口数并动态分配内存。如果调用失败,则可以使用返回的错误码进行错误处理。

接下来,我们遍历每个接口信息对象,并在其中查找我们需要的本地IPv4地址。这可以通过以下代码实现:


for (PIP_ADAPTER_ADDRESSES addr = addresses; addr != nullptr; addr = addr->Next) {

  for (PIP_ADAPTER_UNICAST_ADDRESS unicast = addr->FirstUnicastAddress; unicast != nullptr; unicast = unicast->Next) {

    // 判断是否为IPv4地址

    if (unicast->Address.lpSockaddr->sa_family == AF_INET) {

      // 获取IPv4地址的字符串形式

      char addrStr[INET_ADDRSTRLEN];

      inet_ntop(AF_INET, &((sockaddr_in*)unicast->Address.lpSockaddr)->sin_addr, addrStr, INET_ADDRSTRLEN);

      

      // 打印IPv4地址

      printf("Local address: %s\n", addrStr);

    }

  }

}

在这里,我们遍历每个接口信息对象的IP_ADAPTER_UNICAST_ADDRESS链表,这些对象包含要打印的IPv4地址。inet_ntop函数将IPv4地址的二进制表示转换为字符串形式。

最后,我们需要清理Winsock库。这可以通过调用WSACleanup函数实现:


WSACleanup();

通过以上步骤,我们就能够获取本地IPv4地址了。如果您需要获取IPv6地址,可以在上述代码中使用AF_INET6代替AF_INET。

  
  

评论区

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