tcp/ip网络通信时的大小端序转换

1.短整形/长整形的转换

#include <arpa/inet.h>
// u:unsigned
// 16: 16位, 32:32位
// h: host, 主机字节序
// n: net, 网络字节序
// s: short
// l: int

// 这套api主要用于 网络通信过程中 IP 和 端口 的 转换
// 将一个短整形从主机字节序 -> 网络字节序
uint16_t htons(uint16_t hostshort);    
// 将一个整形从主机字节序 -> 网络字节序
uint32_t htonl(uint32_t hostlong);    

// 将一个短整形从网络字节序 -> 主机字节序
uint16_t ntohs(uint16_t netshort)
// 将一个整形从网络字节序 -> 主机字节序
uint32_t ntohl(uint32_t netlong);

 

2.只适用于IPv4的ip地址转换

//网络字节序IP转化点分十进制IP
char *inet_ntoa (struct in_addr)

//点分十进制IP地址转换成网络字节序IP地址
in_addr_t inet_addr(const char *cp)

//点分十进制IP地址转换成网络字节序IP地址
int inet_aton(const char *string, struct in_addr *addr)

其中,inet_ntoa和inet_aton都是<arpa/inet.h>头文件,inet_addr是<sys/socket.h>头文件,均在Linux系统中使用。

 

3.既适用于IPv4,又适用于IPv6的ip地址转换

#include <arpa/inet.h>
// 将大端的整形数, 转换为小端的点分十进制的IP地址        
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

参数:

af: 地址族协议

AF_INET: ipv4格式的ip地址

AF_INET6: ipv6格式的ip地址

src: 传入参数, 这个指针指向的内存中存储了大端的整形IP地址

dst: 传出参数, 存储转换得到的小端的点分十进制的IP地址

size: 修饰dst参数的, 标记dst指向的内存中最多可以存储多少个字节

返回值:

成功: 指针指向第三个参数对应的内存地址, 通过返回值也可以直接取出转换得到的IP字符串

失败: NULL

 

// 主机字节序的IP地址转换为网络字节序
// 主机字节序的IP地址是字符串, 网络字节序IP地址是整形
int inet_pton(int af, const char *src, void *dst); 

参数:

af: 地址族(IP地址的家族包括ipv4和ipv6)协议

AF_INET: ipv4格式的ip地址

AF_INET6: ipv6格式的ip地址

src: 传入参数, 对应要转换的点分十进制的ip地址: 192.168.1.100

dst: 传出参数, 函数调用完成, 转换得到的大端整形IP被写入到这块内存中

返回值:成功返回1,失败返回0或者-1

posted @ 2024-03-22 16:15  バカなの  阅读(82)  评论(0编辑  收藏  举报