gpt4 book ai didi

c - 类似于旧 glibc 版本的 getifaddrs

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:04 31 4
gpt4 key购买 nike

有一个非常有用的函数调用 getifaddrs 可以检索所有机器网络地址。问题是我使用的是没有此功能的旧 glibc 版本。有什么替代品吗?我一直在寻找并找到了 getipnodebyname 但本地址未映射到/etc/hosts 文件中时它是无用的。

最佳答案

为了补充前面的答案,这里有一个 SIOCGIFCONF 方法的例子。你必须做这样的事情:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>

int fd;

int get_iface_list(struct ifconf *ifconf)
{
int rval;
if((rval = ioctl(fd, SIOCGIFCONF , (char*) ifconf )) < 0 )
perror("ioctl(SIOGIFCONF)");

return rval;
}

int main()
{
static struct ifreq ifreqs[100];
static struct ifconf ifc;
char *ptr;

fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
return 1;

ifc.ifc_buf = (char*) (ifreqs);
ifc.ifc_len = sizeof(ifreqs);

if(get_iface_list(&ifc) < 0) return -1;

/* Go through the list of interfaces */
for (ptr = ifc.ifc_buf; ptr < ifc.ifc_buf + ifc.ifc_len;)
{
struct ifreq *ifr = (struct ifreq*)ptr;
int len = (sizeof(struct sockaddr) > ifr->ifr_addr.sa_len) ?
sizeof(struct sockaddr) : ifr->ifr_addr.sa_len;

ptr += sizeof(ifr->ifr_name) + len;

/* Do what you need with the ifr-structure.
* ifr->ifr_addr contains either sockaddr_dl,
* sockaddr_in or sockaddr_in6 depending on
* what addresses and L2 protocols the interface
* has associated in it.
*/
}

close(fd);
return 0;
}

当然有一些陷阱。根据 Unix 网络编程章节 17.6 ioctl(fd, SIOCGIFCONF, array) 如果参数中指向的数组太小,则在某些平台上可能不会返回错误。然后数据将被连接起来。解决此问题的唯一方法是在循环中调用 ioctl(),直到在增加数组大小的同时两次获得相同的结果长度。当然,因为现在是 2012 年,我不确定这还有什么意义。

ifreqs 数组的大小在这种情况下纯粹是一种猜测。请记住,该数组将为与接口(interface)关联的每个 L2 和 L3 地址包含一个 struct ifreq。例如,假设您也有 IPv6 地址,对于 lo-interface 您将获得三个条目:ethernet、IPv4 和 IPv6。因此预留足够的空间或应用kludge。

要获取广播地址和其他附加信息,您需要在循环中额外调用 ioctl()。当然,所有可能的选项都取决于您的操作系统提供的内容。

有关更多信息,我建议阅读 W. Richard Stevens 的 Unix Network Programming。这是关于这个主题最全面的书。

关于c - 类似于旧 glibc 版本的 getifaddrs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10173420/

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