inet_pton()函数的概念和使用案例
inet_pton()
是一个用于将点分十进制表示的 IP 地址(例如 “192.168.1.1”)或 IPv6 地址(例如 “2001:0db8:85a3:0000:0000:8a2e:0370:7334”)转换为网络字节序的二进制形式(即 in_addr
或 in6_addr
结构体)的函数。这个函数的名字是 “pton”,代表 “presentation to network”,即“表示层到网络层”的转换。
定义
inet_pton()
函数原型定义在 <arpa/inet.h>
头文件中,如下所示:
int inet_pton(int af, const char *src, void *dst);
参数说明:
af
: 地址族。对于 IPv4,它应该是AF_INET
;对于 IPv6,它应该是AF_INET6
。src
: 指向点分十进制字符串或 IPv6 字符串的指针。dst
: 指向in_addr
(对于 IPv4)或in6_addr
(对于 IPv6)结构体的指针,该结构体将接收转换后的二进制地址。
函数返回值:- 成功时返回 1。
- 如果
src
不包含有效的网络地址,则返回 0。 - 如果
af
不支持,则返回 -1 并设置errno
。
使用案例
以下是一个使用 inet_pton()
函数的示例,该示例将 IPv4 地址从字符串转换为二进制形式:
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
int main() {
struct sockaddr_in sa;
int result;
char ip4[] = "192.168.1.1";
result = inet_pton(AF_INET, ip4, &(sa.sin_addr));
if (result == 0) {
fprintf(stderr, "Not in presentation formatn");
exit(EXIT_FAILURE);
} else if (result 0) {
perror("inet_pton");
exit(EXIT_FAILURE);
}
printf("IPv4 address in binary form: %sn", ip4);
// 输出转换后的二进制地址(通常以十六进制形式表示)
printf("sin_addr.s_addr (in network byte order): %xn", sa.sin_addr.s_addr);
return 0;
}
在这个例子中,我们使用 inet_pton()
将一个 IPv4 地址从字符串形式转换为网络字节序的二进制形式,并将其存储在 sockaddr_in
结构体的 sin_addr
成员中。然后,我们检查 inet_pton()
的返回值以确保转换成功。如果转换成功,我们打印出原始的 IP 地址字符串和转换后的二进制地址(通常以十六进制形式表示)。