首页 >后端开发 >C++ >如何用 C 语言以编程方式获取 Linux 机器的公共 IP 地址?

如何用 C 语言以编程方式获取 Linux 机器的公共 IP 地址?

Patricia Arquette
Patricia Arquette原创
2024-12-10 09:18:14445浏览

How to Programmatically Get a Linux Machine's Public IP Address in C  ?

如何用 C 语言以编程方式获取 Linux 机器的 IP 地址

简介:

本文解决了一个常见的编程挑战:确定运行用 C 编写的应用程序的 Linux 计算机的 IP 地址。这里的重点是获取服务器的外部或公共IP地址。

问题陈述:

任务是开发一个检索IP地址的C程序Linux 机器,特别是分配给指定网络(公共 IP)的机器。这确保应用程序可以将自身绑定到所需的外部地址以进行网络通信。

解决方案:

为了解决这个问题,我们利用 getifaddrs() 函数调用,它是 POSIX 标准的一部分,因此可在 Linux 上使用。此函数提供了一种遍历所有网络接口并检索其 IP 地址的便捷方法。

实现:

以下 C 代码演示了如何使用 getifaddrs()函数:

#include <stdio.h>      
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h>

int main (int argc, const char * argv[]) {
    struct ifaddrs * ifAddrStruct=NULL;
    struct ifaddrs * ifa=NULL;
    void * tmpAddrPtr=NULL;

    getifaddrs(&amp;ifAddrStruct);

    for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
        if (!ifa->ifa_addr) {
            continue;
        }
        if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4
            // is a valid IP4 Address
            tmpAddrPtr=&amp;((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
        } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6
            // is a valid IP6 Address
            tmpAddrPtr=&amp;((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
        } 
    }
    if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
    return 0;
}

解释:

此代码使用 ifa 循环迭代所有网络接口并检查每个接口的地址族。如果是 IPv4 或 IPv6,它会将地址转换为字符串并将其与接口名称一起打印。

此方法使您能够检测分配给 Linux 计算机的所有 IP 地址并识别所需的公共 IP 进行绑定目的。

以上是如何用 C 语言以编程方式获取 Linux 机器的公共 IP 地址?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn