日期:2014-05-17  浏览次数:21360 次

C# Socket 异步接收问题
刚刚接手C#的网络编程,关于同步和异步有一些不是很清楚。

1、在频繁的网络通信中(比如网络游戏),是采用同步Receive + 线程 来模拟异步,还是直接用异步的BeginReceive?哪一种方案比较合适这种频繁的数据通信,并且要保证数据的可靠性的项目。
2、C# socket 的BeginReceive的 回调委托是在EndReceive 之后才再继续接收新的消息么?那如果EndReceive之后的逻辑比较耗时,而服务器又快速的发了几个新的数据,这个时候会不会造成socket的粘包?

------解决方案--------------------
个人建议,不管用哪种方式,你先把收到的数据仍到缓存里,再开个线程去处理,不要阻塞通讯的线程。
------解决方案--------------------
粘包是正常的,跟什么“不稳定或者End之后的逻辑耗时”没有什么关系。从底层来说,它就是对方先粘包之后发送来的,而不是你找的那些个理由。
------解决方案--------------------
引用:
刚刚接手C#的网络编程,关于同步和异步有一些不是很清楚。

1、在频繁的网络通信中(比如网络游戏),是采用同步Receive + 线程 来模拟异步,还是直接用异步的BeginReceive?哪一种方案比较合适这种频繁的数据通信,并且要保证数据的可靠性的项目。
2、C# socket 的BeginReceive的 回调委托是在EndReceive 之后才再继续接收新的消息么?那如果EndRec……


Tcp方式100%会粘包的,只要你发的数据包数量一多,都会粘包,BeginReceive 来接收,会比Receive的性能好很多。要想不粘包那就改用udp