[英]Non-blocking select()?
我正在尝试实现简单的网络游戏(客户端-服务器),该游戏使用UDP通过网络传输游戏事件,并且我的工作情况很好,但是现在我想在同一控制台应用程序中通过tcp进行游戏聊天。 我尝试使用select()
和非阻塞主套接字实现多客户端聊天。 聊天正在作为独立应用程序运行,但是将其组合在一起时遇到了问题。
基本上,我的服务器循环如下所示:
while(true)
{
sendUDPdata()
...
while(true)
{
receiveUDPdata()
}
}
问题是,当我想像这样将聊天添加到服务器的主循环(处理UDP)时:
while(true)
{
HandleTCPConnections();
sendUDPdata();
...
while(true)
{
receiveUDPdata();
}
}
在HandleTCPConnections()
调用select()
阻塞整个服务器。 有什么办法可以解决这个问题?
有两种很好的方法可以做到这一点:
使用线程。 有一个线程来处理您的TCP套接字,并有一个线程来处理您的UDP套接字。
使用电抗器。 UDP代码和TCP代码都将其套接字注册到反应堆。 反应器在所有套接字上阻塞(通常使用poll
),并在该套接字上发生活动时调用相应的代码。
如果您不想重新发明轮子,可以使用很多库来使用这两个选项(例如libevent和boost.asio )。
如果您的套接字没有可用数据,则select
是阻塞调用。
您的聊天可以与服务器一起运行,也可以与服务器并行运行。 第二,您最好选择一个单独的线程来处理聊天。 C ++具有<thread>
,您可能需要研究一下。
在这种情况下,使用单独的线程更容易实现,因为您拥有单独的连接,因此也有了单独的套接字,否则,在进行并发访问时需要注意这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.