作者回复: 非常好的问题。
我们在网络传输中,一个常见的方法是把0-9这样的数字,直接用ASCII码作为字符发送出去,在这种情况下,你可以理解成发送出去的都是字符类型的数据,因为是字符类型的数据,就没有所谓的网络顺序了;而如果作为一个数据型数据,比如125,这时候可能就要作为一个4字节的整型数据进行传输,那么就会有字节序的问题了。
作者回复: 我理解所谓的粘包是数据报文的边界确定不清晰,造成报文解析的时候有overlap,数据解析不对。
这个具体的解法讲义里也都有涉及到,通过合理设置报文边界,接收端缓冲报文并在解析时注意上下文,一般不会有大的问题。
作者回复: 1.如果是字符类型数据,肯定是从a到f这样的顺序拷贝到发送缓冲区发送的;
2.网络中没有高地址或者低地址,网络中传输的是一个字节流,就像你例子里的abcdef....这样的顺序字节流;
3.不会。对于数据型的数据如int需要调研htonl来转换,对于字符类型的数据,不需要转换。因为字符类型的数据,本质是ASCII编码,而int类型的数据则需要决定顺序。
作者回复: 赞。
作者回复: 我觉得是我错了,应该都需要的,因为我定义的MESSAGE_TYPE是一个int型值。好提醒,能pull一个PR过来么?要不我自己来吧。
作者回复: 我认为你是对的,type类型确实也需要转为网络字节顺序。
作者回复: 你有什么更好的思路么?多次read调用在网络程序开发中很正常。
作者回复: 是的。实际上就是这样。
作者回复: 这个对我们来说是透明的,不过你可以理解成先发送数据长度,再发送数据类型,最后是数据本身。
作者回复: 好问题,这个在实际设计应用层协议的,是要着重考虑避免的,就是说边界的划分,应该是有限的,http的协议有head和body的区分,处理的好是可以分段处理的。比如先处理head,再处理body部分。
作者回复: 你写编译一下我这里的例子,看看是否能正确运行。
你也可以把你的例子贴上来,大家一起分析。
作者回复: 关键是我们不知道对方机器的型号,是不是大小端一样的。
作者回复: 是解析完的四字节长度为0,还是读到了0?如果提取的长度为0,说明写入的就是0啊,这个要看下发送端发的数据是否对的。
作者回复: 我其实觉得本地端口不需要,数据是需要的。就是双方通信的那个部分是需要的。
作者回复: 感觉是整型数越界了。