求问:关于异步SOCKET 通信,服务端的公共缓冲区疑问?

raynors 2018-03-27 10:44:43
关于异步SOCKET通信的程序设计,基本上已经完成了。也是半抄半学。

但是在做代码检查的时候,突然发现了一个问题。

服务端的设计同客户端设计一样,只用了一个公共缓冲区。

理论上,服务端为每一个 客户端连接 都开了一个异步监听过程

_client.BeginReceive(RecvBuffer,0.......

使用了同一个公共缓冲区RecvBuffer

这样是否存在脏数据可能性?

难道要为每一个客户端都开一个独立缓冲区不成?

如果用异步锁,这个异步锁应该套在哪里?会不会影响程序效率?

求解决办法。
...全文
265 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
raynors 2018-03-31
  • 打赏
  • 举报
回复
实际上,服务器端就是为每个客户端都开辟了一个缓冲区
raynors 2018-03-31
  • 打赏
  • 举报
回复
回头看了代码,发现以前的代码的确有很大问题,很多是基础问题。问题提的有些低级,的确惭愧。
  • 打赏
  • 举报
回复
对于同一个会话来说,不管是服务器端还是客户端,它是异步但是是顺序的,也就是说I/O线程触发一次异步Receive委托回调填写了内容之后才会注册下一个异步委托Receive回调。 但是同时维系多个会话,是并发的。所以不能有“公共缓冲区”。
xuzuning 2018-03-28
  • 打赏
  • 举报
回复
显然是你抄错了代码,或者说只是抄了原理性点对点教学代码,并无实际意义 你应该去抄那些 点对多点 或 多点对点 的代码(没有范本,完全自己写是很困难的)
  • 打赏
  • 举报
回复
即使客户端编程设计,你也不应该为连接不同服务端的会话去共用什么接收缓冲区。不知道你抄的代码的来源如何,缓冲区应该基于原理来设计,是每一个会话都应该有自己的数据缓存,不管你是从哪里抄来的。
  • 打赏
  • 举报
回复
什么叫做“开了一个异步监听过程”呢?这个是注册委托回调,而不是什么“开过程”。当有I/O事件时会自动触发回调执行,是并发的,所以“共用”肯定是会产生混乱的。
token不能为空 2018-03-28
  • 打赏
  • 举报
回复
这段源码我之前也看过一些,我记得虽然缓冲区是一整块公用,但是具体到单个客户端只是使用缓冲区的一部分,所以不肯能会产生什么脏数据

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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