解决TCP粘包问题,个人不推荐采用先发送代表长度的四个字节,然后再发送数据部分,因为在IP层,会尽量一次尽可能多的发送数据,比如:调用send发送连续发送如下几个数据包, 包1:[4字节],包2:[500字节]; 包3:[4字节],包4:[520字节]; 包5:[4字节],包6:[530字节]; 一共大小为:1562个字节,在IP层,会尽量将多个小包组合在一起发送(尽量的原因是这两个包的发送间隔时间不太长),根据IP层的MTU(1460)大小,分两次发送到网络上,第一次发送:1460个字节,第二次发送:102个字节 到达对端时,触发了两次FD事件,按照你的解析,触发第一次FD事件后,先读取4个字节,读到了第一个包的内容为500个字节,解析出来第一个数据包:[长度(4字节) + 内容(500字节)],接着再处理第二次FD事件,先读取4个字节,获取到第二个包的内容为520个字节,解析出来第二个数据包:[长度(4字节) + 内容(520字节)],这样,解析数据包的任务结束了,可时间上,第三个数据包还没有解析,还留在了SOCKET缓冲区中,因此,这种靠FD事件触发recv的方式去解析数据包的方式,会导致丢包。 如果你的代码再写的不好,那基本上丢包是肯定的。
server端还好理解,客户端为什么会少了开头4个字节,而且检测到读事件后,recv的数据少了前面4个字节,然后马上又可以检测读事件,但再recv返回10035,很奇怪,既然有读事件,为什么recv又返回WSAEWOULDBLOCK呢?
18,356
社区成员
64,214
社区内容
加载中
试试用AI创作助手写篇文章吧