求教异步SOCKET的粘包和缓冲丢包的问题。

raynors 2017-07-27 01:06:04
我的程序是异步SOCKET。在做一个文件传输的过程。

服务器和客户端 缓冲大小都是 buffSize =1024 ,

先说明,在发送短句或者 断点调试的时候,发送接受都很正常。如:

sendMsg(strBuffer1)
(断点)
sendMsg(strBuffer2)
(断点)
sendMsg(strBuffer3)
(断点)
此时双方通信正常。

但是出现快速运行
sendMsg(strBuffer1)
sendMsg(strBuffer2)
sendMsg(strBuffer3)

接收方就出现 “粘包” 的情况了,“粘包” 如果是小包,我已经通过消息头和尾标记 可以分拆了。

但是问题在于strBuffer1+strBuffer2+strBuffer3 >1024 ,超出了缓冲区,导致接收方丢了包(数据是丢了还是仍在某个地方?) ,。增大buffSize可以解决我的问题,但是我有些钻牛角尖,想找一个更完美的解决方案,人生在于折腾,我也不是伸手党,单遍寻互联网都找不到合适的答案实在是没办法求教到这里了。

也许就只是临门一脚,一个思路问题,求大神不吝赐教。

...全文
1647 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
raynors 2017-09-05
  • 打赏
  • 举报
回复
参考了很多网上的例子,我还是没有找到完美的解决办法. 最后我还是回头采用 发送 -接受反馈 发送 -接受反馈 发送 -接受反馈 的方法,来解决我的问题.
raynors 2017-07-27
  • 打赏
  • 举报
回复
VB.net Sub RECV(ByVal ar As System.IAsyncResult) Dim _socket = CType(ar.AsyncState, Socket) Dim lenth = _socket.EndReceive(ar) Dim strmsg = System.Text.Encoding.Unicode.GetString(buffer, 0, lenth) ‘这里做断点显示,用于测试数据 senddebugmsg (lenth ) senddebugmsg (strmsg ) ‘这里做断点显示,用于测试数据 Call 处理消息(strmsg) _socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf RECV), _socket) end sub 代码很简单,中间过程就这样,子程序处理消息也就是单纯显示消息。 服务器端发送程序是正常的,确实发出去了4个封包,每个封包500字节。 接收端第一个封包是正常的,500字节, 第二个第三个第四个就接在一起了. 在断点那里,一共激活了两次, 第一次是第一个封包,长度500,封包内容正常; 第二次是234封包的合集,长度1024,分别是2,3的整个封包内容,还有第4封包的前24字节。 这么说是否清楚?
X-i-n 2017-07-27
  • 打赏
  • 举报
回复
接收代码有问题。正常逻辑应该是接收方一直在收,不存在溢出的问题。虽然总数据量超过1024,但是接收方会循环读取,所以数据不会丢。

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧