gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:18:00 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

编辑:要以编程方式执行此操作,您必须将函数 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中得到所有的接口(interface),请看struct ifreq的声明,以确定每个数组元素的长度和类型。我想从这里开始你可以单独继续,如果不行请告诉我。

关于linux - Lazarus:如何列出系统上所有可用的网络连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19932189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com