您的位置:首页 > 理论基础 > 计算机网络

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: