我正在尝试使用UDP通过网络传输游戏事件的简单网络游戏(客户端 - 服务器),我有这个工作得很好,但现在我想在同一个控制台应用程序中通过tcp添加到游戏聊天。我尝试使用select()
和非阻塞主套接字实现多客户端聊天。聊天是作为独立的应用程序工作,但我把它放在一起有问题。
基本上我的服务器循环如下所示:
while(true)
{
sendUDPdata()
...
while(true)
{
receiveUDPdata()
}
}
问题是,当我想将聊天添加到服务器的主循环(处理UDP)时,如下所示:
while(true)
{
HandleTCPConnections();
sendUDPdata();
...
while(true)
{
receiveUDPdata();
}
}
在select()
中调用HandleTCPConnections()
阻止整个服务器。有什么方法可以解决这个问题吗?
答案 0 :(得分:4)
有两种好方法可以做到这一点:
使用线程。有一个线程来处理你的TCP套接字和一个线程来处理你的UDP套接字。
使用反应器。 UDP代码和TCP代码都将它们的套接字注册到反应器。反应器阻塞所有套接字(通常使用poll
),并在该套接字上发生活动时调用相应的代码。
对于这两个选项(例如libevent和boost.asio),有许多库可供您使用,如果您不想重新发明轮子。
答案 1 :(得分:0)
select
是阻止调用。
您的聊天既可以与服务器一起运行,也可以与服务器并行运行:您已经有了第一个案例;对于第二个,你最好去一个处理聊天的单独线程。 C ++有<thread>
,您可能需要查看。
在这种情况下,单独的线程更容易实现,因为您有一个单独的连接,因此需要单独的套接字,以便进行并发访问。