阅读:2185回复:2
在LINUX下如何写程序检测到网线被拔掉
请问在只有一台主机和一个集线器连接的这种最简单的情况下。如何在LINUX下编程来判断网线是否被拔掉,网络是否连接。就像WINDOWS右下脚系统托盘里的那个小电脑图标一样。当网线一拔就显示网络断开。要能满足上述的最简单的情况。请哪位帮我解答一下。谢谢
是否要和硬件联系才能做出来这种效果 |
|
沙发#
发布于:2004-10-24 14:50
不知道你是在什么样的环境下去实现这个东西,说说的看法吧。
在Linux的网络源码中文件net/core/dev.c中包含了所有网卡设备管理的代码,也就是说网卡设备管理是在这里面实现的。对应的函数是:dev_open()和dev_close()你如果是修改内核,那么事情很简单。如果你是写应用程序可以使用ifconfig来进行字符串分析。 |
|
|
板凳#
发布于: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 |
|