繁体   English   中英

非阻塞select()?

[英]Non-blocking select()?

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

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

while(true)
{
    sendUDPdata()
    ...

    while(true)
    {
        receiveUDPdata()
    }
}

问题是,当我想像这样将聊天添加到服务器的主循环(处理UDP)时:

while(true)
{
    HandleTCPConnections();

    sendUDPdata();
    ...

    while(true)
    {
        receiveUDPdata();
    }
}

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

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

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

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

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

如果您的套接字没有可用数据,则select 阻塞调用。

您的聊天可以与服务器一起运行,也可以与服务器并行运行。 第二,您最好选择一个单独的线程来处理聊天。 C ++具有<thread> ,您可能需要研究一下。

在这种情况下,使用单独的线程更容易实现,因为您拥有单独的连接,因此也有了单独的套接字,否则,在进行并发访问时需要注意这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM