首頁 >後端開發 >C++ >如何用 C 語言以程式設計方式取得 Linux 伺服器的公共 IP 位址?

如何用 C 語言以程式設計方式取得 Linux 伺服器的公共 IP 位址?

DDD
DDD原創
2024-12-24 05:24:13679瀏覽

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