C# · 12月 19, 2021

C语言实现linux网卡检测改进版

C语言+shell 实现linux网卡状态检测和C语言实现linux网卡连接检测 2文的方法各有缺陷,比如有些系统执行ifconfig需要root权限,要不就不支持ioctl(fd,SIOCGMIIPHY,&ifr)这样的操作。以下给出了C语言实现linux网卡连接检测 的改进版实现与C语言+shell 实现linux网卡状态检测 同样的功能。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int cshell_netlink_status(char *if_name)

{

char buffer[BUFSIZ];

char cmd[100];

FILE *read_fp;

int chars_read;

int ret =0;

memset( buffer,BUFSIZ );

memset( cmd,100 );

sprintf(cmd,”ifconfig -a | grep %s”,if_name);

read_fp = popen(cmd,”r”);

if ( read_fp != NULL )

{

chars_read = fread(buffer,sizeof(char),BUFSIZ-1,read_fp);

pclose(read_fp);

if (chars_read > 0)

{

ret = 1;

}

else

{

fprintf(stderr,”DEVICE_NONErn”);

return 0;

}

}

if(ret == 1)

{

memset( buffer,”ifconfig |grep %s”,read_fp);

pclose(read_fp);

if (chars_read > 0)

{

ret = 2;

}

else

{

fprintf(stderr,”DEVICE_DOWNrn”);

return 1;

}

}

}

if(ret == 2)

{

memset( buffer,”ifconfig %s | grep RUNNING | awk ‘{print $3}'”,read_fp);

pclose(read_fp);

if (chars_read > 0)

{

fprintf(stderr,”DEVICE_LINKEDrn”);

return 3;

}

else

{

fprintf(stderr,”DEVICE_UNPLUGGEDrn”);

return 2;

}

}

}

return -1;

}

int c_netlink_status(const char *if_name )

{

int fd = -1;

struct ifreq ifr;

struct ifconf ifc;

struct ifreq ifrs_buf[100];

int if_number =0;

int i;

if ((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0)

{

fprintf(stderr,”%s: socket error [%d] %srn”,if_name,errno,strerror(errno));

close(fd);

return -1;

}

ifc.ifc_len = sizeof(ifrs_buf);

ifc.ifc_buf = (caddr_t)ifrs_buf;

if (ioctl(fd,SIOCGIFCONF,(char *)&ifc) <0)

{

fprintf(stderr,”%s: ioctl SIOCGIFCONF error [%d] %srn”,strerror(errno));

close(fd);

return -1;

}

if_number = ifc.ifc_len / sizeof(struct ifreq);

for(i=0; i< if_number; i++)

{

if(strcmp(if_name,ifrs_buf[i].ifr_name ) == 0)

{

break;

}

}

if(i >= if_number)

{

close(fd);

fprintf(stderr,”DEVICE_NONErn”);

return 0;

}

bzero(&ifr,sizeof(ifr));

strncpy(ifr.ifr_name,IFNAMSIZ-1);

ifr.ifr_name[IFNAMSIZ-1] = 0;

if (ioctl(fd,SIOCGIFFLAGS,(char *)&ifr) <0)

{

fprintf(stderr,”%s: ioctl SIOCGIFFLAGS error [%d] %srn”,strerror(errno));

close(fd);

return -1;

}

#if 1

if(!(ifr.ifr_flags & IFF_UP))

{

close(fd);

fprintf(stderr,”DEVICE_DOWNrn”);

return 1;

}

if(!(ifr.ifr_flags & IFF_RUNNING))

{

close(fd);

fprintf(stderr,”DEVICE_UNPLUGGEDrn”);

return 2 ;

}

fprintf(stderr,”DEVICE_LINKEDrn”);

return 3;

#else

{

struct ethtool_value edata;

if(!(ifr.ifr_flags & IFF_UP) || !(ifr.ifr_flags & IFF_RUNNING))

{

close(fd);

fprintf(stderr,”%s: DOWNrn”,if_name);

return 1;

}

edata.cmd = ETHTOOL_GLINK;

edata.data = 0;

ifr.ifr_data = (char *) &edata;

if(ioctl( fd,SIOCETHTOOL,&ifr ) < 0)

{

fprintf(stderr,”%s: ioctl SIOCETHTOOL error [%d] %srn”,strerror(errno));

close(fd);

return -1;

}

if(edata.data == 0)

{

fprintf(stderr,”DEVICE_UNPLUGGEDrn”);

return 2;

}

else

{

fprintf(stderr,”DEVICE_LINKEDrn”);

return 3;

}

}

#endif

}

int main(int argc,char* argv[])

{

int i=0;

if(argc != 2)

{

fprintf(stderr,”usage: %s rn”,argv[0]);

return -1;

}

i = cshell_netlink_status(argv[1]);

printf( “cshell_netlink_status if_status = %dn”,i );

i = c_netlink_status(argv[1]);

printf( “c_netlink_status if_status = %dn”,i );

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。