google net-tools看看:mrgreen: 恩,我用上午版主贴的改了个程序,编译可以通过了,还没测试看不可以呢,不管怎么样,都得谢谢朋友们的热情帮助了;:em02: 不错,正好会用到。。。 原帖由 flw2 于 2008-6-28 14:54 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
原帖由 dragchan 于 2008-6-28 10:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
如果LZ不想采用轮询算法,可以通过netlink socket来实现.
给大家贴一个吧
我知道设备状态改变了可以产生事件,但是没有用过
#include <stdio.h>
#include <sys/socket.h>
#include <linux/rtnetlink.h>
#include <linux/if.h>
int main()
{
int sockfd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
struct sockaddr_nl nladdr = { AF_NETLINK, 0, 0, RTNLGRP_LINK };
bind(sockfd, (struct sockaddr *)&nladdr,sizeof(nladdr));
char buf[4096];
while (1) {
int len = read(sockfd, buf, sizeof(buf));
struct nlmsghdr *nh = (struct nlmsghdr *)buf;
for (; NLMSG_OK(nh, len); nh = NLMSG_NEXT(nh, len)) {
if (nh->nlmsg_type == RTM_NEWLINK) {
struct ifinfomsg *ifinfo = NLMSG_DATA(nh);
printf("carrier is %s\n", (ifinfo->ifi_flags & IFF_RUNNING) ? "on" : "off");
}
}
}
}
楼上,小弟佩服您的才学,只不过这些底层的东西我不怎么理解的,我想暂时还是先用版主的那个方案吧,谢谢了;
回复 #26 qks5201314 的帖子
dragchan 的代码更好,因为不用忙查询 强贴。过来学习,:lol: short get_flags(const char *dev){
struct ifreq ifr;
bzero((char *)&ifr, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
tSock = socket(PF_INET,SOCK_STREAM,0);
if (tSock < 0)
{
perror(": create socket.");
return(0);
}
if (ioctl(tSock,SIOCGIFFLAGS, (char *)&ifr) < 0){
close(tSock);
return(0);
}
close(tSock);
return(ifr.ifr_flags);
}
unsigned char connect_cont;
/*********************************************************/
//测试eth0连线线程
/*********************************************************/
void * tstCard(void *t)
{
sleep(3);
connect_cont = 0;
while(1)
{
if ((get_flags("eth0")) == 0)
{
connect_cont = 0;
perror("wire not exist");
}else{
if(++connect_cont > 200) connect_cont = 1;
printf("wire exist\n");
sleep(3);
}
usleep(10000);
}
return t;
}
版主,这是我模仿您上次贴的那段代码写的网线是否插在设备上的检测程序,帮忙看下有什么参数不对的没,我的设备只有一个网卡,
平时用ifconfig可以查到关于eth0的信息;现在我用这个程序进行测试发现插不插网线都返回成功,不知道什么原因引起的? 版主,不好意思,问题出在程序里面,现在在解决了,我暂时就采用这个方案吧,我觉得检测速度够快的了;感谢诸位高手的帮忙:em02: