TCP的socket编程中常见问题及注意事项

   TCP的Socket编程,要做到质量稳定可靠效率高,对市场上90%的开发人员来说,是一项难度极高的工作。笔者有多年的socket开发经验,今天主要介绍socket编程中常见问题及注意事项: 


(1) 对于可变包长,必须定义包头,并在包头中定义包的总长度

     由于socket是字节流,就像流水一样,对于传输多个包的socket数据流来说,从中间无法得知一个包的起始位置,从中间位置观察数据包的特征也是一个不靠谱的做法。因此,只能从包的第一个字节起,一个一个计算每一个包的位置。

     通常的做法是,对每一个传输的数据包,定义一个包头和包体。包头为固定长度,通常在其中定义版本号、包体的长度(或总包的长度)、以及包类型字段。包体通常是可变长度的内容。收到包的一方,解析socket数据流时,先解析固定长度的包头,从包头中得到整个包的长度,然后取得包体内容,紧接着取下一个包的包头和包体,如此循环下去,就能顺序收到每一个包。


(2) socket接收调用一次不保证收到一个完整数据包

    调用socket的接收函数时,调用一次,可能会收到一个完整的对方发来的数据包,也可能只收到1/2个数据包,也可能1.5个数据包,也可能收到任何长度的包,或收到0个字节,这些情况都可能发生,这是正常情况,不是错误。当然,由于socket是全双工的字节流,你只可能收到一个一个字节,不可能收到半个字节,或2.5个字节。原因还是在于TCP

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值