游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12102|回复: 6

C#作为游戏服务器 异步Socket?IOCP?

[复制链接]

2

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2012-8-28 09:16:00 | 显示全部楼层 |阅读模式
大家好,最近要C#编写了一套游戏服务器,使用的方式是异步Socket
如:
public IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state);
public IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state);

我想了解一下是否有更优的方式来处理游戏服务器端的Socket?
IOCP是否比异步Socket要更加优秀?
使用异步Socket和IOCP的方式,最大的并发客户端承载量能达到多少?

我每次的收发包大概在200到300个字节左右(已经压缩过了)
我试验过,1000个并发客户端是不存在问题的
客户端和服务器端是1对1的关系,不存在广播

请各位高手赐教!谢谢

2

主题

683

帖子

687

积分

高级会员

Rank: 4

积分
687
发表于 2012-8-28 10:03:00 | 显示全部楼层

Re:C#作为游戏服务器 异步Socket?IOCP?

C#的异步接口下面就是iocp

1

主题

217

帖子

375

积分

中级会员

Rank: 3Rank: 3

积分
375
发表于 2012-8-30 12:03:00 | 显示全部楼层

Re:C#作为游戏服务器 异步Socket?IOCP?

SocketAsyncEventArgs
cpu E2160,每秒收发各2万5千次

29

主题

38

帖子

384

积分

中级会员

Rank: 3Rank: 3

积分
384
QQ
发表于 2013-10-23 10:48:58 | 显示全部楼层
使用BeginSend和 BeginReceive应该是最好的办法。但是BeginSend和BeginReceive不能控制thread pool个数。处理completion的Routine如果不能尽快进行Return,处理async callback的线程数可能会一直增加到500个。这样一来服务器性能肯定会急剧下降。
最好是将线程数设置成在达到一定数量后不再增加的模式,但我不知道C#有没有这种控制函数。
如果要发挥最大性能,soket I/O部分使用C++和IOCP,之后在利用soket I/O的C#中放置C++/CLI进行处理可能会更好一些。
但处理200-300Byte数据的客户端处理1000个的状况其实并不难。

0

主题

49

帖子

344

积分

中级会员

Rank: 3Rank: 3

积分
344
发表于 2013-10-28 22:27:51 | 显示全部楼层
通俗的说,如果同时建立的连接单位级不上千,你用什么网络模式都差别不大。
如果大规模的,当然是IOCP了,原因是IOCP利用系统机制少做了一次IO拷贝,并且是数据准备完成以后才通知。这两处细微的优势只有在足够数量级的时候才能得以体现。

话说回来,C#做服务器恐怕本身就不太合适,建议你考虑C或者C++

0

主题

3

帖子

44

积分

新手上路

Rank: 1

积分
44
发表于 2013-10-30 11:03:19 | 显示全部楼层
同backstyle,当然是用SocketAsynchEventArgs了

1

主题

217

帖子

375

积分

中级会员

Rank: 3Rank: 3

积分
375
发表于 2013-11-1 11:34:55 | 显示全部楼层
推荐使用 photon ,别自己写了;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 08:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表