short get_flags(const char *dev)
{
struct ifreq ifr;
bzero((char *)&ifr, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
if (ioctl(ioctl_sockid,SIOCGIFFLAGS, (ch ...
很强大,熟悉内核就是不一样撒。 感谢楼上诸位朋友的建议,我这就按照你们的方案来测试下,谢谢:em02: 如果LZ不想采用轮询算法,可以通过netlink socket来实现. 原帖由 flw2 于 2008-6-27 18:37 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
short get_flags(const char *dev)
{
struct ifreq ifr;
bzero((char *)&ifr, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
if (ioctl(ioctl_sockid,SIOCGIFFLAGS, (ch ...
很强,又学习了一招
回复 #9 flw2 的帖子
:em02: 版主,我不知道你的那个函数是在哪里的,不知道头文件是什么的?能告诉一下吗?或者告诉我去哪找也行;谢谢 原帖由 qks5201314 于 2008-6-28 13:21 发表 http://linux.chinaunix.net/bbs/images/common/back.gif:em02: 版主,我不知道你的那个函数是在哪里的,不知道头文件是什么的?能告诉一下吗?或者告诉我去哪找也行;谢谢
应该是自己写的,熟悉内核协议栈后有感而发 哦,那你能给我解释下他做的那个函数里面的ioctl中的句柄以及其它一些的详细信息吗? 原帖由 qks5201314 于 2008-6-28 13:21 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
:em02: 版主,我不知道你的那个函数是在哪里的,不知道头文件是什么的?能告诉一下吗?或者告诉我去哪找也行;谢谢
ifconfig源码好像有,在net-tools包里:mrgreen:
//ifconfig.c
/* Fetch the inteface configuration from the kernel. */
static int
if_fetch(char *ifname, struct interface *ife)
{
struct ifreq ifr;
memset((char *) ife, 0, sizeof(struct interface));
strcpy(ife->name, ifname);
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) return(-1);
ife->flags = ifr.ifr_flags;
strcpy(ifr.ifr_name, ifname);
if (ioctl(inet_sock, SIOCGIFADDR, &ifr) < 0) {
memset(&ife->addr, 0, sizeof(struct sockaddr));
} else ife->addr = ifr.ifr_addr;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) {
memset(ife->hwaddr, 0, 32);
} else memcpy(ife->hwaddr,ifr.ifr_hwaddr.sa_data,8);
ife->type=ifr.ifr_hwaddr.sa_family;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) {
ife->metric = 0;
} else ife->metric = ifr.ifr_metric;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0) {
ife->mtu = 0;
} else ife->mtu = ifr.ifr_mtu;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
memset(&ife->map, 0, sizeof(struct ifmap));
} else memcpy(&ife->map,&ifr.ifr_map,sizeof(struct ifmap));
strcpy(ifr.ifr_name, ifname);
if (ioctl(inet_sock, SIOCGIFDSTADDR, &ifr) < 0) {
memset(&ife->dstaddr, 0, sizeof(struct sockaddr));
} else ife->dstaddr = ifr.ifr_dstaddr;
strcpy(ifr.ifr_name, ifname);
if (ioctl(inet_sock, SIOCGIFBRDADDR, &ifr) < 0) {
memset(&ife->broadaddr, 0, sizeof(struct sockaddr));
} else ife->broadaddr = ifr.ifr_broadaddr;
strcpy(ifr.ifr_name, ifname);
if (ioctl(inet_sock, SIOCGIFNETMASK, &ifr) < 0) {
memset(&ife->netmask, 0, sizeof(struct sockaddr));
} else ife->netmask = ifr.ifr_netmask;
[ 本帖最后由 贺兰云天 于 2008-6-28 14:47 编辑 ] 原帖由 dragchan 于 2008-6-28 10:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
如果LZ不想采用轮询算法,可以通过netlink socket来实现.
给大家贴一个吧
我知道设备状态改变了可以产生事件,但是没有用过 thank you very much :em11: