免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5067 | 回复: 8
打印 上一主题 下一主题

求助:用户空间 怎么异步获得网线插拔事件通知 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-20 14:34 |只看该作者 |倒序浏览
网线插拔,不是网卡。

google了许多,找到的都是轮询的方式。

如果用轮询的方式,占用资源太高,而且网线插拔发生的几率不高,所以用轮询的话不太好。

不知道是否有类似阻塞或者事件的方式来实现这个功能

论坛徽章:
0
2 [报告]
发表于 2008-06-20 18:56 |只看该作者
能否参考usb的hotplug呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-06-20 19:01 |只看该作者
应该有办法的吧。
实在不行就用土办法,反正我至少想到了一个土办法。

论坛徽章:
0
4 [报告]
发表于 2008-06-20 22:06 |只看该作者
原帖由 kumbayaco 于 2008-6-20 14:34 发表
网线插拔,不是网卡。

google了许多,找到的都是轮询的方式。

如果用轮询的方式,占用资源太高,而且网线插拔发生的几率不高,所以用轮询的话不太好。

不知道是否有类似阻塞或者事件的方式来实现这个功能


改造一下你的系统,添加你需要的功能,缺点是只能自己内部用了.

论坛徽章:
0
5 [报告]
发表于 2008-06-23 11:36 |只看该作者
原帖由 new_learner 于 2008-6-20 18:56 发表
能否参考usb的hotplug呢?


一开始我也想到这个,后来看了看lddd的hotplug那部分,突然想起网线插拔应该不能算是热插拔事件吧

原帖由 flw 于 2008-6-20 19:01 发表
应该有办法的吧。
实在不行就用土办法,反正我至少想到了一个土办法。


土办法?发心跳包么。不知道这个占用资源会不会比较高。
可以通过select的等待异常出现来实现吗?

原帖由 system888net 于 2008-6-20 22:06 发表


改造一下你的系统,添加你需要的功能,缺点是只能自己内部用了.


这个,没看太明白。- -|

论坛徽章:
0
6 [报告]
发表于 2008-06-23 12:03 |只看该作者
以下代码我也是从cu上拷贝,我在我的linux上测试通过.




/* 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>

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

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

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

&nbsp;&nbsp;&nbsp;&nbsp;int skfd = 0;
&nbsp;&nbsp;&nbsp;&nbsp;if( ( skfd = socket( AF_INET, SOCK_DGRAM, 0 ) ) < 0 )
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror( "socket" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;struct ifreq ifr;
&nbsp;&nbsp;&nbsp;&nbsp;bzero( &ifr, sizeof( ifr ) );
&nbsp;&nbsp;&nbsp;&nbsp;strncpy( ifr.ifr_name, argv[1], IFNAMSIZ - 1 );
&nbsp;&nbsp;&nbsp;&nbsp;ifr.ifr_name[IFNAMSIZ - 1] = 0;
&nbsp;&nbsp;&nbsp;&nbsp;if( ioctl( skfd, SIOCGMIIPHY, &ifr ) < 0 )
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror( "ioctl" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;struct mii_data* mii = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;mii = (struct mii_data*)&ifr.ifr_data;
&nbsp;&nbsp;&nbsp;&nbsp;mii->reg_num = 0x01;
&nbsp;&nbsp;&nbsp;&nbsp;if( ioctl( skfd, SIOCGMIIREG, &ifr ) < 0 )
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror( "ioctl2" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if( mii->val_out & 0x0004 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( "Linkup\n" );
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( "Linkdown\n" );
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;close( skfd );
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
7 [报告]
发表于 2008-06-23 12:41 |只看该作者
原帖由 yulc 于 2008-6-23 12:03 发表
以下代码我也是从cu上拷贝,我在我的linux上测试通过.




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

// exemple: based virtu ...


这个代码我也看过,运行一次,判断一次。如果需要实时监控的话,有更好的方案吗?

论坛徽章:
0
8 [报告]
发表于 2008-06-23 13:00 |只看该作者
你的实时要求很高吗?我能想到的办法就是专门起一个线程轮询,不然你改造网卡驱动,让它去轮询

论坛徽章:
0
9 [报告]
发表于 2008-06-23 13:51 |只看该作者
原帖由 lipingtababa 于 2008-6-23 13:00 发表
你的实时要求很高吗?我能想到的办法就是专门起一个线程轮询,不然你改造网卡驱动,让它去轮询


实时要求,应该感觉就跟windows下面的那个网络状态显示差不多。
再研究研究
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP