linux 下获取当前网络连接状态
来源:互联网 发布:ubuntu 花屏 编辑:程序博客网 时间:2024/05/21 14: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;
- }
注:第一种方法适用于2.6内核以后的版本,第二中方法适用于2.4及以前的版本,2.4及之前的版本没有/sys/class/net/%s/carrier这个目录
阅读全文
0 0
- linux 下获取当前网络连接状态
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- linux 下获取当前网络连接状态的两种方法
- 获取当前网络状态
- 获取网络连接状态
- 监测当前网络连接状态
- ios获取当前的网络状态, 获取当前连接的wifi名字
- ios获取当前的网络状态, 获取当前连接的wifi名字
- ios获取当前的网络状态, 获取当前连接的wifi名字
- Linux服务器当前各种TCP网络连接状态的统计
- Linux服务器当前各种TCP网络连接状态的统计
- Linux环境下获取网卡连接状态
- 开始整理学习笔记啦~~~
- Python把csv中的数据整合成多条json数据插入列表的脚本
- 使用pdf.js不依赖任何activeX控件
- Qt 实现的一个生产者消费者模式类
- Fresco、Glide与Picasso的区别
- linux 下获取当前网络连接状态
- nodejs入门(03)-回调函数
- 第7章 矩阵
- 机器学习10大算法优缺点
- “fatal error LNK1561: 必须定义入口点”解决方法
- Codeforces Round #218 (Div. 2) E. Subway Innovation(思维 前缀和)
- React Native unable to load script from assets index.android.bundle on windows
- smartctl
- 初学数据库