bluesnowly
驱动牛犊
驱动牛犊
  • 注册日期2004-10-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2186回复:2

在LINUX下如何写程序检测到网线被拔掉

楼主#
更多 发布于:2004-10-20 16:20
请问在只有一台主机和一个集线器连接的这种最简单的情况下。如何在LINUX下编程来判断网线是否被拔掉,网络是否连接。就像WINDOWS右下脚系统托盘里的那个小电脑图标一样。当网线一拔就显示网络断开。要能满足上述的最简单的情况。请哪位帮我解答一下。谢谢  

是否要和硬件联系才能做出来这种效果


monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-24 14:50
不知道你是在什么样的环境下去实现这个东西,说说的看法吧。
在Linux的网络源码中文件net/core/dev.c中包含了所有网卡设备管理的代码,也就是说网卡设备管理是在这里面实现的。对应的函数是:dev_open()和dev_close()你如果是修改内核,那么事情很简单。如果你是写应用程序可以使用ifconfig来进行字符串分析。
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
force_eagle
驱动小牛
驱动小牛
  • 注册日期2002-05-06
  • 最后登录2009-02-26
  • 粉丝0
  • 关注0
  • 积分387分
  • 威望61点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-27 17:06
linux下有个mii-tool的工具可以查看当前网卡的状态
主要是读网卡上的一个寄存器数据
我刚好有代码
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/ethtool.h>
#include <linux/sockios.h>

int DetectEthTool(int skfd, char *ifname)
{
struct ifreq ifr;
struct ethtool_value edata;

memset(&ifr, 0, sizeof(ifr));
edata.cmd = ETHTOOL_GLINK;

strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)-1);
ifr.ifr_data = (char *) &edata;

if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1)
{
printf(\"ETHTOOL_GLINK failed: %s\\n\", strerror(errno));
return 2;
}

return (edata.data ? 0 : 1);
}
int DetectMii(int skfd, char *ifname)
{
struct ifreq ifr;
unsigned short *data, mii_val;
unsigned phy_id;


strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0)
{
fprintf(stderr, \"SIOCGMIIPHY on %s failed: %s\\n\", ifname,
       strerror(errno));
(void) close(skfd);
return 2;
}

data = (unsigned short *)(&ifr.ifr_data);
phy_id = data[0];
data[1] = 1;


if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0)
{
fprintf(stderr, \"SIOCGMIIREG on %s failed: %s\\n\", ifr.ifr_name,
       strerror(errno));
return 2;
}

mii_val = data[3];

return(((mii_val & 0x0016) == 0x0004) ? 0 : 1);
}

int GetInterfaceStatus(const char * szIfName )
{
int fdIf = -1;
int iRet;

if (( fdIf = socket( AF_INET, SOCK_DGRAM, 0 ) ) < 0 )
{
perror(\"socket error\");
return -1;
}

iRet = DetectEthTool( fdIf, szIfName );


if (iRet == 2)
iRet = DetectMii(fdIf, szIfName);

close(fdIf);

if (iRet == 2)
{
printf(\"Could not determine status\\n\");
return -1;
}

return iRet;
} :D
游客

返回顶部