”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使用 C++ 以编程方式确定 Linux 服务器的 IP 地址?

如何使用 C++ 以编程方式确定 Linux 服务器的 IP 地址?

发布于2024-12-21
浏览:528

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 .这些方法使应用程序能够动态适应网络变化并建立必要的网络连接。

最新教程 更多>
  • PHP 中的静态类与实例化类:何时选择什么?
    PHP 中的静态类与实例化类:何时选择什么?
    PHP 中的静态类与实例化类理解静态类和实例化类之间的区别在面向对象编程中至关重要。 PHP 作为一种流行的面向对象语言,提供了这两种选择。本文旨在阐明它们的适当用法。区别和适用性静态类与实例化对象不同,不保存特定数据并且不能复制。它们用作执行特定任务而不维护实例状态的实用函数。另一方面,实例化对象...
    编程 发布于2024-12-21
  • ES6 计算属性如何解决动态对象初始化挑战?
    ES6 计算属性如何解决动态对象初始化挑战?
    在 ES6 的对象初始化中使用动态属性名称在编程中经常会出现使用从外部源派生的属性名称创建对象的挑战。在查询中描述的场景中,我们尝试构造一个 JavaScript 对象,其属性的键在单独的变量 KEYS 中定义。但是,在为对象内的属性赋值时,我们遇到错误由于使用了点运算符 (.)。该运算符是为文字对...
    编程 发布于2024-12-21
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-12-21
  • 为什么 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 { pr...
    编程 发布于2024-12-21
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-12-21
  • 如何在 Python 中从函数内部获取函数名称?
    如何在 Python 中从函数内部获取函数名称?
    从函数内部访问函数名称在 Python 中,从函数本身内部确定函数名称在动态自省的情况下非常有用inspect 模块提供了一种方便的机制来获取有关正在运行的程序代码的信息。使用inspect.stack(),我们可以访问表示当前调用堆栈的帧列表。对于给定的函数,堆栈列表中的第一帧对应于当前函数,而第...
    编程 发布于2024-12-21
  • 如何将电子表格列索引号转换为其等效字母?
    如何将电子表格列索引号转换为其等效字母?
    将电子表格列索引转换为字母在 Google 表格中,列用数字索引,从 1 开始。但是,为了方便起见,它们通常也使用字母来表示(例如,“A”表示第一列,“D”表示第四列)。数字索引和字母值之间的转换通常是脚本任务所必需的。实现此转换的一种方法是通过以下函数:function getColumnLett...
    编程 发布于2024-12-21
  • 为什么 `reader.ReadString` 不删除初始分隔符?
    为什么 `reader.ReadString` 不删除初始分隔符?
    reader.ReadString 不会去掉初始分隔符为了创建一个程序来迎接名为 Alice 或 Bob 的用户,开发人员遇到一个问题,即使是合法的名称也会引发不受欢迎的响应。程序错误地拒绝了 Alice 和 Bob 的进入。问题该问题源于程序中使用 reader.ReadString('\...
    编程 发布于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

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3