LINUX获取网络状态
2015-07-21 10:17
295 查看
#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;
}
#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;
}
相关文章推荐
- 使用Paros监控iPhone发出的HTTP请求
- python--httplib模块使用
- Parse 教程:网络后台基础
- window7下 HTTP 错误 500.19 - Internal Server Error 错误解决方法 集锦iis7
- 黑马程序员——Java学习总结:多线程和网络编程
- http中的Content-Type
- Apache Web Server -> httpd 的虚拟主机的配置
- 网络安全发草案出炉 CHINASSL构建网络信息安全2.0时代
- ASP.Net核心对象之HttpResponse
- Http和Socket区别
- Java网络编程之TCP通信
- Java网络编程之TCP通信
- HTTP 隧道 (HTTP代理Socket客户) (转)
- Java网络编程之TCP通信
- 网络带宽实时监控工具bmon
- SQL Server 2005 Express tcp/ip远程访问设置
- 《unix网络编程》读书笔记——(一)套接字地址结构
- Android Day05-网络编程之文件下载之多线程断点续传技术
- Android Day05-网络编程之文件上传
- 网络IO之阻塞、非阻塞、同步、异步总结