恋夏寒 发表于 2008-06-30 10:20

mark :lol::lol::lol::lol::lol::lol:

ljily000 发表于 2008-06-30 23:21

mii-tools   有些类似

波西米亚狂想曲 发表于 2008-07-02 23:14

厉害,又学了一招~~

Scorpioo 发表于 2008-07-06 20:38

我用两位的方法都试了,但是拔掉网线后 ifr_flags 一直没有变化,不知道是不是我写的有问题
LZ 当时碰到总是插不插网线都返回成功是什问题呀?

用虚拟机和实际机器都试过,get_flags 传入的是"eth0"


short get_flags(const char *dev)
{
      int fd;
      struct ifreq ifr;
      
      fd = socket(PF_UNIX, SOCK_STREAM, 0);

      bzero((char *)&ifr, sizeof(ifr));
      strcpy(ifr.ifr_name, dev);
      
      if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) {
                return 0;
      }      
      
      close(fd);
      
      return (ifr.ifr_flags);
}

kumbayaco 发表于 2008-07-07 14:09

竟然碰到跟我一样的问题。
转个某被转过n次的帖子。

/* Check network adapter is up or down */
// Note: one or two adapter drivers may be not support this method
// exemple: based virtual machine

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <linux/types.h>
#include <unistd.h>

const char* VERSION = "0.6.0.48 --maintain by isnowran";

struct mii_data
{
    __u16 phy_id;
    __u16 reg_num;
    __u16 val_in;
    __u16 val_out;
};

void *
thr_detect_link(void *arg)
{
    int        skfd = 0;
    int        old_state = -1, cur_state = 1;
    struct ifreq ifr;
    struct mii_data *mii = NULL;

    if ( (skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
      perror("socket");
      return (void*)1;
   }

    bzero(&ifr, sizeof(ifr));
    strncpy(ifr.ifr_name, (char*)arg, IFNAMSIZ - 1);
    ifr.ifr_name = 0;
    if( ioctl( skfd, SIOCGMIIPHY, &ifr ) < 0 )
    {
      perror( "ioctl" );
      return (void*)2;
    }

    mii = (struct mii_data*)&ifr.ifr_data;
    mii->reg_num = 0x01;
    while(1) {
      if( ioctl( skfd, SIOCGMIIREG, &ifr ) < 0 )
      {
            perror( "ioctl2" );
            return (void*)3;
      }
            cur_state = mii->val_out & 0x0004;
      if (cur_state != old_state) {
            old_state = cur_state;
            printf(old_state?"UP\n":"DOWN\n");
      }
      sleep(2);
    }
    close(skfd);
    return (void*)0;        
}

int main( int argc, char* argv[] )
{
    pthread_t   tid;
    if( argc != 2 )
    {
      printf( "Version: %s\n", VERSION );
      printf( "Useage: argv ethNO.\n" );
      return 0;
    }

    if (pthread_create(&tid, NULL, thr_detect_link, argv) != 0) {
      perror("pthread_create");
    }
    printf("ok\n");
    pthread_exit(NULL); //return 0;
}

qks5201314 发表于 2008-08-04 12:29

请问楼上两位的问题后来解决了没,小弟现在换了一块电路板,上电后不管是否插了网线,软件检测的结果都是插网线的,不知道是什么原因?:oops:

maluyao 发表于 2008-08-04 13:03

其实NetworkManager服务就是干这事的。

qks5201314 发表于 2008-08-04 13:53

回复 #25 dragchan 的帖子

朋友,我用你的源码上去测试了一下,好像不能检测到设备是否插网线吧,不管我的设备是否插了网线,软件都进入不了FOR循环,您帮忙分析下是什么原因引起的吗?

McZoden 发表于 2013-02-05 11:50

回复 9# flw2

受用,不尽感激

   
页: 1 2 3 [4]
查看完整版本: 如何知道设备是否插网线