holyya.com
2025-09-04 13:48:25 Thursday
登录
文章检索 我的文章 写文章
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 地址是网络编程中的一个基础操作,本文所介绍的方法可以应用于各种类型的网络应用程序中。

  
  

评论区

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