再议字节序-------TCP/IP网络传输相关字节序

本文探讨了在TCP/IP网络编程中何时需要考虑字节序问题。虽然应用层数据通常不需要考虑字节序,但在涉及网络函数的数字类型参数(如IP地址和端口号)时,必须注意字节序,以确保正确传输和解析。网络字节序是big endian,发送端需要使用htons等函数将端口号转换为网络字节序,接收端则需使用ntohs将其转换回本地字节序。字节序问题源于不同机器间数据编码单元的顺序差异,解决方法包括文本传输或按照统一字节顺序进行转换。
摘要由CSDN通过智能技术生成
对于网络这一块的字节序,说实话,理解不够深,在网上学些了下,先整理点,以后继续完善。

一、
在网络编程时,并不是什么时候都要考虑字节序问题。那么什么时候需要考虑呢?
实际上如果是应用层的数据,即对TCP/IP来说是透明的数据,不用考虑字节序的问题。 因为发出去是什么样子,接收到就还是什么样子,接收端收到的顺序是和发送端一致的
TCP/IP协议本身处理数据的时候都是按照网络字节序来处理的。当一个数据是应用层和TCP/IP都需要关心的时候,如网络函数的数字类型参数,需要考虑这个数据的字节序(一般而言就是IP地址和端口号)。

例如我指定了一个端口号:
unsigned short port = 0x0012  (十进制18)
把这个端口号传个TCP/IP建立一个socket连接。
sockaddr_in addr;
 addr.sin_family = AF_INET; //使用互联网际协议,即IP协议
 addr.sin_port = port;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
因为网络字节序是big endian,即低地址存放的是数值的高位,所以TCP/IP实际上把这个port解释为0x1200(十进制4608)。本来打算是要在端口18建立连接的,但TCP/IP协议栈却在端口4608建立了连接。故先用htons(port)把端口号转换成网络字节序,这样就可避免这种问题了。

二、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值