网络字节序与主机字节序的转换函数实践

1 #include <netinet/in.h>
2 unit16_t htons(uint16_t host16bitvalue);
3 uint32_t htonl(uint32_t host32bitvalue);  //均返回网络字节序的值
4 unit16_t ntohs(uint16_t net16bitvalue);
5 uint32_t ntohl(uint32_t net32bitvalue);   //均返回主机字节序的值

  h代表host,n代表network,s代表short,l代表long。如果长整型占用64位,htonl和ntohl操作的仍然是32位的值。

  源自berkeley的字节操纵函数:

1 #include <string.h>
2 void bzero(void *dest, size_t nbytes);
3 void bcopy(const void *src, void *dest, size_t nbytes);
4 int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);

  地址转换函数:

1 #include <arpa/inet.h>
2 int inet_aton(const char *strptr, struct in_addr *addrptr);
3 in_addr_t inet_addr(const char *strptr);
4 char* inet_ntoa(struct in_addr inaddr);

  inet_aton将strptr所指c字符串转换成一个32位的网络字节序二进制值,并通过addrptr指针来存储。成功返回1,否则返回0.

  inet_ntoa将一个32位的网络字节序二进制IPV4地址转换成相应的点分十进制数串。由于返回值所指向的字符串驻留在静态内存中,所以该函数是不可重入的。

1 #include <arpa/inet.h>
2 int inet_pton(int family, const char* strptr, void *addrptr);
3 const char* inet_ntop(int family, const void* addrptr, char* strptr, size_t len);

  这两个函数的family参数可以是AF_INET、AF_INET6。如果以不支持的地址族作为这个参数,返回一个错误,erron置为EAFNOSUPPORT。

  inet_pton尝试转换strptr所指字符串,并将二进制结果存放在addrptr中,成功返回1,失败返回0.

  inet_ntop进行相反的转换,从数值格式(addrptr)转换到表达格式(strptr)。len参数是目标存储单元的大小,以免溢出其调用者的缓冲区。调用陈宫时strptr就是这个函数的返回值

  一般有如下定义:

1 #include<netinet/in.h>
2 #define INET_ADDRSTRLEN 16 //for IPv4 dotted-decimal
3 #define INET6_ADDRSTRLEN 46 //for IPv6 hex string

 

posted @   Royol  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示