Linux网络接口操作之if_nameindex

2023-11-09

系统信息

操作系统:

# lsb_release -ir
Distributor ID:    CentOS
Release:           6.7

内核版本:

# uname -r
2.6.32-573.26.1.el6.x86_64

gcc版本:

# gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

glibc版本:

# ldd $(which ls)
    linux-vdso.so.1 =>  (0x00007ffc14d08000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b2ec00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003b2e400000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003b2fc00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x0000003b36000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003b2d400000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003b2dc00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003b2d000000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b2d800000)
    libattr.so.1 => /lib64/libattr.so.1 (0x0000003b2f800000)
    
# /lib64/libc.so.6
GNU C Library stable release version 2.12, by Roland McGrath et al.
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.7 20120313 (Red Hat 4.4.7-16).
Compiled on a Linux 2.6.32 system on 2016-02-16.
Available extensions:
    The C stubs add-on version 2.1.2.
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    BIND-8.2.3-T5B
    RT using linux kernel aio
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.

函数定义

#include <net/if.h>

unsigned if_nametoindex(const char *ifname);
char *if_indextoname(unsigned ifindex, char *ifname);
struct if_nameindex *if_nameindex(void);
void if_freenameindex(struct if_nameindex *ptr);

if_nametoindex():指定网络接口名称字符串作为参数;若该接口存在,则返回相应的索引,否则返回0

if_indextoname():指定网络接口索引以及一块长度至少为IF_NAMESIZE(16)字节的内存区域作为参数;若索引对应的网络接口存在,则在内存区域中返回该接口的名称字符串,否则返回NULL,并将errno设置为相应的值

if_nameindex():返回动态分配的struct if_nameindex结构数组,数组中的每一个元素分别对应一个本地网络接口;struct if_nameindex结构的if_index字段为接口索引,if_name字段为接口名称字符串;索引为0且名称字符串为NULL表示结构数组的末尾;调用出错时,返回NULL,并将errno设置为相应的值

if_freenameindex():通过if_nameindex()获取完毕接口名称与索引后,调用该函数以释放动态分配的内存区域

以上4个函数在系统的man文档中都可以查看相应的描述,且都是POSIX标准支持的,Linux内核可能未实现这些函数,或已实现但不同于POSIX标准
这些函数的原型声明与定义并未出现在CentOS 6.7的定制内核2.6.32-573.26.1.el6.x86_64以及原版内核2.6.32.5中,而是由系统的glibc-2.12实现:在glibc-2.12.2源码树中,函数的原型声明位于sysdeps/gnu/net/if.h与sysdeps/generic/net/if.h,函数的定义位于sysdeps/unix/sysv/linux/if_index.c中,本质上是对ioctl(2)的SIOCGIFNAME,SIOCGIFCONF,SIOCGIFINDEX等操作以及netlink套接字进行了封装

示例程序

1. if_name_index.c

#include <stdio.h>
#include <stdlib.h>
#include <net/if.h>
    
int main(void)
{
    struct if_nameindex *head, *ifni;
    ifni = if_nameindex();
    head = ifni;
    
    if (head == NULL) {
        perror("if_nameindex()");
        exit(EXIT_FAILURE);
    }   
    
    while (ifni->if_index != 0) {
        printf("Interfece %d : %s\n", ifni->if_index, ifni->if_name);
        ifni++;
    }   
    
    if_freenameindex(head);
    head = NULL;
    ifni = NULL;
    
    exit(EXIT_SUCCESS);
}

编译并运行

# gcc if_name_index.c -o if_name_index
# ./if_name_index 
Interfece 1 : lo
Interfece 2 : eth0
Interfece 3 : eth1    

2. if_index_to_name.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <net/if.h>

int main(int argc, char *argv[])
{
    if (argc != 2) {
        fprintf(stderr, "Usage: %s [interface index]\n", argv[0]);
        exit(EXIT_FAILURE);
    }   

    int saved_errno = errno;
    char if_name[IFNAMSIZ] = {'\0'};
    unsigned int if_index = (unsigned int )atoi(argv[1]);

    char *name = if_indextoname(if_index, if_name);
    if (name == NULL && errno == ENXIO) {
        fprintf(stderr, "Index %d : No such device\n", if_index);
        exit(EXIT_FAILURE); 
    } 
    
    errno = saved_errno;  

    printf("Index %d : %s\n", if_index, if_name);

    exit(EXIT_SUCCESS);
}

编译并运行

# gcc if_index_to_name.c -o if_index_to_name
# ./if_index_to_name
Usage: ./if_index_to_name [interface index]
# ./if_index_to_name 1
Index 1 : lo
# ./if_index_to_name 2
Index 2 : eth0
# ./if_index_to_name 3
Index 3 : eth1
# ./if_index_to_name 4
Index 4 : No such device

3. if_name_to_index.c

#include <stdio.h>
#include <stdlib.h>
#include <net/if.h>

int main(int argc, char *argv[])
{
    if (argc != 2) {
        fprintf(stderr, "Usage: %s [interface name]\n", argv[0]);
        exit(EXIT_FAILURE);
    }   

    unsigned int if_index;
    if_index = if_nametoindex(argv[1]);
    if (if_index == 0) {
        fprintf(stderr, "Interface %s : No such device\n", argv[1]);
        exit(EXIT_FAILURE);
    }   

    printf("Interface %s : %d\n", argv[1], if_index);   

    exit(EXIT_SUCCESS);
}

编译并运行

# gcc if_name_to_index.c -o if_name_to_index
# ./if_name_to_index eth0
Interface eth0 : 2
# ./if_name_to_index eth3
Interface eth3 : No such device

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux网络接口操作之if_nameindex 的相关文章

  • 终端连接控制(stty的编写)

    终端连接控制 stty的编写 一 背景 文件与目录在之前已经学习过了 文件中包含着数据 这些数据可以被读出 写入 也可以用以操作 但文件不仅仅是计算机唯一的数据来源 计算机的数据还可以来自于许多的外部设备 比如扫描仪 照相机 鼠标等输入设备
  • Linux系统的安装(在VM虚拟机上安装CentOS 7)

    工具准备 物理计算机一台 配置要求 操作系统 win10 64位 大家基本上都是 硬盘可用容量 20G以上 内存容量 4G以上 虚拟机安装包 VMware workstation full 12 5 下载链接 点我下载 提取码 9gha C
  • unix环境高级编程——文件IO

    本期主题 unix环境高级编程 文件IO 文件IO 0 引言 1 文件描述符 2 IO编程中常用的API接口 1 open函数 2 close函数 3 read函数 4 write函数 5 lseek函数 3 函数sync fsync和fd
  • 掉电无法启动数据库问题解决

    由于突然掉电 造成客户在windows平台上10 2 0 1数据库无法驱动 以下是具体解决步骤 一 定位故障问题 1 启动数据库 查看错误 SQL gt startup ora 01113 file 1 needs media recove
  • mapengpeng1999@163.com 操作系统4~处理机调度

    处理机调度 1 三级调度体系 1 处理机调度主要是对处理机运行时间进行分配 即 按照一定算法或策略 将处理机运行时间分配给各个并发进程 同时尽量提高处理机的使用效率 2 现代操作系统中 按调度所实现的功能分3种类型 高级调度 中级调度和低级
  • 虚拟内存的最大容量与实际容量区别

    虚拟内存的最大容量与实际容量区别 1 概念介绍 虚拟内存的最大容量是计算机的地址结构 CPU寻址范围决定的 虚拟内存的实际容量是内存与外存之和 CPU寻址范围 两者的最小值 2 例题介绍 某计算机的地址结构是64位 按字节编址 内存大小51
  • pycharm内存不足时如何修改设置?

    Help gt Find Action gt type VM Options gt Click Edit Custom VM Options Pycharm 2016 2 will open the appropriate vmoption
  • Client-Server问题

    1 实验内容与要求 需要创建客户Client和服务器Server两个进程 它们通过管道进行通信 Client进程派生3个生产者线程 一个管道线程 共享一个20个slots的缓冲区 每个生产者线程随机产生一个数据 打印出来自己的id 进程 线
  • Linux,Network manager 导致节点异常重启

    推断是Network manager 导致的 原因待查今天在VmWare的虚拟机上装了个测试RAC 又遇到了一个摸不到头绪的问题CRS装好后 一旦登陆图形界面 节点就重启 事情就有这么巧不登陆图形界面 观察了1个小时没问题 一旦登陆后 立刻
  • 操作系统 段页式存储管理

    一 引入 分页系统是以页面作为内存分配的基本单位 能有效地提高内存利用率 但信息共享等不方便 分段系统是以段作为内存分配的基本单位 它能够更好地满足用户多方面的需要 信息共享 动态链接等 但采用分区方式管理物理内存 仍然存在碎片问题 段页式
  • Linux alien命令

    一 简介 alien是一个用于在各种不同的Linux包格式相互转换的工具 其最常见的用法是将 rpm转换成 deb 或者反过来 二 安装 http toutiao com a6188997768449360129 三 实例 http www
  • 通过源码包*.src.rpm定制开发rpm

    为什么80 的码农都做不了架构师 gt gt gt 1 基本流程 1 下载 安装相应的src rpm包 wget xxx src rpm rpm ivh xxx src rpm 这里的 安装 是指把xxx src rpm中的tar gz p
  • 使用inet_ntop转换IPv6地址时在macOS和linux上的行为不一样

    下面这段python代码在macOS和linux时运行的结果是不同的 import socket ip socket inet pton socket AF INET6 1 2 3 0 5 6 7 8 print socket inet n
  • 【操作系统】王道考研 p42 段页式管理方式

    段页式管理方式 知识总览 分段 分页管理方式中最大的优缺点 关于段式管理会产生外部碎片 ps 分段管理中产生的外部碎片也可以用 紧凑 来解决 只是需要付出较大的时间代价 分段 分页 段页式管理 示意图 先分段 后分页 段页式管理的逻辑地址结
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • CentOS Linux服务器安全设置

    转自 http www osyunwei com archives 754 html 引言 我们必须明白 最小的权限 最少的服务 最大的安全 所以 无论是配置任何服务器 我们都必须把不用的服务关闭 把系统权限设置到最小话 这样才能保证服务器
  • MacOS中清除原有ssh公钥方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 用ssh的跳转登录服务器后 ssh会把你每个你访问过计算机的公钥 public key 都记录在 ssh known hosts 当下次访问相同计算机时 SSH会核对公钥
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • Linux(12):磁盘配额(Quota)与进阶文件系统管理

    磁盘配额 Quota 的应用与实作 Quota 的一般用途 针对 www server 例如 每个人的网页空间的容量限制 针对 mail server 例如 每个人的邮件空间限制 针对 file server 例如 每个人最大的可用网络硬盘
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位

随机推荐

  • linux下恢复win10启动,重装win10后原来的ubuntu系统启动项丢失恢复方式

    windows系统在重装的时候总是把MBR重写了 重装windows后无法找到ubuntu的引导 然后插上你制作好的U盘 重启电脑 当然你得先设置好你得电脑首先是从你得U盘启动 如何设置 请按自己电脑的型号自己百度 进入U盘的ubnutu系
  • python使用pandas实现筛选功能方式

    1 筛选出数据的指定几行数据 data df loc 2 5 这里的 2 5 表示第3行到第5行内容 第一个起始是0 表示数据的第一行 2 筛选出数据某列为某值的所有数据记录 data df df 列名1 列值1 多条件匹配时 data m
  • UNIX网络编程卷一 学习笔记 第二十四章 带外数据

    许多传输层都有带外数据 out of band data 的概念 它有时也称为经加速数据 expedited data 其想法是一个连接的某端发生了重要的事情 且该端希望迅速通告其对端 这里的迅速指这种通知应该在已经排队等待发送的任何普通
  • PowerDesigner书签(02)导入SQL脚本生成ER图

    楔子 那时你很喜欢她吧 你不是觉得非她莫属 才跟她结婚的吗 同理 你现在痴迷的这个女人也没什么特别的 所谓的非她莫属从一开始就不存在 世上根本没有姻缘的红线 东野圭吾 黎明之街 1 今日书签 PowerDesigner 16 5 导入现有本
  • springBoot 跨域/文件上传/邮件

    学习目标 跨域请求 文件上传 邮件处理 跨域请求 1 跨域怎么理解 跨域是什么 跨域是指不同域名之间的相互访问 这是由浏览器的同源策略决定的 是浏览器对JavaScript施加的安全措施 防止恶意文件破坏 同源策略 同源策略是一种约定 它是
  • 主节点连接hiveserver2报错Error: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop01:10000:

    错误 Error Could not open client transport with JDBC Uri jdbc hive2 hadoop01 10000 java net ConnectException 拒绝连接 state 08
  • 自启exe_一个阻止【部分】流氓软件自启的解决办法(以AlibabaProtect.exe为例)

    警告 目前很多流氓软件已经采用了更高级的隐藏自己的方法 文中的方法仅限一些比较低级的顽固软件 笔者不保证文中方法能适用所有软件 如果不行请自行另找办法 这里只是提供一种思路 近日 笔者发现电脑里凭空多出一个占用闲置资源的AlibabaPro
  • sqli-labs通关全解---有关请求头注入--less18-22--7

    HTTP请求头我们可以通过chrome的F12开发者工具看到 一般的请求头内容如下 1 Accept Accept application json 浏览器可以接受服务器回发的类型为 application json Accept 代表浏览
  • sql字符串拼接

    1 概述 在SQL语句中经常需要进行字符串拼接 以sqlserver oracle mysql三种数据库为例 因为这三种数据库具有代表性 sqlserver select 123 456 oracle select 123 456 from
  • Mac电脑SecureCRT安装步骤

    Securecrt Mac版是Mac os系统上一款强大易用且专业的终端SSH工具 类似于Windows中的Putty SecureCRTpo解版支持SSH1 SSH2 Telnet等远程连接 同时具有很多实用和专业的辅助功能 支持保存mi
  • 01 如何学习Python Web开发从入门到实战

    Python Web开发从入门到实战 前言 Python Web是学校所学的课程 我希望在学习的同时通过写笔记的形式来记录我学习以及由学校学习转而自身对此方向感兴趣的一个过程 更多还是让自己在课程结束之后进行一个小的总结来回顾 提高自己 当
  • C# socket服务端判断 客户端已经断开连接的一个小办法

    具体原理就是 If the remote host shuts down the Socket connection with the Shutdown method and all available data has been rece
  • C语言《数据结构》(朱战立):顺序表与链表

    数据结构 顺序表与链表 线性结构的特点是 除第一个和最后一个元素外 每个元素只有一个前驱数据元素和一个后继数据元素 线性表是一种可以在任意位置进行插入和删除数据元素操作的 由n n 0 个相同类型数据元素a0 a1 a2 an 1组成的线性
  • 区块链正在开启一场回归商业,融合商业的新发展

    对于区块链来讲 它其实同样在延续着这样一种发展路径 正如上文所说 区块链正在开启一场回归商业 融合商业的新发展 而欲要实现这一点 区块链就是要从底层算法 底层数据传输 底层体系的打造着手来实现 更为确切地说 区块链回归商业的路径 其实就是要
  • 测试技术栈整理 -- 测试开发工程师的自我修养

    导航 一 测试理论 二 单元测试 三 集成测试 四 接口测试 五 界面 UI 测试 六 性能测试 七 自动化测试 八 Linux 九 更高级别的测试 十 测试大神好文推荐 一 测试理论 标题 链接 软件的生命周期 https blog cs
  • 因果推断17--基于反事实因果推断的度小满额度模型学习笔记

    目录 一 原文地址 二 一些问题 2 1如何从RCT随机样本过渡到观测样本因果建模 2 2反事实学习的核心思想 2 3度小满的连续反事实额度模型 Mono CFR 2 4Mono CFR代码实现 待补充 2 5CFR学习 2 5 1TarN
  • 密度计算机公式,密度浓度换算公式(浓度和密度的换算关系)

    根据密度 质量除以体积 浓度 物质的量n除以体积 物质的量n等于m除以M 最后得到 密度等于物质的摩尔质量乘以密度 C 1000 d w M C 物质的量的浓度 d 密度 w 质量分数 M 摩尔质量 有多少写多少 里面好象还有升 立方米 反
  • SpringBoot 配置文件中的信息加密

    SpringBoot 配置文件敏感信息加密 说明 打开application properties或application yml 比如 MySql登陆密码 Redis登陆密码以及第三方的密钥等等一览无余 这里介绍一个加解密组件 提高一些属
  • pandas——相关系数函数corr()

    计算DataFrame列之间的相关系数 a np arange 1 10 reshape 3 3 data DataFrame a index a b c columns one two three print data one two t
  • Linux网络接口操作之if_nameindex

    系统信息 操作系统 lsb release ir Distributor ID CentOS Release 6 7 内核版本 uname r 2 6 32 573 26 1 el6 x86 64 gcc版本 gcc version gcc