C++ 获取 Linux 本地 IP 地址:代码示例与解析
C++ 获取 Linux 本地 IP 地址:代码示例与解析
在 Linux 中,可以通过以下 C++ 代码获取本地 IP 地址:
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int sockfd;
struct sockaddr_in server_addr;
char ip_address[INET_ADDRSTRLEN];
// 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
std::cerr << "Failed to create socket" << std::endl;
return 1;
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr('192.168.100.44');
server_addr.sin_port = htons(52080);
// 连接到服务器
if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
std::cerr << "Failed to connect to server" << std::endl;
close(sockfd);
return 1;
}
// 获取本地 IP 地址
struct sockaddr_in local_addr;
socklen_t addr_len = sizeof(local_addr);
if (getsockname(sockfd, (struct sockaddr*)&local_addr, &addr_len) == -1) {
std::cerr << "Failed to get local IP address" << std::endl;
close(sockfd);
return 1;
}
// 将 IP 地址转换为字符串
inet_ntop(AF_INET, &(local_addr.sin_addr), ip_address, INET_ADDRSTRLEN);
// 输出 IP 地址
std::cout << "Local IP address: " << ip_address << std::endl;
// 关闭套接字
close(sockfd);
return 0;
}
代码解析:
- **创建套接字:**使用
socket()函数创建一个 UDP 套接字,用于连接到指定的服务器。 - **设置服务器地址:**使用
memset()函数将server_addr结构体初始化为 0,然后设置其sin_family、sin_addr.s_addr和sin_port成员,分别表示地址族、服务器 IP 地址和端口号。 - **连接到服务器:**使用
connect()函数连接到指定的服务器地址。 - **获取本地 IP 地址:**使用
getsockname()函数获取套接字的本地地址信息,并存储在local_addr结构体中。 - **将 IP 地址转换为字符串:**使用
inet_ntop()函数将local_addr.sin_addr中的网络字节序 IP 地址转换为点分十进制字符串形式,存储在ip_address字符数组中。 - **输出 IP 地址:**使用
std::cout输出获取到的本地 IP 地址。 - **关闭套接字:**使用
close()函数关闭套接字。
编译和运行:
g++ -o get_ip get_ip.cpp
./get_ip
请注意,代码中的 '192.168.100.44' 和 52080 需要替换为您的实际服务器 IP 地址和端口号。
相关函数介绍:
socket():创建套接字。connect():连接到指定的服务器地址。getsockname():获取套接字的本地地址信息。inet_addr():将点分十进制 IP 地址转换为网络字节序整数。inet_ntop():将网络字节序 IP 地址转换为点分十进制字符串形式。htons():将主机字节序的端口号转换为网络字节序。close():关闭套接字。
**注意:**此代码使用 UDP 套接字连接到服务器,仅用于获取本地 IP 地址,并不进行任何数据传输。如果需要进行数据传输,需要使用其他协议和函数。
原文地址: http://www.cveoy.top/t/topic/fb0P 著作权归作者所有。请勿转载和采集!