[服务端开发]C#异步Socket VS IOCP

思月行云 2011-03-08 03:33:05
用C#写了一个服务端框架,与客户端广播比率为1:30,简单来讲就是每收到一次客户端数据,就将其广播给30个不同的客户端。
测试用客户端登录频率为200ms,数据发送频率为1s,每次发送数据长度为60byte。
当客户端登录数到达1000,此时服务端每秒调用30000次BeginSend方法异步发送数据,服务端CPU大于90%。
这个测试结果与C++下的IOCP框架性能相去甚远,后者同样的测试方法和广播比率,至少能承载2000以上的客户端。
求教大家:这是由于C#下的BeginSend方法太耗性能的原因吗?它跟IOCP下的WsaSend性能差距有这么大吗?还是说和C++相比,C#终究不适于开发大型的网游服务端?
...全文
1272 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
思月行云 2013-06-11
  • 打赏
  • 举报
回复
引用 15 楼 mooniscrazy 的回复:
上代码,不然说个鬼啊
BeginSend和SocketAsyncEventArgs分别是.net2.0跟.net3.5再典型不过的Socket用法,两年前的玩意儿我已经找不到了,要源码自己百度谷歌去。
mooniscrazy 2013-06-10
  • 打赏
  • 举报
回复
上代码,不然说个鬼啊
思月行云 2013-05-29
  • 打赏
  • 举报
回复
引用 13 楼 u010410061 的回复:
c# 三种 异步 模型你都应该试试,会有体会的。 对于广播应该做特殊处理再发送出去,效率不比c++ iocp差。 你提高的问题,是对Send和Receive都使用了同一Args,应该分两个来操作。
两年前发过的帖子了,呵呵。。 C#的异步模型试了很多遍,最终还是放弃了。我自己测试的C++&iocp效率甩C#好几条街,百M网卡全部占用的时候,CPU还不足20%。 “对于广播应该做特殊处理再发送出去”,不知道您提到的“特殊处理”是怎样的手法,能否赐教一二?
x0c78vc 2013-05-24
  • 打赏
  • 举报
回复
c# 三种 异步 模型你都应该试试,会有体会的。 对于广播应该做特殊处理再发送出去,效率不比c++ iocp差。 你提高的问题,是对Send和Receive都使用了同一Args,应该分两个来操作。
「已注销」 2012-10-11
  • 打赏
  • 举报
回复
传统的都是 C++做,既然业界普遍这么做肯定有它的道理,C#没做过不懂。。。
思月行云 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
忘了说,我那个server是c++的
[/Quote]
嗯,用于广播的部分已经改为C++的IOCP了。
各位对于C#作Server端还有什么思路,希望赐教一二~
思月行云 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
c#下的iocp通讯不是这么做的,你可以看一下SocketAsyncEventArgs。
[/Quote]
利用.net3.5之后的SocketAsyncEventArgs复用确实可以弥补不断产生IAsyncResult所带来的性能损失,但目前我不能解决的是服务器端的一对多广播问题。举个例子:
A通过服务器将某数据包广播给B和C,同时B通过服务器将另一个数据包广播给A和C,而数据的发送缓冲是与SocketAsyncEventArgs对象绑定的,因此用于发送数据到C的SocketAsyncEventArgs对象此时会发生冲突,因为A和B都要使用该对象。
之前也考虑过使用发送队列,不过这样的话,一来数据不好管理,二来服务端发送数据的效率也会降低。
您有什么好的解决方法吗?希望赐教~
Kevin_qing 2012-03-20
  • 打赏
  • 举报
回复
忘了说,我那个server是c++的
Kevin_qing 2012-03-20
  • 打赏
  • 举报
回复
5000客户端,每客户端50ms一次请求,使用tcp nodelay,服务器iocp单线程io + 1逻辑线程,cpu消耗15-30基本上是kernel消耗。每秒有效数据请求10w次,回应10w次.
tcp noday产生大量ack碎片包,基本上5000客户端就要占70mbit网络,没法再测试更多链接了,实际数量流量大概在2mbytes/s,局域网测试的。


1000链接的话,你至少应该考虑用iocp了,另外要注意转发效率。尽量拼包一起发送。


dgwutao 2012-03-20
  • 打赏
  • 举报
回复
c#下的iocp通讯不是这么做的,你可以看一下SocketAsyncEventArgs。
mrsupersky 2012-01-20
  • 打赏
  • 举报
回复
另外建议使用PInvoke 调用WinSocket2+IOCP的Win32API
然后自己组织,因为.net 类库里的东西 确实涵盖了不少额外的东西。
mrsupersky 2012-01-11
  • 打赏
  • 举报
回复
你这个CPU 之所以这么高 我估计着可能 不是因为连接数



而是因为 1:30的比率吧 ,我想 在服务器端 应该做好 区域 比对,确定 周围是否有30个人 然后 才有必要发送。。。。

可以考虑设定 二维 的 群组的概念...
超级大笨狼 2011-03-20
  • 打赏
  • 举报
回复
够用不?一个服务器多少人游戏合适?
我打帝国时代的,最多8个人一局,250人房间。
帝国时代是10年前的东西,64k猫可以支持。
我一直想做个实验,做个简单的Winform,在一般网速下可以看到8个机器的鼠标事件,只是想,没动手,没压力没动力。
你要做啥样的游戏?千人在一线?
wanglovec 2011-03-19
  • 打赏
  • 举报
回复
确实效率差距很大,
无趣 2011-03-16
  • 打赏
  • 举报
回复
C#通信可配置的吧,没有完成端口的方式吗?搜搜看。
Sou2012 2011-03-15
  • 打赏
  • 举报
回复
C#是运行于虚拟机上的吧?和Java一样。 所以起点就慢了。

C#和Java应该是适合于网页游戏的服务器的。

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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