gpt4 book ai didi

c - 枚举分配给网络接口(interface)的每个 IP 地址

转载 作者:IT王子 更新时间:2023-10-29 00:56:44 24 4
gpt4 key购买 nike

我认为没有办法仅使用套接字来枚举我系统上的每个网络接口(interface)及其分配的 IP 地址。这是正确的吗?

我的意思是,在 Linux 中这可能是:

eth0: 192.168.1.5
wlan0: 192.168.0.5
lo: 127.0.0.1

我不关心接口(interface)名称,只关心分配的 IP 地址。

我记得过去曾在 Windows 中使用 Win32 完成过此操作(虽然我不记得如何)。但是有没有一种方法可以以便携的方式做到这一点?

最佳答案

这是一个好的开始:

#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <stdio.h>
void
print_sockaddr(struct sockaddr* addr,const char *name)
{
char addrbuf[128] ;

addrbuf[0] = 0;
if(addr->sa_family == AF_UNSPEC)
return;
switch(addr->sa_family) {
case AF_INET:
inet_ntop(addr->sa_family,&((struct sockaddr_in*)addr)->sin_addr,addrbuf,sizeof(addrbuf));
break;
case AF_INET6:
inet_ntop(addr->sa_family,&((struct sockaddr_in6*)addr)->sin6_addr,addrbuf,sizeof(addrbuf));
break;
default:
sprintf(addrbuf,"Unknown (%d)",(int)addr->sa_family);
break;

}
printf("%-16s %s\n",name,addrbuf);
}

void
print_ifaddr(struct ifaddrs *addr)
{
char addrbuf[128] ;

addrbuf[0] = 0;
printf("%-16s %s\n","Name",addr->ifa_name);
if(addr->ifa_addr != NULL)
print_sockaddr(addr->ifa_addr,"Address");
if(addr->ifa_netmask != NULL)
print_sockaddr(addr->ifa_netmask,"Netmask");
if(addr->ifa_broadaddr != NULL)
print_sockaddr(addr->ifa_broadaddr,"Broadcast addr.");
if(addr->ifa_dstaddr != NULL)
print_sockaddr(addr->ifa_dstaddr,"Peer addr.");
puts("");
}

int main(int argc,char *argv[])
{
struct ifaddrs *addrs,*tmp;

if(getifaddrs(&addrs) != 0) {
perror("getifaddrs");
return 1;
}
for(tmp = addrs; tmp ; tmp = tmp->ifa_next) {
print_ifaddr(tmp);
}

freeifaddrs(addrs);

return 0;
}

关于c - 枚举分配给网络接口(interface)的每个 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3909656/

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