gpt4 book ai didi

c++ - 如何以编程方式查找为 Linux 中的特定网络设备配置的 IP 地址/网络掩码/网关?

转载 作者:IT王子 更新时间:2023-10-29 00:15:34 36 4
gpt4 key购买 nike

我想写一段代码来检查每个网络设备(例如 eth0、lo、master 设备)有关该设备的一些统计信息和配置数据。
我可以在/sys/class/net/... 中找到统计数据(以及大部分配置数据),但是,我找不到任何 C/C++ API 或 procfs/sysfs 中列出 inet 地址的任何条目,网络掩码和网关。

我检查的一些替代方案:

  • 解析 ifconfig/route/一些其他实用程序的输出:我不想每次需要进行检查时都启动子进程。
  • 解析/etc/sysconfig/network-scripts/: 只会给我启动配置,而不是当前状态。

此外,由于此代码是为我工作场所的产品设计的,其中每个外部库都经过彻底检查(这意味着我将永远添加任何外部库)我更喜欢依赖 Linux native API 而不是外部库的解决方案.

谢谢!

最佳答案

确实使用了 ifreq 和 ioctl() 调用的结构,您可以获取所有接口(interface)信息:

手册页在这里 Ifreq manpage

/* local interface info */
typedef struct{
char *iface;
struct ether_addr hwa;
struct in_addr ipa;
struct in_addr bcast;
struct in_addr nmask;
u_short mtu;
} ifcfg_t;
/*
* Grabs local network interface information and stores in a ifcfg_t
* defined in network.h, returns 0 on success -1 on failure
*/
int get_local_info(int rsock, ifcfg_t *ifcfg)
{
struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE);
if((ioctl(rsock, SIOCGIFHWADDR, &ifr)) == -1){
perror("ioctl():");
return -1;
}
memcpy(&(ifcfg->hwa), &ifr.ifr_hwaddr.sa_data, 6);

memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE);
if((ioctl(rsock, SIOCGIFADDR, &ifr)) == -1){
perror("ioctl():");
return -1;
}
memcpy(&ifcfg->ipa, &(*(struct sockaddr_in *)&ifr.ifr_addr).sin_addr, 4);

memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE);
if((ioctl(rsock, SIOCGIFBRDADDR, &ifr)) == -1){
perror("ioctl():");
return -1;
}
memcpy(&ifcfg->bcast, &(*(struct sockaddr_in *)&ifr.ifr_broadaddr).sin_addr, 4);

memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE);
if((ioctl(rsock, SIOCGIFNETMASK, &ifr)) == -1){
perror("ioctl():");
return -1;
}
memcpy(&ifcfg->nmask.s_addr, &(*(struct sockaddr_in *)&ifr.ifr_netmask).sin_addr, 4);

memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifcfg->iface, IF_NAMESIZE);
if((ioctl(rsock, SIOCGIFMTU, &ifr)) == -1){
perror("ioctl():");
return -1;
}
ifcfg->mtu = ifr.ifr_mtu;

return 0;
}

快速编辑,这个函数在调用之前需要接口(interface)已经赋值,像这样:

strcpy(if_cfg->iface, iface)

确保你已经分配了内存,然后像这样调用

if((get_local_info(sock, if_cfg)) != 0){
printf("Unable to get network device info\n");
return -1;
}

关于c++ - 如何以编程方式查找为 Linux 中的特定网络设备配置的 IP 地址/网络掩码/网关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989419/

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