Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14450
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 32
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-12 11:53
文章分类

全部博文(1)

文章存档

2016年(1)

我的朋友

分类: C/C++

2016-08-03 17:27:26

字节序,必然涉及到以字节为单位的整数的排序(主要是16位和32位)。
网络字节序是在网络中传输使用的字节序,和大端字节序一致。

对于不大于一字节的字段,比如IP 报头的TTL是一个字节长度,不需要考虑字节序问题。

对于多字节的字段,比如IP 报头的IP地址(32位整形数,4字节)和TCP/UDP报头的port 端口(16位整形数,2字节)都是大于一个字节,那么小端字节序的主机需要转序,比如端口8084,网络字节序和大端主机是1f94,而小端主机不转成网络字节序是941f(wireshark抓包显示的是37919),所以小端主机需要使用htons(8084)(16位)。

目前Linux 库函数提供了16bits 和32bits 的转序函数:
htonl 和htons,分别对32位和16位整数从主机字节序转换成网络字节序,host to net long(4 bytes)/short(2 bytes)
ntohl 和ntohs,分别对32位和16位整数从网络字节序转换成主机字节序,net to host long/short;
64位的字节序转换函数,网上有一些,但并不能很好的工作,一般也用不到这么大的整数。

为了代码可移植性,不能假设当前主机需要或者不需要转序,所以所有的主机都需要进行字节序转换。

除了TCP/IP协议栈中注意字节序外,send 函数发送的数据如果是int 类型,也会需要字节转序,接收方接收了要转序。发送字符串形式的数据不需要转换字节序,这个原因暂时没有找到,需要跟踪下sendto 代码。
阅读(1363) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~