Socket 异步接收如何处理粘包

datahandler2 2016-04-12 04:49:45
如代码所示,采用BeginReceive 进行异步接收,但对方服务器发送过来的可能存在粘包或超过单次我这边缓冲接收的1024字节情况,那么如何进行处理接收全部正确的包后然后再进行调用action方法进行内容处理??

byte[] buffer = new byte[1024];
public void Receive(Action<byte[]> action)
{
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback((ar) => {
//当所有包处理接收成功了,则调用action函数进行逻辑处理
//那这边如何进行处理粘包呢?因为Receive会执行多次


Receive(action);
}), socket););
}
...全文
427 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jytlzc 2016-09-05
  • 打赏
  • 举报
回复
LZ是如何处理的?分享下
datahandler2 2016-04-13
  • 打赏
  • 举报
回复
昨晚研究了3个小时。。。突然最后醒悟,原来就是这么个简单的东西!!!!!!哎~~~新手啊
wanghui0380 2016-04-12
  • 打赏
  • 举报
回复
引用 7 楼 tiancaolin 的回复:
[quote=引用 6 楼 wanghui0380 的回复:] 接收的byte[]后,先不处理,先直接放入队列中,然后另一个线程线程从队列中处理
我这边是出现了比如两个独立的报文最后合并了一个byte[].... 已知每个报文的前8个字节标示了这个报文的长度,那么要怎么递归切割。。我头晕了。。。 有相关算法代码?[/quote] 无需递归,通常情况下是,报文有报文头,我们挨个取出队列,找到报文头 比如一般的modbus协议 是 -------------------协议头---------- --协议数据-- --校验位-- 报文头,报文指令,高位,底位,数据区,校验位 如果协议说: 0x5, 0x1, 0x00, 0x10 , --------- 报文除校验位以外异或+ 那么我线程检查到 0x5开头的东西,我就可以开始启动协议解析规则去解析这个协议 至于你说怎么切割,我说除数据区以外,报文头部分是固定长度,我检查到0x5开头,就取固定长度(协议头部分),然后根据高低位计算出数据区长度,然后在从队列里取 数据区长度+校验位长度滴byte[]就行了(因为是队列,队列当然先进先出,你取多少就出多少,剩下滴还是缓存保留,只到我解析到第2个0x5开头的数据)
  • 打赏
  • 举报
回复
我以前写过一个例子,你可以研究一下其处理流程:http://bbs.csdn.net/topics/391012384?page=1
datahandler2 2016-04-12
  • 打赏
  • 举报
回复
引用 6 楼 wanghui0380 的回复:
接收的byte[]后,先不处理,先直接放入队列中,然后另一个线程线程从队列中处理
我这边是出现了比如两个独立的报文最后合并了一个byte[].... 已知每个报文的前8个字节标示了这个报文的长度,那么要怎么递归切割。。我头晕了。。。 有相关算法代码?
wanghui0380 2016-04-12
  • 打赏
  • 举报
回复
接收的byte[]后,先不处理,先直接放入队列中,然后另一个线程线程从队列中处理
datahandler2 2016-04-12
  • 打赏
  • 举报
回复
引用 4 楼 wyqlxy 的回复:
把你接收字节长度变大 或者 发送信息头里封装每次发送的字节数
不现实~~~~接收字节我压根就不知道合理值要多少。。。
  • 打赏
  • 举报
回复
把你接收字节长度变大 或者 发送信息头里封装每次发送的字节数
datahandler2 2016-04-12
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
最基本的:数据长度(固定字节)+数据(数据长度字节)
能给个代码列子?搜到的全部都是没处理粘包或单次就接收完的简单例子。。。。
Poopaye 2016-04-12
  • 打赏
  • 举报
回复
最基本的:数据长度(固定字节)+数据(数据长度字节)
Poopaye 2016-04-12
  • 打赏
  • 举报
回复
发来的数据都没有协议的吗?

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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