PiL*_*YeR 1 c c++ sockets networking select
我正在开发一个MMO游戏服务器项目,我遇到了问题.这是select()方法的限制.我想用一个线程处理超过1024个套接字I/O. 我想用单线程做这个,因为我试图建立一个多线程处理系统.该系统创建了3个线程(例如4核处理器; 1个是main,3个是select()处理程序)处理select()方法,但是还有另一个问题,现在我们的限制变为3072(1024*3)那不是解决方案!在那个想法之后,我想创建一个非阻塞套接字系统,在这个系统中,我在这样的单个线程中调用了2个不同的select方法; "select()select()".它们按顺序返回,我可以按顺序处理它们.但我认为还有另一个问题.如果我想实现像"
注意:我不想使用poll-epoll-wsapoll等.(民意调查不能处理微秒,它不像选择那么快!)和像第三方库一样的解放(我想自己做!)
最终解决方案(我认为):我不需要为I/O操作处理纳秒,因为没有意义来处理它.轮询是处理超过1024个套接字I/O的好方法.我将研究一些用于理解MMO系统的东西.最后一个是我会做一些测试,在问一个问题之前我会尝试一些事情:)谢谢!
编辑:我是这个Q&A平台的新手.在给出负面观点后,你能告诉我我的问题有什么问题吗?:)
select这很多(数千)连接的使用从根本上是错误的.虽然select当你只有很少的插座(可能是几十个)时通常会更快,但它可以扩展到几千个甚至更多.在我知道的任何地方,select随着连接的数量线性减速(它甚至比这更糟糕,但我不会详细介绍.)
即使poll没有比select扩展到数千个连接更好.它对select您可以轮询的文件描述符的数量没有(低)限制,但它仍然与连接数呈线性关系.
您真正应该使用的是特定于平台的设施,例如epoll和kqueue.它们的扩展性能更好(通常为O(1)),但显然它们不便携.
我认真地建议您考虑类似libev的东西,它是一个可移植的,经过高度测试的,并且是围绕特定于平台的设施和服务的薄包装器.
这是因为特定于平台的方法(例如select,poll,epoll,kqueue,I/O完成端口,事件端口等)是不同的形式相互没有人可以用一个以上或两个平台,或它们的限制和细节他们的行为略有不同.这些设施甚至可能从一个版本的操作系统更改为下一个版本(例如,epoll在Linux 2.6.9,IIRC上).
即使您不关心代码的可移植性或面向未来,这样的库可以为您提供更多功能和更好的界面.
您可以尝试的另外两个库是libevent(更大更慢,但更多功能)和libuv(如果您需要Windows可移植性.)