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;
}

代码解析:

  1. **创建套接字:**使用 socket() 函数创建一个 UDP 套接字,用于连接到指定的服务器。
  2. **设置服务器地址:**使用 memset() 函数将 server_addr 结构体初始化为 0,然后设置其 sin_familysin_addr.s_addrsin_port 成员,分别表示地址族、服务器 IP 地址和端口号。
  3. **连接到服务器:**使用 connect() 函数连接到指定的服务器地址。
  4. **获取本地 IP 地址:**使用 getsockname() 函数获取套接字的本地地址信息,并存储在 local_addr 结构体中。
  5. **将 IP 地址转换为字符串:**使用 inet_ntop() 函数将 local_addr.sin_addr 中的网络字节序 IP 地址转换为点分十进制字符串形式,存储在 ip_address 字符数组中。
  6. **输出 IP 地址:**使用 std::cout 输出获取到的本地 IP 地址。
  7. **关闭套接字:**使用 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 地址,并不进行任何数据传输。如果需要进行数据传输,需要使用其他协议和函数。

C++ 获取 Linux 本地 IP 地址:代码示例与解析

原文地址: http://www.cveoy.top/t/topic/fb0P 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录