C# Socket 异步接收问题

shui_mu98 2013-01-22 06:27:08
刚刚接手C#的网络编程,关于同步和异步有一些不是很清楚。

1、在频繁的网络通信中(比如网络游戏),是采用同步Receive + 线程 来模拟异步,还是直接用异步的BeginReceive?哪一种方案比较合适这种频繁的数据通信,并且要保证数据的可靠性的项目。
2、C# socket 的BeginReceive的 回调委托是在EndReceive 之后才再继续接收新的消息么?那如果EndReceive之后的逻辑比较耗时,而服务器又快速的发了几个新的数据,这个时候会不会造成socket的粘包?
...全文
281 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2013-01-23
  • 打赏
  • 举报
回复
粘包是正常的,必须要考虑的,否则每次都Close吧
本拉灯 2013-01-22
  • 打赏
  • 举报
回复
引用 楼主 shui_mu98 的回复:
刚刚接手C#的网络编程,关于同步和异步有一些不是很清楚。 1、在频繁的网络通信中(比如网络游戏),是采用同步Receive + 线程 来模拟异步,还是直接用异步的BeginReceive?哪一种方案比较合适这种频繁的数据通信,并且要保证数据的可靠性的项目。 2、C# socket 的BeginReceive的 回调委托是在EndReceive 之后才再继续接收新的消息么?那如果EndRec……
Tcp方式100%会粘包的,只要你发的数据包数量一多,都会粘包,BeginReceive 来接收,会比Receive的性能好很多。要想不粘包那就改用udp
  • 打赏
  • 举报
回复
粘包是正常的,跟什么“不稳定或者End之后的逻辑耗时”没有什么关系。从底层来说,它就是对方先粘包之后发送来的,而不是你找的那些个理由。
shui_mu98 2013-01-22
  • 打赏
  • 举报
回复
引用 1 楼 jiangzhanchang 的回复:
个人建议,不管用哪种方式,你先把收到的数据仍到缓存里,再开个线程去处理,不要阻塞通讯的线程。
这个我已经做了,我现在是用异步,在EndReceive之后,我封装了接受到的消息,然后丢进一个消息队列,但是如果网络不稳定,或者是End之后的逻辑耗时,当再次接受消息的时候,会不会粘包,我现在调试的时候,打一个断点,就会出现服务器发的几个数据粘在一起了。
Eric_Jiang 2013-01-22
  • 打赏
  • 举报
回复
个人建议,不管用哪种方式,你先把收到的数据仍到缓存里,再开个线程去处理,不要阻塞通讯的线程。

110,538

社区成员

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

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

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