目录
1.说明
2.解析命令法:
2.1.CODE
2.2.TEST
3.SOCKET法
1.说明
此代码主要对Linux下网卡4种状态进行检测,可以检查:
- 网卡是否存在;
- 网卡是否down;
- 网卡UP,插了网线(RUNNING);
- 网卡UP,没有插网线
2.解析命令法:
2.1.CODE
#define BUFSIZ 256
/*check if_name status
*if not exist,return 0
*if exist and down,return 1
*if up and notlink,return 2
*if up and link, return 3
*/
int get_if_status(char *if_name)
{
char buffer[BUFSIZ];
char cmd[100];
FILE *read_fp;
int chars_read;
int ret =0;
memset( buffer, 0, BUFSIZ );
memset( cmd, 0, 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; /*if_name exist*/
}
else
{
fprintf(stderr, "%s: NO FOUND\r\n",if_name);
return 0; /*if_name not exist*/
}
}
if(ret == 1)
{
memset( buffer, 0, BUFSIZ );
memset( cmd, 0, 100 );
sprintf(cmd, "ifconfig | 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 = 2; /*if_name exist and up*/
}
else
{
fprintf(stderr, "%s: DOWN\r\n",if_name);
return 1; /*if_name exist but down*/
}
}
}
if(ret == 2)
{
memset( buffer, 0, BUFSIZ );
memset( cmd, 0, 100 );
sprintf(cmd, "ifconfig %s | grep RUNNING | awk '{print $3}'",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)
{
fprintf(stderr, "%s: LINKED\r\n",if_name);
return 3; /*if_name up and link*/
}
else
{
fprintf(stderr, "%s: UNPLUGGED\r\n",if_name);
return 2; /*if_name up and notlink*/
}
}
}
return -1;
}
int main(int argc, char* argv[])
{
int i=0;
if(argc != 2)
{
fprintf(stderr, "usage: %s ", argv[0]);
return -1;
}
i = get_if_status(argv[1]);
printf( "if_status = %d\n", i );
return 0;
}
2.2.TEST
# ./netlink eth100
eth100: NO FOUND
if_status = 0
#
# ifconfig eth0 down
# ./netlink eth0
eth0: DOWN
if_status = 1
#
# ifconfig eth0 up
# ./netlink eth0
eth0: UNPLUGGED
if_status = 2
#
# ./netlink eth0
eth0: LINKED
if_status = 3
3.SOCKET法
是通过socket解析网卡当前状态,来判断网卡是否存在。
实际实现过程是通过socket获取网卡的SIOCGIFFLAGS属性,判断其IFF_UP属性即可。
SIOCGIFFLAGS属性: