字节序转换函数

核心函数介绍

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)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐