在Socket编程中,inet_ntop、inet_pton 以及字节序转换函数(如 htons(), htonl(), ntohs(), ntohl())是非常重要的工具,用于处理IP地址和端口号的表示与转换。
很多时候,我容易记岔IP地址转换和字节序,所以以此加深印象。
先放总结
IP地址转换:二进制网络地址和点分十进制文本之间的转换;
字节序转换:大端字节序(网络) 和 小端字节序(可能是主机) 之间的转换;
inet_ntop 和 inet_pton
inet_ntop: 这个函数用于将网络地址结构(如 struct in_addr 对于IPv4,或 struct in6_addr 对于IPv6)转换为可读的字符串格式。
函数原型:
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
其中 af 是地址族(如 AF_INET 或 AF_INET6),src 是指向网络地址结构的指针,dst 是目标字符串的缓冲区,size 是目标缓冲区的大小。
inet_pton: 这个函数与 inet_ntop 相反,它用于将可读的字符串格式的IP地址转换为网络地址结构。
函数原型:
int inet_pton(int af, const char *src, void *dst);
其中 af 是地址族,src 是指向字符串IP地址的指针,dst 是指向网络地址结构的指针。
字节序转换函数
在网络编程中,字节序(也称为端序)是一个重要概念。大端序(Big-Endian)和小端序(Little-Endian)是两种主要的字节序。网络字节序是大端序,而主机字节序可能是大端序或小端序,这取决于具体的硬件和操作系统。
- htons(): 这个函数用于将无符号短整型(通常是端口号)从主机字节序转换为网络字节序。
- htonl(): 这个函数用于将无符号长整型(可能是IPv4地址或其他数据)从主机字节序转换为网络字节序。
- ntohs(): 这个函数与 htons() 相反,用于将无符号短整型从网络字节序转换为主机字节序。
- ntohl(): 这个函数与 htonl() 相反,用于将无符号长整型从网络字节序转换为主机字节序。
这些函数的名字中的 “h” 代表 “host”(主机),“n” 代表 “network”(网络),“s” 代表 “short”(短整型),“l” 代表 “long”(长整型)。
在编写跨平台的网络应用程序时,使用这些函数可以确保数据的正确表示和传输。