非阻塞 select()?

mez*_*ezo 0 c++ sockets udp tcp

我正在尝试实现简单的网络游戏(客户端-服务器),它使用 UDP 通过网络传输游戏事件,并且我运行良好,但现在我想在同一控制台应用程序中通过 tcp 添加游戏聊天。我尝试使用select()非阻塞主套接字来实现多客户端聊天。聊天作为独立应用程序运行,但我在将其组合在一起时遇到问题。

基本上我的服务器循环如下所示:

while(true)
{
    sendUDPdata()
    ...

    while(true)
    {
        receiveUDPdata()
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我想将聊天添加到服务器的主循环(处理 UDP)时,如下所示:

while(true)
{
    HandleTCPConnections();

    sendUDPdata();
    ...

    while(true)
    {
        receiveUDPdata();
    }
}
Run Code Online (Sandbox Code Playgroud)

调用select()HandleTCPConnections()阻塞整个服务器。有什么办法可以处理这个问题吗?

Dav*_*rtz 5

有两种好方法可以做到这一点:

  1. 使用线程。有一个线程来处理 TCP 套接字,还有一个线程来处理 UDP 套接字。

  2. 使用反应器。UDP 代码和 TCP 代码都向反应器注册它们的套接字。反应器会阻塞所有套接字(通常使用poll),并在该套接字上发生活动时调用适当的代码。

如果您不想重新发明轮子,可以使用许多用于这两个选项的库(例如libeventboost.asio )。