C语言获取AIX单网卡的多IP地址

news/2024/10/30 14:13:46/

环境配置

AIX上,可以使用smitty tcpip命令给单个网卡配置多个IP别名。操作步骤如下:

  1. 选择Further Configuration
    在这里插入图片描述
  2. 选择Network Interfaces
    在这里插入图片描述
  3. 选择 Network Interfaces Selection
    在这里插入图片描述
  4. 选择 Configure Aliases
    在这里插入图片描述
    5.选择Add an IPV4 Network Alias
    在这里插入图片描述
  5. 选择需要配置的网卡,我们这里选择en1
    在这里插入图片描述
  6. IPV4 ADDRESS处输入新的IPNETMASK不需要配置
    在这里插入图片描述
  7. F10保存退出。

查看网卡信息,已经配置完成。

bash-5.0# ifconfig -a
en0: flags=1e080863,c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>inet 192.168.21.251 netmask 0xffffff00 broadcast 192.168.21.255tcp_sendspace 131072 tcp_recvspace 65536 rfc1323 0
en1: flags=1e080863,c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>inet 192.168.2.251 netmask 0xffffff00 broadcast 192.168.2.255inet 192.168.2.216 netmask 0xffffff00 broadcast 192.168.2.255
lo0: flags=e08084b,c0<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,LARGESEND,CHAIN>inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255inet6 ::1%1/0tcp_sendspace 131072 tcp_recvspace 131072 rfc1323 1

C 代码实现

在IBM官方文档,有介绍使用ioctl函数获取单网卡多IP的方法,链接如下: https://www.ibm.com/docs/en/aix/7.2?topic=i-ioctl-socket-control-operations
调用方式为:

ioctl (fd, SIOCGIFADDRS, (caddr_t)ifaddrsp);

其中,会用到一个struct ifreqaddrs *ifaddrsp的结构体,该结构体如下:

struct  ifreqaddrs {char    ifr_name[IFNAMSIZ];     /* if name, e.g. "en0" */int     ifaddrs;                /* returned number of address on if */int     naddrs;                 /* number of addresses returned in req*/union {struct sockaddr_in      addr_in;struct sockaddr_in6     addr_in6;} ifrasu[1];
};

我们需要将网卡名提前传入到ifaddrsp->ifr_name中,最终多个IP会通过ifaddrsp->ifrasu的数组返回。
不过需要注意的是,ifaddrsp的内存需要手动申请,如果你需要获取n个IP,那么你至少需要申请sizeof (struct ifreqaddrs) + (n * sizeof (struct sockaddr_in)大小的内存。

#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main() {struct sockaddr *sa;int sockfd, i;sockfd = socket(AF_INET, SOCK_DGRAM, 0);//第一遍调用,单纯获取IP个数struct ifreqaddrs *ifaddrsp = calloc(1, sizeof (struct ifreqaddrs));//此处传入网卡名为en1strcpy(ifaddrsp->ifr_name, "en1");if (ioctl(sockfd, SIOCGIFADDRS, ifaddrsp) == 0) {printf("ifaddrs: %d\n", ifaddrsp->ifaddrs);}//第二遍调用,根据IP个数申请内存空间struct ifreqaddrs *ifaddrsp2 = calloc(1, sizeof (struct ifreqaddrs) + (ifaddrsp->ifaddrs * sizeof (struct sockaddr_in)));strcpy(ifaddrsp2->ifr_name, "en1");//设置需要获取的ip个数及网卡名ifaddrsp2->naddrs =  ifaddrsp->ifaddrs;ioctl(sockfd, SIOCGIFADDRS, ifaddrsp2);//打印IP地址for (i = 0; i < ifaddrsp2->naddrs; i++) {char ip[64] = {0};inet_ntop(AF_INET,&ifaddrsp2->ifrasu[i].addr_in.sin_addr, ip, sizeof(ip));printf("ip%d: %s \n", i+1, ip);} close(sockfd);free(ifaddrsp);free(ifaddrsp2);return 0;
}

以上代码运行结果:

bash-5.0# ./a.out 
ifaddrs: 2
ip1: 192.168.2.251 
ip2: 192.168.2.216 

推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习: C/C++Linux服务器开发/高级架构师


http://www.ppmy.cn/news/107911.html

相关文章

【记录】OLAP和OLTP

下面为提炼的重点内容&#xff0c;全部内容参考&#xff1a;OLAP和OLTP OLAP和OLTP的不同设计要求 对于OLTP系统和OLAP系统有哪些不同的要求&#xff1f;要说清楚这个&#xff0c;首先需要分析一下这两个系统的关键特征。 对于OLTP系统来说&#xff0c;最重要的事情是&#…

PMP-识别相关方的重要性

一、为什么要识别相关方 每个项目都有相关方&#xff0c;他们会受项目的积极或消极影响&#xff0c;或者能对项目施加积极或消极的影响。有些相关方影响项目工作或成果的能力有限&#xff0c;而有些相关方可能对项目及其期望成果有重大影响。项目经理和团队正确识别并合理引导所…

spring boot 单元测试JUnit5使用断言Assertions和假定Assumptions、嵌套、参数测试

spring boot 单元测试JUnit5使用断言Assertions和假定Assumptions、嵌套、参数测试 本文基于spirng boot 2.7.11&#xff0c; 大家注意自己的版本 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖 源码地址&am…

知识变现海哥:知识变现从入门到实操,缺的不是知识,而是知识变现的能力。

知识只能改变学历&#xff0c;知识变现才能改变命运。通过研究知识变现的路径&#xff0c;无论市文案工作者还是声音工作者我们能看到的微信生态圈&#xff0c;抖音类视频生态&#xff0c;百度等搜索系生态圈&#xff0c;喜马拉雅FW&#xff0c;荔枝等音频生态都是很好的知识变…

如何在 Alpine Linux 上启用或禁用防火墙?

防火墙是计算机网络安全的重要组成部分&#xff0c;它用于保护计算机和网络免受未经授权的访问和恶意攻击。Alpine Linux 是一种轻量级的 Linux 发行版&#xff0c;常用于构建容器化应用和嵌入式系统。本文将详细介绍如何在 Alpine Linux 上启用或禁用防火墙。步骤 1&#xff1…

Qt(C++)使用QChart静态显示3个设备的温度变化曲线

一、QChart介绍 QChart模块是Qt Charts库的基础,提供了用于创建和显示各种类型图表的类和接口。Qt Charts库是一个功能丰富、易于使用的数据可视化工具库,可以帮助开发者在应用程序中添加漂亮而又交互性强的图表。 QChart模块主要包括以下类: QChart:表示一个基本的图表容…

RocketMQ 多级存储设计与实现

作者&#xff1a;张森泽 随着 RocketMQ 5.1.0 的正式发布&#xff0c;多级存储作为 RocketMQ 一个新的独立模块到达了 Technical Preview 里程碑&#xff1a;允许用户将消息从本地磁盘卸载到其他更便宜的存储介质&#xff0c;可以用较低的成本延长消息保留时间。本文详细介绍 …

ORA-01555

ORA-01555 rollback records needed by a reader for consistent read are overwritten by other writers 回滚数据时被其他事务覆写 从应用角度来看ORA-015551.查询执行时间太长。首先是优化查询&#xff0c;然后考虑在数据块不繁忙的时候运行&#xff0c;最后考虑加大回滚段…