我正在为1000个客户端maxmimum编写套接字服务器,服务器是关于我的游戏,我使用非阻塞套接字和大约10个线程同时从不同的套接字接收数据(第一个线程从0到100,第二个从101-200等等..)
但是如果线程1想要向所有1000个客户端发送数据而线程2也想要同时向所有1000个客户端发送数据,那么这样安全吗?有没有机会在另一个(客户端)方面搞乱数据?
如果是的话,我想唯一可能发生的问题是,有时客户端会收到2或10个数据包作为1个数据包,这是正确的吗?如果有,是否有任何解决方案:(
最佳答案 处理许多套接字的常用模式是使用
select(2)
,
poll(2)
或更好的
kqueue(2)
或
epoll(4)
(取决于平台)作为套接字事件调度程序对I / O事件进行专用线程轮询.套接字通常以非阻塞模式处理.然后,可能有一些线程池对事件作出反应,并且可以直接读取和写入,也可以通过较低级别的缓冲区/队列进行读写操作.
这里适用各种技术 – 从队列到事件订阅白板.在I / O级别上复用接受/读取/写入/ EOF以及在应用程序级别上进行事件仲裁会变得棘手.像libevent
和boost::asio
这样的几个库帮助构建了较低级别(ACE库也在这个空间中,但我讨厌向任何人推荐它).您必须自己提出应用程序级协议和状态机(boost::statechart
可能会有所帮助).
一些很好的链接可以更好地理解你的反对意见(这可能是他们在这里提到的第一百万次):
> The C10K problem
> High-Performance Server Architecture
抱歉没有提供具体的解决方案,但这是一个非常广泛的设计问题,大多数决策在很大程度上依赖于上下文(尽管很有趣).希望这个对你有帮助.