微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用C代码来获取与ifconfig相同的信息

有没有办法在Linux中使用C代码获取“ifconfig eth0”将返回的相同信息? 我对IP地址,链接状态和MAC地址等东西感兴趣。

以下是ifconfig输出示例:

eth0 Link encap:Ethernet HWaddr 00:0F:20:CF:8B:42 inet addr:217.149.127.10 Bcast:217.149.127.63 Mask:255.255.255.192 UP broADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2472694671 errors:1 dropped:0 overruns:0 frame:0 TX packets:44641779 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1761467179 (1679.8 Mb) TX bytes:2870928587 (2737.9 Mb) Interrupt:28

如何在wxListCtrl中上下移动项目(wxwidgets)

什么是当前gcc的认C模式(特别是在Ubuntu上)?

C ++ Libzip + remove =核心转储

适用于Linux Java Swing应用程序的Kiosk模式

刷新stream缓冲区时读/ proc

在C ++上的套接字协议缓冲区

LoadLibrary失败,错误代码为193

通过序列化支持的单例类

用于制作GUI的C ++库

使用netlink API设置无线信道

是的, ifconfig本身是用C编写的。:)请参阅: http : //cvsweb.netbsd.org/bsdweb.cgi/src/sbin/ifconfig/ifconfig.c? ifconfig x- cvsweb-标记

man netdevice看到的细节(在Linux上)。 您使用ioctl()系统调用

解决这个问题的一个方法,特别是在你没有资源的情况下,是非常不利的 。

它给你一个你传递的任何程序所做的所有系统调用的列表,以及它们的参数和返回值。 如果你的程序只是转储一些信息并退出,而不是长时间运行,那么在你看到的所有系统调用中,只要做一个人,看起来就像他们可能提供你正在寻找的信息一样简单。

当我跑步

strace ifconfig

一些有趣的电话是:

open("/proc/net/dev",O_RDONLY) = 6

其次是一堆ioctls,佐证@ payne的答案:

ioctl(5,SIocgIFFLAGS,{ifr_name="eth0",ifr_flags=IFF_UP|IFF_broADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0 ioctl(5,SIocgIFHWADDR,ifr_hwaddr=84:2b:2b:b7:9e:6d}) = 0 ioctl(5,SIocgIFMETRIC,ifr_metric=0}) = 0 ioctl(5,SIocgIFMTU,ifr_mtu=1500}) = 0

这里是我的代码中如何获得MAC和MTU:

void getMACAddress(std::string _iface,unsigned char MAC[6]) { int fd = socket(AF_INET,SOCK_DGRAM,0); struct ifreq ifr; ifr.ifr_addr.sa_family = AF_INET; strncpy(ifr.ifr_name,_iface.c_str(),IFNAMSIZ-1); ioctl(fd,&ifr); for(unsigned int i=0;i<6;i++) MAC[i] = ifr.ifr_hwaddr.sa_data[i]; ioctl(fd,&ifr); close(fd); printf("MTU: %dn",ifr.ifr_mtu); printf("MAC:%.2x:%.2x:%.2x:%.2x:%.2x:%.2xn",MAC[0],MAC[1],MAC[2],MAC[3],MAC[4],MAC[5]); }

一个简单的方法是使用popen函数,请参阅: http : //pubs.opengroup.org/onlinepubs/009696899/functions/popen.html

使用类似于:

FILE *fp; char returnData[64]; fp = popen("/sbin/ifconfig eth0","r"); while (fgets(returnData,64,fp) != NULL) { printf("%s",returnData); } pclose(fp);

一个更简单的方法。 复制自http://man7.org/linux/man-pages/man3/getifaddrs.3.html

#include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <ifaddrs.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/if_link.h> int main(int argc,char *argv[]) { struct ifaddrs *ifaddr,*ifa; int family,s,n; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } /* Walk through linked list,maintaining head pointer so we can free list later */ for (ifa = ifaddr,n = 0; ifa != NULL; ifa = ifa->ifa_next,n++) { if (ifa->ifa_addr == NULL) continue; family = ifa->ifa_addr->sa_family; /* display interface name and family (including symbolic form of the latter for the common families) */ printf("%-8s %s (%d)n",ifa->ifa_name,(family == AF_PACKET) ? "AF_PACKET" : (family == AF_INET) ? "AF_INET" : (family == AF_INET6) ? "AF_INET6" : "???",family); /* For an AF_INET* interface address,display the address */ if (family == AF_INET || family == AF_INET6) { s = getnameinfo(ifa->ifa_addr,(family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6),host,NI_MAXHOST,NULL,NI_NUMERICHOST); if (s != 0) { printf("getnameinfo() Failed: %sn",gai_strerror(s)); exit(EXIT_FAILURE); } printf("ttaddress: <%s>n",host); } else if (family == AF_PACKET && ifa->ifa_data != NULL) { struct rtnl_link_stats *stats = (struct rtnl_link_stats *)ifa->ifa_data; printf("tttx_packets = %10u; rx_packets = %10un" "tttx_bytes = %10u; rx_bytes = %10un",stats->tx_packets,stats->rx_packets,stats->tx_bytes,stats->rx_bytes); } } freeifaddrs(ifaddr); exit(EXIT_SUCCESS); }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐