思路:

  1、socket 建立一个数据报套接字。

2、定义一个struct ifreq ifr 结构体。将网络名称如“eth0” 赋值给ifr结构体的ifr.ifr_name。

3、调用ioctl(sockfd, SIOCGIFFLAGS, &ifr) 获取网络标识。

如需设置网络标识,更改ifr结构体调用ioctl(sockfd, SIOCSIFFLAGS, &ifr) 进行设置。

4、比对网络标识来确定网络是否正在运行。ifr.ifr_ifru.ifru_flags &IFF_RUNNING。

int GetNetStatus(const char *ifname)
{
struct ifreq ifr;
int sockfd; if((sockfd = Socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("socket create error!\n");
return - 1;
} memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifname, IFNAMSIZ); if(ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0)
{
Close(sockfd);
return - 1;
}
Close(sockfd);
if(ifr.ifr_ifru.ifru_flags &IFF_RUNNING)
{
return 1;
}
else
{
return 0;
} }

struct ifreq 结构体的详细介绍可参考。

struct ifreq学习和实例 - 走看看 (zoukankan.com)

这个结构定义在/usr/include/net/if.h,用来配置和获取ip地址,掩码,MTU等接口信息的。

/* Interface request structure used for socket ioctl's. All interface
ioctl's must have parameter definitions which begin with ifr_name.
The remainder may be interface specific. */

struct ifreq
{
# define IFHWADDRLEN 6
# define IFNAMSIZ IF_NAMESIZE
union
{
char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */
} ifr_ifrn;

union
{
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
short int ifru_flags;
int ifru_ivalue;
int ifru_mtu;
struct ifmap ifru_map;
char ifru_slave[IFNAMSIZ]; /* Just fits the size */
char ifru_newname[IFNAMSIZ];
__caddr_t ifru_data;
} ifr_ifru;
};
# define ifr_name ifr_ifrn.ifrn_name /* interface name */
# define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
# define ifr_addr ifr_ifru.ifru_addr /* address */
# define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
# define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
# define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
# define ifr_flags ifr_ifru.ifru_flags /* flags */
# define ifr_metric ifr_ifru.ifru_ivalue /* metric */
# define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
# define ifr_map ifr_ifru.ifru_map /* device map */
# define ifr_slave ifr_ifru.ifru_slave /* slave device */
# define ifr_data ifr_ifru.ifru_data /* for use by interface */
# define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
# define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */
# define ifr_qlen ifr_ifru.ifru_ivalue /* queue length */
# define ifr_newname ifr_ifru.ifru_newname /* New name */
# define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
# define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
# define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)

实例一,获取网卡的IP地址:
#include &lt;string.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;sys/ioctl.h&gt;
#include &lt;net/if.h&gt;
#include &lt;stdio.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
int main()
{
int inet_sock;
struct ifreq ifr;
inet_sock = socket(AF_INET, SOCK_DGRAM, 0);

strcpy(ifr.ifr_name, "eth0");
//SIOCGIFADDR标志代表获取接口地址
if (ioctl(inet_sock, SIOCGIFADDR, &amp;ifr) &lt; 0)
perror("ioctl");
printf("%s
", inet_ntoa(((struct sockaddr_in*)&amp;(ifr.ifr_addr))-&gt;sin_addr));
return 0;
}
实例二,实现简单ifconfig功能:
/**
* file getifstat.c
* author wzj
* rief 访问这个struct ifconf 修改,查询状态
* version
*
ote
* date: 2012年08月11日星期六22:55:25
*/
#include &lt;net/if.h&gt; /* for ifconf */
#include &lt;linux/sockios.h&gt; /* for net status mask */
#include &lt;netinet/in.h&gt; /* for sockaddr_in */
#include &lt;sys/socket.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/ioctl.h&gt;
#include &lt;stdio.h&gt;

#define MAX_INTERFACE (16)

void port_status(unsigned int flags);

/* set == 0: do clean , set == 1: do set! */
int set_if_flags(char *pif_name, int sock, int status, int set)
{
struct ifreq ifr;
int ret = 0;

strncpy(ifr.ifr_name, pif_name, strlen(pif_name) + 1);
ret = ioctl(sock, SIOCGIFFLAGS, &amp;ifr);
if(ret)
return -1;
/* set or clean */
if(set)
ifr.ifr_flags |= status;
else
ifr.ifr_flags &amp;= ~status;
/* set flags */
ret = ioctl(sock, SIOCSIFFLAGS, &amp;ifr);
if(ret)
return -1;

return 0;
}

int get_if_info(int fd)
{
struct ifreq buf[MAX_INTERFACE];
struct ifconf ifc;
int ret = 0;
int if_num = 0;

ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = (caddr_t) buf;

ret = ioctl(fd, SIOCGIFCONF, (char*)&amp;ifc);
if(ret)
{
printf("get if config info failed");
return -1;
}
/* 网口总数 ifc.ifc_len 应该是一个出入参数 */
if_num = ifc.ifc_len/sizeof(struct ifreq);
printf("interface num is interface = %d
", if_num);
while(if_num-- &gt; 0)
{
printf("net device: %s
", buf[if_num].ifr_name);
/* 获取第n个网口信息 */
ret = ioctl(fd, SIOCGIFFLAGS, (char*)&amp;buf[if_num]);
if(ret)
continue;

/* 获取网口状态 */
port_status(buf[if_num].ifr_flags);

/* 获取当前网卡的ip地址 */
ret = ioctl(fd, SIOCGIFADDR, (char*)&amp;buf[if_num]);
if(ret)
continue;
printf("IP address is:
%s
", inet_ntoa(((struct sockaddr_in *)(&amp;buf[if_num].ifr_addr))-&gt;sin_addr));

/* 获取当前网卡的mac */
ret = ioctl(fd, SIOCGIFHWADDR, (char*)&amp;buf[if_num]);
if(ret)
continue;

printf("%02x:%02x:%02x:%02x:%02x:%02x

",
(unsigned char)buf[if_num].ifr_hwaddr.sa_data[0],
(unsigned char)buf[if_num].ifr_hwaddr.sa_data[1],
(unsigned char)buf[if_num].ifr_hwaddr.sa_data[2],
(unsigned char)buf[if_num].ifr_hwaddr.sa_data[3],
(unsigned char)buf[if_num].ifr_hwaddr.sa_data[4],
(unsigned char)buf[if_num].ifr_hwaddr.sa_data[5]
);
}
}

void port_status(unsigned int flags)
{
if(flags &amp; IFF_UP)
{
printf("is up
");
}
if(flags &amp; IFF_BROADCAST)
{
printf("is broadcast
");
}
if(flags &amp; IFF_LOOPBACK)
{
printf("is loop back
");
}
if(flags &amp; IFF_POINTOPOINT)
{
printf("is point to point
");
}
if(flags &amp; IFF_RUNNING)
{
printf("is running
");
}
if(flags &amp; IFF_PROMISC)
{
printf("is promisc
");
}
}

int main()
{
int fd;

fd = socket(AF_INET, SOCK_DGRAM, 0);
if(fd &gt; 0)
{
get_if_info(fd);
close(fd);
}

return 0;
}
运行结果:
interface num is interface = 2
net device: eth0
is up
is broadcast
is running
IP address is:
192.168.100.200
54:be:f7:33:57:26
net device: lo
is up
is loop back
is running
IP address is:
127.0.0.1
00:00:00:00:00:00
参考转载博客地址:
http://blog.csdn.net/dsg333/article/details/7525634
http://blog.csdn.net/kulung/article/details/6442597
http://blog.csdn.net/joker0910/article/details/7855998

Linux c 检测当前网卡是否已经启动的更多相关文章

  1. (笔记)Linux下检测网卡与网线连接状态

    http://blog.chinaunix.net/space.php?uid=20357359&do=blog&cuid=1798479 Linux下检测网卡与网线连接状态,使用io ...

  2. linux本地检测tomcat是否启动成功

    @参考文章 原文如下: linux本地检测如何tomcat是否启动成功? 解决方法: 1.curl 127.0.0.1:8080 第一可以知道本地是否可以访问tomcat,返回页面代码 2.tail ...

  3. linux下安装编译网卡驱动的方法

    安装linux操作系统后发现没有网卡驱动,表现为 system → Administration → Network下Hardware列表为空. 以下为安装编译网卡驱动的过程,本人是菜鸟,以下是我从网 ...

  4. Linux网络管理之多网卡绑定

    一.bonding介绍 在企业Linux服务器管理里中,服务器的可靠性.可用性以及I/O速度都非常重要,保持服务器的高可用和安全性是生产环境的重要指标,其中最重要的一点是服务器网络连接的高可用性.通常 ...

  5. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s  ...

  6. Linux 入侵检测小结

    Linux  入侵检测小结 0x00 审计命令 在linux中有5个用于审计的命令: last:这个命令可用于查看我们系统的成功登录.关机.重启等情况:这个命令就是将/var/log/wtmp文件格式 ...

  7. Linux 操作系统下为网卡配置ip

    Linux操作系统下为网卡配置ip by:授客 QQ:1033553122 1.   Linux单一网卡设置多IP的配置方法 在Linux下网卡接口逻辑名被称为eth0,eth1,eth2,..... ...

  8. Linux中实现多网卡绑定总结

    在Linux中实现多网卡绑定 一.原理介绍: 1.什么是bonding? Linux bonding 驱动提供了一个把多个网络接口设备捆绑为单个的网络接口设置来使用.用于网络负载均衡及网络冗余: Li ...

  9. Linux 服务器下多网卡的负载均衡

    Linux 服务器下多网卡负载均衡的实现   一.引言    现今几乎各行各业内部都建立了自己的服务器,由于服务器的特殊地位,它的可靠性.可用性及其 I/O 速度就显得非常的重要, 保持服务器的高可用 ...

随机推荐

  1. Jedis测试redis。(redis在linux虚拟机中)

    文章目录 1.确保虚拟机开启.并且连接到redis 2.建立一个maven工程 3.在pom中加入jedis的依赖 4.编写测试用例 5.测试结果 1.确保虚拟机开启.并且连接到redis 2.建立一 ...

  2. Codeforces 1670 E. Hemose on the Tree

    题意 给你个数p,n = 2^p: 有一棵树有n个节点,告诉你怎么连边: 每个点有个权值,每条边也有个权值,权值需要自行分配,[1,2,3..n...2n-1],总共2n-1个权值: 你需要选一个节点 ...

  3. JAVA的File对象

    文件 1.File对象 java封装的一个操作文件及文件夹(目录)的对象.可以操作磁盘上的任何一个文件和文件夹. 2.创建文件  方式一:根据路径构建一个File对象new File(path) // ...

  4. android_studio 使用

    android studio安装 目前使用: android studio 4.1.3 Zip免安装版:android-studio-ide-201.7199119-windows413.zip an ...

  5. AR Engine光照估计能力,让虚拟物体在现实世界更具真实感

    AR是一项现实增强技术,即在视觉层面上实现虚拟物体和现实世界的深度融合,打造沉浸式AR交互体验.而想要增强虚拟物体与现实世界的融合效果,光照估计则是关键能力之一. 人们所看到的世界外观,都是由光和物质 ...

  6. day01-Tomcat框架分析

    引入课程和Maven 1.Maven maven中央仓库:Maven Repository: Search/Browse/Explore (mvnrepository.com) maven仓库是国外的 ...

  7. C++初阶(运算符重载汇总+实例)

    运算重载符 概念: 运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似. 函数原型: 返回值 operator操作符(参数列表) 注意: ...

  8. mindxdl---common---db_handler.go

    // Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common this file ...

  9. 【云原生 · Kubernetes】部署Kubernetes集群

    [云原生 · Kubernetes]搭建Harbor仓库 接着上次的内容,后续来了! 在master节点执行脚本k8s_master_install.sh即可完成K8S集群的部署,具体步骤参考如下(1 ...

  10. Base64 学习

    base64是什么 Base64,就是包括小写字母a-z,大写字母A-Z,数字0-9,符号"+" "/ "一共64个字符的字符集,(另加一个"=&qu ...