非阻塞select()?

时间:2015-10-20 18:39:04

标签: c++ sockets tcp udp

我正在尝试使用UDP通过网络传输游戏事件的简单网络游戏(客户端 - 服务器),我有这个工作得很好,但现在我想在同一个控制台应用程序中通过tcp添加到游戏聊天。我尝试使用select()和非阻塞主套接字实现多客户端聊天。聊天是作为独立的应用程序工作,但我把它放在一起有问题。

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

while(true)
{
    sendUDPdata()
    ...

    while(true)
    {
        receiveUDPdata()
    }
}

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

while(true)
{
    HandleTCPConnections();

    sendUDPdata();
    ...

    while(true)
    {
        receiveUDPdata();
    }
}

select()中调用HandleTCPConnections()阻止整个服务器。有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

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

  1. 使用线程。有一个线程来处理你的TCP套接字和一个线程来处理你的UDP套接字。

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

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

答案 1 :(得分:0)

如果在您的情况下没有来自套接字的数据,

select 是阻止调用。

您的聊天既可以与服务器一起运行,也可以与服务器并行运行:您已经有了第一个案例;对于第二个,你最好去一个处理聊天的单独线程。 C ++有<thread>,您可能需要查看。

在这种情况下,单独的线程更容易实现,因为您有一个单独的连接,因此需要单独的套接字,以便进行并发访问。