C++网络编程(二)字节序与IP地址转换
字节序转换函数
核心函数介绍
BSD Socket提供了专门的字节序转换接口,用于主机字节序与网络字节序之间的转换:
转换函数分类:
htons()
- 主机到网络的16位整数转换(用于端口号)htonl()
- 主机到网络的32位整数转换(用于IPv4地址)ntohs()
- 网络到主机的16位整数转换ntohl()
- 网络到主机的32位整数转换
函数命名规则解析
h
= host(主机字节序)n
= net(网络字节序)s
= unsigned short(16位无符号整数)l
= unsigned int(32位无符号整数)
使用场景
#include <arpa/inet.h>// 端口转换示例(16位)
uint16_t port = 8080;
uint16_t net_port = htons(port);// IP地址转换示例(32位)
uint32_t ip_addr = inet_addr("192.168.1.1");
uint32_t net_ip = htonl(ip_addr);
IP地址转换函数
inet_pton函数
将字符串形式的IP地址转换为网络字节序的整型数:
函数原型:
int inet_pton(int af, const char *src, void *dst);
参数说明:
af
:地址族协议(AF_INET用于IPv4,AF_INET6用于IPv6)src
:源字符串IP地址dst
:目标缓冲区,存储转换后的大端IP地址
返回值:
成功返回1
失败返回-1
inet_ntop函数
将网络字节序的整型IP地址转换回字符串形式:
函数原型:
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数说明:
af
:地址族协议src
:源大端整型IP地址dst
:目标字符串缓冲区size
:目标缓冲区大小(防止缓冲区溢出)
返回值:
成功返回指向dst的指针
失败返回NULL
实际应用要点
1. 网络通信必备步骤
发送数据前:使用
htonl/htons
将本地数据转换为网络字节序接收数据后:使用
ntohl/ntohs
将网络数据转换回主机字节序
2. IP地址处理最佳实践
// 字符串IP转网络字节序
struct in_addr addr;
inet_pton(AF_INET, "192.168.1.1", &addr);// 网络字节序转字符串IP
char ip_str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &addr, ip_str, sizeof(ip_str));
3. 注意事项
始终检查函数返回值,确保转换成功
为字符串缓冲区预留足够空间(INET_ADDRSTRLEN为16字节)
明确指定地址族协议(AF_INET或AF_INET6)