版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎与我交流:[email protected] https://blog.csdn.net/baidu_33850454/article/details/82631948
简介
在数据传输过程中出现网络偶然间断开的情况,考虑是否为网线接触不良。因此写一个程序监测网络的硬件状态。
程序的主要原理是参考ifconfig
命令。当网线连接时执行ifconfig
命令会打印“RUNING
”字符串。当网线断开时则不会打印。参考ifconfig的源码实现了如下代码。
代码会将网络状态写入当前文件夹下的net.txt
文件中。
代码
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <stdlib.h>
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获取网线插拔状态的实现