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);
} 竟然碰到跟我一样的问题。
转个某被转过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;
} 请问楼上两位的问题后来解决了没,小弟现在换了一块电路板,上电后不管是否插了网线,软件检测的结果都是插网线的,不知道是什么原因?:oops: 其实NetworkManager服务就是干这事的。
回复 #25 dragchan 的帖子
朋友,我用你的源码上去测试了一下,好像不能检测到设备是否插网线吧,不管我的设备是否插了网线,软件都进入不了FOR循环,您帮忙分析下是什么原因引起的吗? 回复 9# flw2受用,不尽感激