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

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

DDD
DDD原创
2024-12-24 05:24:13675浏览

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

用 C 确定 Linux 机器的 IP 地址

问题

我们如何以编程方式获取运行我们的应用程序的 Linux 服务器的 IP 地址,特别是外部(公共)网络?

Linux 网络接口

Linux 服务器通常有多个网络接口,每个接口都有自己的 IP 地址。它有:

  • 环回接口:127.0.0.1
  • 内部管理接口:172.16.x.x
  • 外部公共接口: 80.190.x.x

解决方案

getifaddrs 函数可用于检索与计算机关联的所有 IP 地址。它提供了 ifaddrs 结构的链表。这是一个 C 示例:

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

using namespace std;

int main() {
  struct ifaddrs *ifAddrStruct, *ifa;
  void *tmpAddrPtr;

  getifaddrs(&ifAddrStruct);

  for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
    if (!ifa->ifa_addr) {
      continue;
    }
    if (ifa->ifa_addr->sa_family == AF_INET) {
      tmpAddrPtr = &((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) {
      tmpAddrPtr = &((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;
}

此代码迭代所有网络接口并打印 IPv4 和 IPv6 地址的 IP 地址。

通过检查网络接口名称(例如 eth0) 、eth1 等),您可以识别外部(公共)IP 地址并使用它来绑定您的应用程序。

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

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