Lazarus:如何列出系统上所有可用的网络连接?

2024-02-16

我正在使用 Lazarus IDE 在 Linux 系统上编写程序。该程序应该连接到 Internet 或 Intranet。所以,我想向用户显示他们可以用来连接到互联网或内部网(如wifi)的所有可用网络连接的列表,如果系统上有两个活动网卡,那么这个程序应该显示它们的可用连接。

目前,我不知道从哪里开始或使用什么工具。

任何提示、线索或建议将不胜感激。


您可以使用 ifconfig 列出所有可用的网络接口及其状态。

编辑:要以编程方式执行此操作,您必须将函数 ioctl 与 SIOCGIFCONF 一起使用。

#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>

int main()
{
    int     sockfd, len, lastlen;
    char    *ptr, *buf;
    struct ifconf ifc;
    struct ifreq *ifr;
    char ifname[IFNAMSIZ + 1];
    char str[INET6_ADDRSTRLEN];

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    lastlen = 0;
    len = 100 * sizeof(struct ifreq);     /* initial buffer size guess */
    for ( ; ; )
    {
        buf = malloc(len);
        ifc.ifc_len = len;
        ifc.ifc_buf = buf;
        if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)
        {
            if (errno != EINVAL || lastlen != 0)
                exit(-1);
        }
        else
        {
            if (ifc.ifc_len == lastlen)
                break;          /* success, len has not changed */
            lastlen = ifc.ifc_len;
        }

        len += 10 * sizeof(struct ifreq);     /* increment */
        free(buf);
    }

    printf("LEN: %d\n", ifc.ifc_len);

    for (ptr = buf; ptr < buf + ifc.ifc_len; )
    {
        ifr = (struct ifreq *) ptr;

        ptr += sizeof(struct ifreq); /* for next one in buffer */

        memcpy(ifname, ifr->ifr_name, IFNAMSIZ);

        printf("Interface name: %s\n", ifname);

        const char *res;

        switch (ifr->ifr_addr.sa_family)
        {
            case AF_INET6:
                res = inet_ntop(ifr->ifr_addr.sa_family, &(((struct sockaddr_in6 *)&ifr->ifr_addr)->sin6_addr), str, INET6_ADDRSTRLEN);
                break;
            case AF_INET:
                res = inet_ntop(ifr->ifr_addr.sa_family, &(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr), str, INET_ADDRSTRLEN);
                break;
            default:
                printf("OTHER\n");
                str[0] = 0;
                res = 0;
        }

        if (res != 0)
        {
            printf("IP Address: %s\n", str);
        }
        else
        {
            printf("ERROR\n");
        }
    }

    return 0;
}

如果成功,ioctl SIOCGIFCONF 将返回一个 struct ifconf,它有一个指向 struct ifreq 数组的指针。 这些结构体在 net/if.h 中定义

使用这段代码,从 ifc.ifc_req 可以获取所有接口,请查看 struct ifreq 的声明以确定每个数组元素的长度和类型。我想从这里你可以独自继续,如果不行请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lazarus:如何列出系统上所有可用的网络连接? 的相关文章

  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • Springframework“需要重定向才能获得用户批准”

    我的 Spring Web 应用程序有问题 我想使用 web 应用程序访问 google 日历 api 因此我必须向 api 验证自己的身份并授予对日历的访问权限 但实际的问题是我收到了错误org springframework secur
  • 嵌套枚举的替代方案

    我正在尝试创建几个enums因此 这给出了语法Dropdown Category Subcategory 然而 我一直在读到这不是一个好主意 我的选择主要是因为我想不出任何其他方法来选择不同的enum值取决于类别的选择 然后子类别的选择取决
  • 对于给定的整数 a,找到总和为 a 的所有唯一的正整数组合

    不是家庭作业问题 我正在回答这些问题here http www careercup com question id 5653595164770304我遇到了这个问题 有人已经回答了 我已经尝试了很多方法来理解所使用的递归 但我无法理解它 有
  • Laravel Dusk:未知错误:调用函数结果缺少“值”

    我在使用 Laravel Dusk type 和 value 方法时遇到问题 我收到以下错误 php artisan dusk group activation Warning TTY mode is not supported on Wi
  • 相同的AVX指令集代码Intel Core与AMD Ryzen性能差距巨大

    我想使用AVX指令集来加速从8通道图像到8通道图像的卷积运算 我使用 3x3 卷积核 我的代码如下 const float kptr kernels const float bptr biases m256 out0 mm256 loadu
  • 在Python中下载之前获取文件的大小

    我正在从网络服务器下载整个目录 它工作正常 但我不知道如何在下载之前获取文件大小以比较它是否在服务器上更新 这可以像我从 FTP 服务器下载文件一样完成吗 import urllib import re url http www someu
  • tomcat webapps目录绝对路径?

    我将 tomcat 提取放在一个地方 而我的 webapps 目录可能在其他地方 那么如何获取我的Web应用程序的绝对路径呢 我的文件处理程序位于 webapps 内 我想找到我的 webapps 或应用程序目录的绝对路径 从 c 或 ho
  • GitHub 页面上的侧边栏

    我在 GitHub Pages 上托管了一个简单的网站 它是一个公共存储库 仅使用具有默认设置等的标准默认模板 它是直接从根目录发布的 本质上 按照官方 Github Pages 教程 一切都处于默认状态 我只想为我的目录显示一个侧边栏 注
  • 谷歌 API 服务帐户。即使使用域范围委派访问也只能看到服务帐户驱动器

    我目前使用的 Google 服务帐户已启用域范围委派 我点击了此链接https developers google com identity protocols oauth2 service account https developers
  • 在 Nginx 配置中使用代理传递之前传递代理 URL

    我需要传递一个代理 URL 来连接到 Nginx 中作为代理传递提到的其他 URL 示例 如果我必须通过 Linux 服务器连接到 google com 我必须将代理设置为 xyz org 80 然后才能连接到 google com 那么如
  • 在 Windows 上使用 FreeType 和 Qt5

    有谁知道是否可以使用 FreeType 构建 Qt5 作为 Windows 上的文本渲染器而不是本机渲染器 我尝试使用 qt freetype 编译 Qt5 但仍然得到错误的文本 我还需要做其他事情吗 在查看 DeadWarlock 提出的
  • 检查数据类字段是否有默认值的 Pythonic 方法

    我最近一直在使用 python 3 7 并正在寻找利用新数据类的方法 基本上我有一个方法可以迭代数据类字段并检查它们是否有默认值 from dataclasses import fields MISSING classmethod def
  • pm2 下的自定义日志记录

    我在我写入的节点应用程序中有一些有用的日志记录console log node server js gt gt var log nodeserver log 2 gt 1 但是 当在下面尝试相同的操作时pm2 pm2 start serve
  • python如何在赋值运算符之后赋值[重复]

    这个问题在这里已经有答案了 好吧 我确信这是一个非常愚蠢的问题 但是python如何给变量赋值呢 说有一个变量a并被赋值a 2 所以python为变量分配了一个内存位置并且a现在指向包含该值的内存位置2 现在 如果我分配一个变量b a变量b
  • 以编程方式编辑表单回复

    我有一个谷歌脚本 可以为转储到我的电子表格中的每个表单响应生成编辑网址 有没有办法以编程方式更改响应值 就像我实际打开 URL 并手动更改值一样 例如 假设某人提交了一份姓名字段为 Sam 的表单 我希望能够以编程方式编辑此响应 以便同一字
  • 设备锁定时在 Today 扩展中加载文件

    在我今天的设备解锁的扩展中 这行代码按预期工作 从图像路径返回数据 let imageData NSData contentsOfFile path 但是 当我的设备用密码锁定时 它返回零 当设备锁定时 有什么方法可以访问文件系统中的图像吗
  • 全局设置环境变量而无需重新启动Ubuntu

    我知道可以通过添加条目来设置系统范围的环境变量 etc environment or etc profile 但这需要系统重新启动或 X 重新启动 是否可以在 Ubuntu Linux 中设置环境变量 以便在系统范围内立即可用 而无需重新启
  • 使用 for 循环进行多个公司和多个日期的事件研究

    我正在进行一项事件研究evReturn函数从erer包裹 目的是获得每个公司的超常收益以及所有公司的平均超额收益 我无法获得平均回报 因为该函数对每个公司执行单独的执行 但不会同时对所有公司执行一次 尽管这可以通过 for 循环实现 我似乎
  • 屏幕方向更改时非法状态异常未创建视图

    我一直在尝试制作一个从活动 GradeListActivity 打开列表视图片段 GradeListFragment 的应用程序 当我单击某个项目时 它会打开一个新片段 GradeDetailFragment 如果处于纵向模式 它将替换fr
  • Lazarus:如何列出系统上所有可用的网络连接?

    我正在使用 Lazarus IDE 在 Linux 系统上编写程序 该程序应该连接到 Internet 或 Intranet 所以 我想向用户显示他们可以用来连接到互联网或内部网 如wifi 的所有可用网络连接的列表 如果系统上有两个活动网