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

24 篇文章 36 订阅
17 篇文章 2 订阅

环境配置

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.255
         tcp_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.255
        inet 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.255
        inet6 ::1%1/0
         tcp_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));
    //此处传入网卡名为en1
    strcpy(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服务器开发/高级架构师

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值