LINUX获取网络状态
来源:互联网 发布:21天学通java txt 编辑:程序博客网 时间:2024/06/05 01:50
- #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;
- }
0 0
- LINUX获取网络状态
- linux 下获取当前网络连接状态
- 获取网络状态
- 获取网络状态
- 获取网络状态
- 获取网络状态
- Android获取网络状态
- Android获取网络状态
- Runtime获取网络状态
- android 获取网络状态
- Android 获取网络状态
- 获取手机网络状态
- 获取当前网络状态
- 获取网络状态
- runtime 获取网络状态
- 获取网络状态
- 获取网络链接状态
- 获取网络状态
- Opengl ES IBO(索引缓冲区) VBO(顶点缓冲区)创建一个立方体
- Android性能调优之内存篇
- HDU 3530Subsequence(单调队列维护)
- dubbo循环依赖的解决
- Python 学习笔记之语法(一)
- LINUX获取网络状态
- 关于 Xcode 自己设置的可复用的 代码片段 Code Snippets
- [LeetCode][Java] Path Sum
- 欢迎使用CSDN-markdown编辑器
- ShellShock 攻击实验
- 脑法之一 --- DEBUG与搜索算法
- POJ 2482 Stars in Your Window(扫描线)
- 转C#中的Finalize,Dispose,SuppressFinalize
- ROS进阶学习手记 5 -- 使用Eclipse开发robot_cleaner