【转】Linux下获取第一个网络接口名称的函数实现
2011-04-08 11:44
429 查看
原文:http://www.linuxdiyf.com/bbs/thread-104036-1-1.html
以下代码摘自开源程序--------iftop
/* This is a list of interface name prefixes which are `bad' in the sense
* that they don't refer to interfaces of external type on which we are
* likely to want to listen. We also compare candidate interfaces to lo. */
static char *bad_interface_names[] = {
"lo:",
"lo",
"stf", /* pseudo-device 6to4 tunnel interface */
"gif", /* psuedo-device generic tunnel interface */
"dummy",
"vmnet",
NULL /* last entry must be NULL */
};
static int is_bad_interface_name(char *i) {
char **p;
for (p = bad_interface_names; *p; ++p)
if (strncmp(i, *p, strlen(*p)) == 0)
return 1;
return 0;
}
/* This finds the first interface which is up and is not the loopback
* interface or one of the interface types listed in bad_interface_names. */
static char *get_first_interface(void) {
struct if_nameindex * nameindex;
char *i = NULL;
int j = 0;
/* Use if_nameindex(3) instead? */
nameindex = if_nameindex();
if(nameindex == NULL) {
return NULL;
}
while(nameindex[j].if_index != 0) {
if (strcmp(nameindex[j].if_name, "lo") != 0 && !is_bad_interface_name(nameindex[j].if_name)) {
i = xstrdup(nameindex[j].if_name);
break;
}
j++;
}
if_freenameindex(nameindex);
return i;
}
补充说明:
struct if_nameindex
这个变量用于存储单个网络界面的信息,其中具有两个元素:
unsigned int if_index:界面序号
char *if_name:用null结尾的界面名称
struct if_nameindex *if_nameindex(void);
返回一个struct if_nameindex列表,其中存储了所有界面的信息,最后一个if_nameindex的if_index序号为零,if_name为null
此函数得到的结果必需用if_freenameindex函数清除
void if_freenameindex(struct if_nameindex *ptr);
清除if_nameindex得到的结果
以下代码摘自开源程序--------iftop
/* This is a list of interface name prefixes which are `bad' in the sense
* that they don't refer to interfaces of external type on which we are
* likely to want to listen. We also compare candidate interfaces to lo. */
static char *bad_interface_names[] = {
"lo:",
"lo",
"stf", /* pseudo-device 6to4 tunnel interface */
"gif", /* psuedo-device generic tunnel interface */
"dummy",
"vmnet",
NULL /* last entry must be NULL */
};
static int is_bad_interface_name(char *i) {
char **p;
for (p = bad_interface_names; *p; ++p)
if (strncmp(i, *p, strlen(*p)) == 0)
return 1;
return 0;
}
/* This finds the first interface which is up and is not the loopback
* interface or one of the interface types listed in bad_interface_names. */
static char *get_first_interface(void) {
struct if_nameindex * nameindex;
char *i = NULL;
int j = 0;
/* Use if_nameindex(3) instead? */
nameindex = if_nameindex();
if(nameindex == NULL) {
return NULL;
}
while(nameindex[j].if_index != 0) {
if (strcmp(nameindex[j].if_name, "lo") != 0 && !is_bad_interface_name(nameindex[j].if_name)) {
i = xstrdup(nameindex[j].if_name);
break;
}
j++;
}
if_freenameindex(nameindex);
return i;
}
补充说明:
struct if_nameindex
这个变量用于存储单个网络界面的信息,其中具有两个元素:
unsigned int if_index:界面序号
char *if_name:用null结尾的界面名称
struct if_nameindex *if_nameindex(void);
返回一个struct if_nameindex列表,其中存储了所有界面的信息,最后一个if_nameindex的if_index序号为零,if_name为null
此函数得到的结果必需用if_freenameindex函数清除
void if_freenameindex(struct if_nameindex *ptr);
清除if_nameindex得到的结果
相关文章推荐
- Linux下获取第一个网络接口名称的函数实现
- Linux工具开发[01]---网络协议中常见编码的原理及其解码函数的实现
- COM实现系统SENS接口获取网络断开事件
- MFC自动获取网络地址函数实现----广播地址,网关,子网掩码
- linux网络编程之System V 消息队列:消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数
- 用C/C++实现linux下检测网络接口状态
- 用c/c++实现linux下检测网络接口状态
- 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
- 用c/c++实现linux下检测网络接口状态
- 用c/c++实现linux下检测网络接口状态
- linux系统使用python监测网络接口获取网络的输入输出
- 20、在Linux中实现类似windows中获取配置文件的函数GetProfileString
- Linux获取网络接口信息
- linux获取网络信息函数
- 获取实现接口的的第一个泛型实例工具类
- Linux下Wireshark普通用户不能获取网络接口问题
- linux网络---select 函数 实现I/0复用
- 用c/c++实现linux下检测网络接口状态
- linux下获取网络流量的实现方法
- 在Linux中实现类似windows中获取配置文 件的函数GetProfileString