我必须在C中实现一个游戏服务器,它可以处理多个客户端并不断与它们交换信息。客户端可能不会一直发送信息。我应该为它们分配一个带有非阻塞套接字的线程,还是使用select()调用。
哪一个更好?
答案 0 :(得分:0)
在大多数情况下,两者都可以正常工作。请注意,线程版本将使用阻塞套接字,而基于选择的套接字使用非阻塞套接字。对于服务器,您可能会觉得收到的数据事件是一个很好的模型。
线程版本将为每个线程(通常是页面大小)分配堆栈的内存开销,但您可以编程,就像您只有一个客户端一样。
规范版本需要在回调之间保持状态,这可能更有效,但同样,在服务器中感觉很自然。
答案 1 :(得分:0)
select()是要走的路,这就是它的用途。如果您采用线程非阻塞方法,则必须在每次tick后实现sleep,否则线程将使用所有可用的cpu时间。因此,如果一个客户端正在发送数据,最坏情况的响应时间就是您的睡眠值。您还可以为每个套接字实现一个线程并使其阻塞,但是根据您拥有的套接字数量,这将是一个很大的开销。
使用select(),您可以一次监视所有套接字(无论它们是否阻塞,顺便说一下),只需要处理那些活动的套接字。
如果你在linux上有很多套接字要看,你可以看看epoll()