inet_pton函数实现的大致思路如下:
首先判断af参数是否是支持的地址族类型,如果不是返回-1表示出错。
根据传入的src字符串和af指定的地址族类型,将src字符串转换成二进制格式并存储到dst指向的内存中。
返回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。