inet_ntop()
函数是用于将网络地址转换成字符串表示的函数。它与 inet_ntoa()
函数类似,但是 inet_ntop()
支持IPv6地址,而 inet_ntoa()
只支持IPv4地址。
概念
inet_ntop()
的全称是 “Internet Network To Presentation”,它可以将网络字节序的IP地址转换成以点分十进制(对于IPv4)或冒号分隔的十六进制(对于IPv6)表示的字符串。
函数原型如下:
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数说明:
af
:地址族(address family),可以是AF_INET
(IPv4)或AF_INET6
(IPv6)。src
:指向包含网络字节序IP地址的指针。dst
:指向目标缓冲区的指针,该缓冲区用于存储转换后的字符串。size
:目标缓冲区的大小。
如果转换成功,inet_ntop()
返回指向目标缓冲区的指针;如果失败,返回 NULL。
使用案例
以下是一个使用 inet_ntop()
函数将IPv4地址从网络字节序转换为点分十进制字符串的示例:
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
int main() {
struct sockaddr_in sa;
char str[INET_ADDRSTRLEN]; // INET_ADDRSTRLEN 定义在 <netinet/in.h> 中
// 假设有一个网络字节序的IPv4地址
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr("192.168.1.1");
// 将网络字节序的IPv4地址转换为字符串
if (inet_ntop(AF_INET, &(sa.sin_addr), str, INET_ADDRSTRLEN) == NULL) {
perror("inet_ntop");
exit(EXIT_FAILURE);
}
printf("The address is: %s\n", str);
return 0;
}
在这个例子中,我们首先创建了一个 sockaddr_in
结构体,并设置了IPv4地址。然后我们使用 inet_ntop()
函数将网络字节序的地址转换成字符串,并打印出来。注意,我们使用了 INET_ADDRSTRLEN
来确保目标缓冲区足够大,可以存储转换后的IPv4地址字符串。