」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 C++ 以程式設計方式確定 Linux 伺服器的 IP 位址?

如何使用 C++ 以程式設計方式確定 Linux 伺服器的 IP 位址?

發佈於2024-12-21
瀏覽:783

How Can I Programmatically Determine a Linux Server's IP Addresses in C  ?

以C 語言程式設計確定Linux 伺服器IP 位址

簡介

識別Linux 伺服器的IP 位址對於網路通訊和應用程式部署至關重要。本文提出了一種用 C 編寫的程式設計解決方案,用於有效檢索 Linux 電腦的 IP 位址。

問題陳述

目標是在 C 應用程式中以程式設計方式取得 Linux 伺服器的 IP 位址。伺服器可能有多個 IP 位址,包括本機主機位址、內部(管理)位址和外部(公用)位址。目標是檢索應用程式綁定的外部 IP 位址。

Lösung

標準 C 函式庫提供 getifaddrs() 函數來取得有關係統的網路介面和 IP 位址的資訊。以下是使用 getifaddrs() 列印本機電腦的所有 IPv4 和 IPv6 位址的範例:

#include 
#include 
#include 

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

    getifaddrs(&ifAddrStruct);

    for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
        if (!ifa->ifa_addr) {
            continue;
        }
        if (ifa->ifa_addr->sa_family == AF_INET) { // IPv4 address
            tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            printf("IPv4 Address %s\n", addressBuffer);
        } else if (ifa->ifa_addr->sa_family == AF_INET6) { // IPv6 address
            tmpAddrPtr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            printf("IPv6 Address %s\n", addressBuffer);
        }
    }

    if (ifAddrStruct != NULL) {
        freeifaddrs(ifAddrStruct);
    }

    return 0;
}

要擷取外部IP位址,您可以使用類似的方法,但專門尋找連接到外部網路的介面。您可以將 siocgifaddr 與 SIOCGIFADDR 一起使用來擷取特定介面的 IP 位址。

Fazit

getifaddrs() 函數和siocgifaddr 與SIOCGIFADDR 一起提供了用於檢索Linux 電腦的IP 位址的可靠方法在C.這些方法使應用程式能夠動態適應網路變化並建立必要的網路連線。

最新教學 更多>
  • 為什麼 Margin Top 不適用於 CSS 中的內聯元素?
    為什麼 Margin Top 不適用於 CSS 中的內聯元素?
    頂部邊距和內聯元素在 CSS 中,margin 屬性用於定義元素邊框之外的間距。然而,在內聯元素上使用 margin top 時會出現一個常見問題,特別是在 Firefox 中。 問題:為什麼內聯元素的 margin top 似乎被忽略在 Firefox 中? 答案:此行為並非 Firefox 獨有...
    程式設計 發佈於2024-12-21
  • 如何使用XPath透過CSS類別高效定位HTML元素?
    如何使用XPath透過CSS類別高效定位HTML元素?
    使用 XPath 按 CSS 類別尋找元素在網頁擷取中,通常需要根據 CSS 類別來定位 HTML 元素。 XPath 是一個用於導航 XML 和 HTML 文件的強大工具,它提供了一種實現此目的的方法。 考慮一個 HTML 頁面,其中的 div 元素具有名為「Test」的類別。以下XPath 查詢...
    程式設計 發佈於2024-12-21
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-21
  • 為什麼 `array_shift()` 會觸發「嚴格標準:只有變數應該透過引用傳遞」?
    為什麼 `array_shift()` 會觸發「嚴格標準:只有變數應該透過引用傳遞」?
    錯誤訊息「Strict Standards: Only Variables Should Be Passed by Reference」使用array_shift() 時,可能會報告嚴格標準如果傳遞的參數是函數呼叫的結果,則會發出警告。這種行為看起來不一致,因為它並不總是觸發警告。 考慮以下程式碼:...
    程式設計 發佈於2024-12-21
  • 如何在 Pandas 中進行聚合?
    如何在 Pandas 中進行聚合?
    Pandas 中的聚合如何使用 Pandas 執行聚合? 聚合函數會降低傳回物件的維度。一些常見的聚合函數包括mean()、sum()、size()、count()、std()、var()和sem()。 df1 = df.groupby(['A', 'B'], as_index=False)['C'...
    程式設計 發佈於2024-12-21
  • 如何在 C++ 中初始化靜態 `const std::string` 資料成員?
    如何在 C++ 中初始化靜態 `const std::string` 資料成員?
    宣告const std::string 類型的靜態資料成員在C 中,直接在類別定義中初始化const std::string 類型的靜態資料成員是不允許。相反,有兩個選項可以定義此類資料成員:內聯變數(C 17 或更高版本)使用內聯變量,它定義並初始化類別定義中的靜態成員:class A { pri...
    程式設計 發佈於2024-12-21
  • 如何在 Python 中從函數內部取得函數名稱?
    如何在 Python 中從函數內部取得函數名稱?
    從函數內部存取函數名稱在Python 中,從函數本身內部確定函數名稱在動態自省的情況下非常有用inspect 模組提供了一個方便的機制來獲取有關正在運行的程式碼的資訊。使用inspect.stack(),我們可以存取表示目前呼叫堆疊的幀列表。 對於給定的函數,堆疊列表中的第一幀對應於當前函數,而第二...
    程式設計 發佈於2024-12-21
  • 如何將電子表格列索引號轉換為其等效字母?
    如何將電子表格列索引號轉換為其等效字母?
    將電子表格列索引轉換為字母在 Google 表格中,列用數字索引,從 1 開始。但是,為了方便起見,它們通常也使用字母來表示(例如,“A”表示第一列,“D”表示第四列)。數字索引和字母值之間的轉換通常是腳本任務所必需的。 實作此轉換的一種方法是透過以下函數:function getColumnLet...
    程式設計 發佈於2024-12-21
  • 為什麼 `reader.ReadString` 不刪除初始分隔符號?
    為什麼 `reader.ReadString` 不刪除初始分隔符號?
    reader.ReadString 不會去掉初始分隔符號reader.ReadString 不會去掉初始分隔符號為了創建一個程式來迎接名為Alice 或Bob 的用戶,開發人員遇到一個問題,即使是合法的名稱也會引發不受歡迎的回應。程式錯誤地拒絕了 Alice 和 Bob 的進入。 問題此問題源自於程...
    程式設計 發佈於2024-12-21
  • 如何透過ServletContext存取WAR/WEB-INF目錄下的資源?
    如何透過ServletContext存取WAR/WEB-INF目錄下的資源?
    透過ServletContext存取WAR/WEB-INF目錄中的資源簡介: Java Web 應用程式通常將重要資源儲存在WAR/WEB-INF 目錄中。要存取這些資源,開發人員可以利用 ServletContext API。 問題:如何創建位於 WAR/WEB-INF中的資源的正確路徑資料夾,例...
    程式設計 發佈於2024-12-21
  • 如何使用 Bootstrap 隱藏響應式佈局中的元素?
    如何使用 Bootstrap 隱藏響應式佈局中的元素?
    使用Bootstrap 隱藏響應式佈局中的元素設計響應式佈局時,管理空間變得至關重要,尤其是在較小的螢幕上。 Bootstrap 為行動裝置提供了對折疊功能表列專案的支持,但是如果您想類似地隱藏其他頁面元素怎麼辦? 解決方案:解決方案:Bootstrap 提供了允許您的類別根據螢幕尺寸隱藏元素:超小...
    程式設計 發佈於2024-12-21
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-21
  • 如何修復嵌入式Python中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤?
    如何修復嵌入式Python中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤?
    解決嵌入式Python 中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤嘗試將嵌入式Python 3.2 解譯器整合到對於C 應用程序,可能會出現指示“無法載入檔案系統編解碼器”的錯誤。當 Py_Initialize 函數無法註冊編解碼器搜尋函數時,會發生此錯誤。 要解決此問題,必須...
    程式設計 發佈於2024-12-21
  • JavaScript 可以捕獲網頁螢幕截圖並將其發送到伺服器嗎?
    JavaScript 可以捕獲網頁螢幕截圖並將其發送到伺服器嗎?
    使用 JavaScript 擷取網頁螢幕截圖:可能嗎? 在基於 Web 的應用程式無所不在的世界中,對網頁進行螢幕截圖已成為可能成為開發人員和使用者的重要任務。然而,問題出現了:使用 JavaScript 捕獲網頁截圖並提交回伺服器是否可行? 使用 JavaScript 進行網頁截圖的挑戰由於由於瀏...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3