linux 下获取当前网络连接状态的两种方法
2013-12-21 10:16
831 查看
转自http://blog.csdn.net/suer0101/article/details/8313173
#include <linux/sockios.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <linux/if.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */ typedef enum { IFSTATUS_UP, IFSTATUS_DOWN, IFSTATUS_ERR } interface_status_t; typedef signed int u32; /* for passing single values */ struct ethtool_value { u32 cmd; u32 data; }; interface_status_t interface_detect_beat_ethtool(int fd, char *iface) { struct ifreq ifr; struct ethtool_value edata; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name)-1); edata.cmd = ETHTOOL_GLINK; ifr.ifr_data = (caddr_t) &edata; if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) { perror("ETHTOOL_GLINK failed "); return IFSTATUS_ERR; } return edata.data ? IFSTATUS_UP : IFSTATUS_DOWN; } int main (int argc, char *argv[]) { FILE *fp; interface_status_t status; char buf[512] = {'\0'}; char hw_name[10] = {'\0'}; char *token = NULL; /* 获取网卡名称 */ if ((fp = fopen("/proc/net/dev", "r")) != NULL) { while (fgets(buf, sizeof(buf), fp) != NULL) { if(strstr(buf, "eth") != NULL) { token = strtok(buf, ":"); while (*token == ' ') ++token; strncpy(hw_name, token, strlen(token)); } } } fclose(fp); //方法一:查看一个文件文件,相对来说比较简单 #if 1 char carrier_path[512] = {'\0'}; memset(buf, 0, sizeof(buf)); snprintf(carrier_path, sizeof(carrier_path), "/sys/class/net/%s/carrier", hw_name); if ((fp = fopen(carrier_path, "r")) != NULL) { while (fgets(buf, sizeof(buf), fp) != NULL) { if (buf[0] == '0') { status = IFSTATUS_DOWN; } else { status = IFSTATUS_UP; } } } else { perror("Open carrier "); } fclose(fp); #endif //方法二:用函数吧!有点复杂,但是也是一种有效的办法 #if 1 int fd; if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket "); exit(0); } status = interface_detect_beat_ethtool(fd, hw_name); close(fd); #endif switch (status) { case IFSTATUS_UP: printf("%s : link up\n", hw_name); break; case IFSTATUS_DOWN: printf("%s : link down\n", hw_name); break; default: printf("Detect Error\n"); break; } return 0; }
相关文章推荐
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态
- iOS 获取当前网络状态的两种方法
- iOS 两种方法获取当前网络状态
- ios获取当前的网络状态, 获取当前连接的wifi名字
- 使用JS在浏览器中判断当前网络连接状态的几种方法
- ios获取当前的网络状态, 获取当前连接的wifi名字
- 使用JS在浏览器中判断当前网络连接状态的几种方法
- ios获取当前的网络状态, 获取当前连接的wifi名字
- 安卓网络连接全解:包括网络连接状态的监听、网络数据使用状态的监听、获取当前网络连接情况、启动wifi、获取当前连接wifi的网络情况、扫描wifi热点
- 朝花夕拾-android 获取当前手机的内存卡状态和网络连接状态
- Visual Basic.net 检测网络连接状态的两种方法
- 通过Python在windows和linux中获取当前网络IP地址的一些方法
- Android获取当前的网络连接信息和网络链接状态 GPRS 和 WiFi网络