linux 监测网线插拔状态

简介

在数据传输过程中出现网络偶然间断开的情况,考虑是否为网线接触不良。因此写一个程序监测网络的硬件状态。

程序的主要原理是参考ifconfig命令。当网线连接时执行ifconfig命令会打印“RUNING”字符串。当网线断开时则不会打印。参考ifconfig的源码实现了如下代码。

代码会将网络状态写入当前文件夹下的net.txt文件中。

代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int net_detect(char* net_name)
{
    int skfd = 0;
    struct ifreq ifr;
    time_t timep;
    time (&timep);
    char* cur_time = asctime(gmtime(&timep));
    cur_time[strlen(cur_time) - 1] = 0; //去掉尾部的换行符

    skfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(skfd < 0)
    {
        printf("%s ",cur_time);
        perror("Open socket error!");
        return -1;
    }

    strcpy(ifr.ifr_name, net_name);

    if(ioctl(skfd, SIOCGIFFLAGS, &ifr) <0 )
    {
        perror("IOCTL error!");
        printf("Maybe ethernet inferface %s is not valid!\n", ifr.ifr_name);
        close(skfd);
        return -1;
    }

    FILE *fp = NULL;
    fp = fopen("./net.txt","a");
    if (!fp)
    {
        perror("file open failed!");
        return -2;
    }
    //判断是否存在IFF_RUNNING标志
    if(ifr.ifr_flags & IFF_RUNNING)
    {
        fprintf(fp,"%s :: %s is running ^_^\n", cur_time, ifr.ifr_name);
    }
    else
    {
        fprintf(fp,"%s :: %s is not running ---------\n", cur_time, ifr.ifr_name);
        printf("%s :: %s is not running ---------\n", cur_time, ifr.ifr_name);
    }

    close(skfd);
    fclose(fp);

    return 0;
}

void handle_sigINT(int num)
{
    printf("signal: kill %d (Ctrl + C). Stop running! \n ",num);
    exit(1);
}

void msleep(long t)
{
    usleep(t*1000);
}

int main(int argc, char** argv)
{
    if (argc < 2)
    {
        printf("Usage: ./NetMonitor netName [...time(ms)]\n");
        return -1;
    }

    int time = 1000;
    if (argc == 3)
        time = atoi(argv[2]);
//重定向输出流时,程序结束才会写入,需要捕获Ctrl + C信号
//  signal(SIGINT,handle_sigINT);

    while(1)
    {
        net_detect(argv[1]);
        msleep(time);
    }
    return 0;
}

参考链接:linux获取网线插拔状态的实现

你可能感兴趣的:(linux)