要写个检测网络接口链接状态的东西,又不喜欢不断的ping别的地址,也不想调用其他命令行工具来做这个,于是在google了n多内容未果之后,搜刮到个检测工具的源代码,从里面抠出来一块儿就ok了,版权不是我的哦,哈哈……主要根据eth-tool进行的。还下载了一个简单的ethlist程序。
以下代码在fedora 9 / CentOS 5.2下调试通过:)
struct ifreq {
charifr_name[IFNAMSIZ]; /* interface name, e.g., "le0 " */
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
intifru_metric;
caddr_t ifru_data;//typedef void *caddr_t;
} ifr_ifru;
};
网络编程时,套接口ioctl函数的参数struct ifreq定义在哪个文件里?有什么作用?
/usr/include/net/if.h
用来配置ip地址,激活接口,配置MTU等接口信息的。
linux系统中建议使用netlink接口替代
兄弟,很多人不回帖是因为这个问题问的有些那个,
不知道你是不是学网络编程的。送你俩建议:
UNP Ed3 VOL1一定要随时放在手边。
/usr/include目录下以及其子目录 sys/ net/ netinet/ linux 的文件希望你
没事就去翻,就当挖宝一样。总有很多让你兴奋的东西。
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <errno.h>
#include <net/if.h>
struct ethtool_value {
__uint32_t cmd;
__uint32_t data;
};
int main(int argc, char *argv[])
{
struct ethtool_value edata;
int fd = -1, err = 0;
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, "eth0");
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
perror("Cannot get control socket");
return 70;
}
edata.cmd = 0x0000000a;//command is Get link status
ifr.ifr_data = (caddr_t)&edata;
err = ioctl(fd, 0x8946, &ifr);//0X8946是个ioctl命令
if (err == 0) {
fprintf(stdout, "Link detected: %s\n",
edata.data ? "yes":"no");
} else if (errno != EOPNOTSUPP) {
perror("Cannot get link status");
}
return 0;
}
本文来自CSDN博客,转载请标明出处:/21bird/archive//11/21/3345459.aspx