qks5201314 发表于 2008-06-28 15:13

18楼的朋友,你可以把整个源码都贴出来吗?我不知道里面的ioctl中的句柄参数是怎么来的了?没办法调用,请帮帮忙了,谢谢

贺兰云天 发表于 2008-06-28 15:38

看看设置混杂模式的那个代码或者
google net-tools看看:mrgreen:

qks5201314 发表于 2008-06-28 16:23

恩,我用上午版主贴的改了个程序,编译可以通过了,还没测试看不可以呢,不管怎么样,都得谢谢朋友们的热情帮助了;:em02:

NewCore 发表于 2008-06-28 18:57

不错,正好会用到。。。

dragchan 发表于 2008-06-28 19:55

原帖由 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()
{
&nbsp;&nbsp;&nbsp;&nbsp;int sockfd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);

&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_nl nladdr = { AF_NETLINK, 0, 0, RTNLGRP_LINK };
&nbsp;&nbsp;&nbsp;&nbsp;bind(sockfd, (struct sockaddr *)&nladdr,sizeof(nladdr));

&nbsp;&nbsp;&nbsp;&nbsp;char buf[4096];
&nbsp;&nbsp;&nbsp;&nbsp;while (1) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int len = read(sockfd, buf, sizeof(buf));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct nlmsghdr *nh = (struct nlmsghdr *)buf;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (; NLMSG_OK(nh, len); nh = NLMSG_NEXT(nh, len)) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (nh->nlmsg_type == RTM_NEWLINK) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct ifinfomsg *ifinfo = NLMSG_DATA(nh);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("carrier is %s\n", (ifinfo->ifi_flags & IFF_RUNNING) ? "on" : "off");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}

qks5201314 发表于 2008-06-28 22:41

楼上,小弟佩服您的才学,只不过这些底层的东西我不怎么理解的,我想暂时还是先用版主的那个方案吧,谢谢了;

flw2 发表于 2008-06-29 12:08

回复 #26 qks5201314 的帖子

dragchan 的代码更好,因为不用忙查询

jerrymy 发表于 2008-06-30 08:36

强贴。过来学习,:lol:

qks5201314 发表于 2008-06-30 08:39

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的信息;现在我用这个程序进行测试发现插不插网线都返回成功,不知道什么原因引起的?

qks5201314 发表于 2008-06-30 08:55

版主,不好意思,问题出在程序里面,现在在解决了,我暂时就采用这个方案吧,我觉得检测速度够快的了;感谢诸位高手的帮忙:em02:
页: 1 2 [3] 4
查看完整版本: 如何知道设备是否插网线