【发布时间】:2011-02-08 19:41:53
【问题描述】:
我正在尝试轮询网络设备名称。我是从各种 sn-ps 拼凑出来的,
- http://unixhelp.ed.ac.uk/CGI/man-cgi?netdevice+7
- http://lists.apple.com/archives/Unix-porting/2002/Apr/msg00134.html
- http://ubuntuforums.org/showthread.php?t=1421487
但我的输出只是胡言乱语。
#include <stdio.h>
#include <stdlib.h>
#include <net/route.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#define BUFLEN 1024
#define SEQ 9999
int main (int argc, const char* argv[])
{
// File descriptor for socket
int socketfd;
struct ifconf conf;
struct ifreq req[10];
struct ifreq *ifr;
printf("Opening socket...");
socketfd = socket(AF_ROUTE, SOCK_RAW, 0);
if (socketfd >= 0) {
printf(" OK\n");
conf.ifc_len = sizeof(req);
conf.ifc_buf = (__caddr_t) req;
ioctl(socketfd,SIOCGIFCONF,&conf);
printf("Discovering interfaces...\n");
int i;
for (i=0; i<conf.ifc_len/sizeof(req[0]); i++) {
ifr = &conf.ifc_req[i];
printf("%d. %s\n", i+1, req[i].ifr_name);
}
}
else {
printf("Failed!\n");
}
return 0;
}
输出:
Opening socket... OK
Discovering interfaces...
?u???}??Gh???
2. p?9}?
3.
4. v?=?n??u?`?y??]g?<?~?v??
5.
6.
7.
8. ?v?T?
9. ?|?mw??j??v??h??|??v?T00~??v?$?|??|?@
10. T00~??v?$?|??|?@
我尝试将 ifr_name 数组的每个字符一个接一个地输出,以查看它们是否以 null 结尾,但这并没有太大变化。我的程序的每次迭代都会输出不同的东西,所以这让我认为我引用了一些错误的东西。有人可以向我提供一些关于我可能做错了什么的见解吗?
【问题讨论】:
-
你没有检查 ioctl() 的返回值。可能是 EOPNOTSUPP,这就是缓冲区中的值没有任何意义的原因。
标签: c linux networking