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

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

环境配置

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服务器开发/高级架构师

目录
打赏
0
0
0
0
2
分享
相关文章
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
9月前
|
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
71 1
|
9月前
|
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
54 1
C语言变量的内存地址深入探究
C语言变量的内存地址深入探究
158 0
|
10月前
|
【C语言】深入理解取地址符&:与内存地址的联系
【C语言】深入理解取地址符&:与内存地址的联系
565 0
|
10月前
|
C语言变量、地址、字符及printf()/sizeof()/scanf()函数介绍
C语言变量、地址、字符及printf()/sizeof()/scanf()函数介绍
46 0
|
10月前
|
C语言获取Linux单网卡的多IP地址
C语言获取Linux单网卡的多IP地址
152 0
C语言_IP地址解析
#include #include void main() { unsigned long input_IP; unsigned int BeginByte, MidByte, ThirdByte, EndByte; unsigned int_rotate...
958 0
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
75 23
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等