21xrx.com
2025-03-23 23:26:18 Sunday
文章检索 我的文章 写文章
C++ 如何获取本机 IP 地址
2023-07-05 06:01:48 深夜i     --     --
C++ 本机 IP地址 获取 编程

C++ 是一门经典的高级编程语言,它可以用于编写各种类型的软件和应用程序,包括网络应用程序。在开发网络应用程序中,获取本机的 IP 地址是非常重要的操作。本文将介绍如何使用 C++ 获取本机的 IP 地址。

获取本机 IP 地址的方法有很多种,这里介绍一种基于套接字编程的方法。具体步骤如下:

1. 创建一个套接字:

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

这里创建了一个 UDP 套接字,使用 IPv4 协议。

2. 获取本机 IP 地址:

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("8.8.8.8");
addr.sin_port = htons(80);
connect(sock, (struct sockaddr *)&addr, sizeof(addr));
struct sockaddr_in local_addr;
socklen_t addr_len = sizeof(local_addr);
getsockname(sock, (struct sockaddr *)&local_addr, &addr_len);
char ip_str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(local_addr.sin_addr), ip_str, INET_ADDRSTRLEN);

这里先通过 connect 函数连接到一个公共的 IP 地址(这里使用了 Google 的 DNS 服务器地址),然后通过 getsockname 函数获取本地套接字的信息,包括 IP 地址。最后使用 inet_ntop 函数将 IP 地址转换成字符串形式。

3. 关闭套接字:

close(sock);

完整的代码如下:

#include <iostream>
#include <cstring>
#include <arpa/inet.h>
#include <sys/socket.h>
using namespace std;
int main() {
  int sock = socket(AF_INET, SOCK_DGRAM, 0);
  struct sockaddr_in addr;
  memset(&addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr("8.8.8.8");
  addr.sin_port = htons(80);
  connect(sock, (struct sockaddr *)&addr, sizeof(addr));
  struct sockaddr_in local_addr;
  socklen_t addr_len = sizeof(local_addr);
  getsockname(sock, (struct sockaddr *)&local_addr, &addr_len);
  char ip_str[INET_ADDRSTRLEN];
  inet_ntop(AF_INET, &(local_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
  close(sock);
  cout << "Local IP address: " << ip_str << endl;
  return 0;
}

运行程序,输出结果如下:

Local IP address: 192.168.1.105

这里获取到的 IP 地址是本机的内网 IP 地址,如果要获取公网 IP 地址,可以连接到一个提供公网 IP 地址查询服务的网站,然后解析服务器返回的数据获取 IP 地址。

总结:

本文介绍了一种使用 C++ 获取本机 IP 地址的方法,该方法基于套接字编程,使用了 connect 和 getsockname 函数。获取本机 IP 地址是网络编程中的一个基础操作,本文所介绍的方法可以应用于各种类型的网络应用程序中。

  
  

评论区