ZBLOG

int inet_pton(int af, const char *src, void *dst);实现

inet_pton函数实现的大致思路如下:

  1. 首先判断af参数是否是支持的地址族类型,如果不是返回-1表示出错。

  2. 根据传入的src字符串和af指定的地址族类型,将src字符串转换成二进制格式并存储到dst指向的内存中。

  3. 返回0表示解析成功,-1表示出错。

具体代码实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_pton(int af, const char *src, void *dst) {
    if (af != AF_INET && af != AF_INET6) { // 判断af参数是否合法
        return -1;
    }

    if (src == NULL || dst == NULL) { // 判断src和dst参数是否合法
        return -1;
    }

    if (af == AF_INET) { // IPv4地址族处理
        struct in_addr addr; 
        if (inet_aton(src, &addr)) { // 将IPv4字符串转换成网络字节序整数
            memcpy(dst, &addr.s_addr, sizeof(addr.s_addr)); // 将整数存储到dst指向的内存中
            return 1;
        } else {
            return 0;
        }
    } else { // IPv6地址族处理
        struct in6_addr addr;
        if (inet_pton(AF_INET6, src, &addr)) { // 将IPv6字符串转换成in6_addr结构体形式的IP地址
            memcpy(dst, &addr.s6_addr, sizeof(addr.s6_addr)); // 将IPv6地址存储到dst指向的内存中
            return 1;
        } else {
            return 0;
        }
    }
}

int main() {
    char ipv4_str[] = "192.168.1.1";
    char ipv6_str[] = "fe80::5efe:c0a8:101";

    uint32_t ipv4_bin;
    uint8_t ipv6_bin[16];

    int ret;

    // 解析IPv4地址字符串
    ret = inet_pton(AF_INET, ipv4_str, &ipv4_bin);
    if (ret == 1) {
        printf("IPv4 address: %u\n", ntohl(ipv4_bin));
    } else if (ret == 0) {
        printf("Invalid IPv4 address string\n");
    } else {
        perror("inet_pton error");
        exit(EXIT_FAILURE);
    }

   // 解析IPv6地址字符串
   ret = inet_pton(AF_INET6, ipv6_str, &ipv6_bin);
   if (ret == 1) {
       printf("IPv6 address:");
       for (int i = 0; i < sizeof(ipv6_bin); i++) {
           printf("%02x", ipv6_bin[i]);
           if ((i + 1) % 2 == 0 && i != sizeof(ipv6_bin) - 1)
               printf(":");
       }
       printf("\n");
   } else if (ret == 0) {
       printf("Invalid IPv6 address string\n");
   } else {
       perror("inet_pton error");
       exit(EXIT_FAILURE);
   }

   return EXIT_SUCCESS;
}

其中,inet_aton函数是将IPv4字符串转换成网络字节序整数的标准库函数,它的定义如下:

int inet_aton(const char *cp, struct in_addr *inp);

其中,cp参数是要转换的IPv4地址字符串,inp参数是存储转换结果的in_addr结构体指针。

inet_pton函数的返回值说明:

  • 如果解析成功,则返回1;
  • 如果解析失败,则返回0;
  • 如果出错,则返回-1。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=691

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?