首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞select()

非阻塞select()
EN

Stack Overflow用户
提问于 2015-10-20 18:39:03
回答 2查看 2.5K关注 0票数 0

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

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

代码语言:javascript
复制
while(true)
{
    sendUDPdata()
    ...

    while(true)
    {
        receiveUDPdata()
    }
}

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

代码语言:javascript
复制
while(true)
{
    HandleTCPConnections();

    sendUDPdata();
    ...

    while(true)
    {
        receiveUDPdata();
    }
}

select()中调用HandleTCPConnections()会阻塞整个服务器。有办法处理这件事吗?

EN

回答 2

Stack Overflow用户

发布于 2015-10-20 18:46:24

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

  1. 使用线程。有一个线程来处理TCP套接字,一个线程来处理UDP套接字。
  2. 用反应堆。UDP代码和TCP代码都向反应堆注册了它们的套接字。所有套接字上的反应堆块(通常使用poll),并在该套接字上发生活动时调用适当的代码。

对于这两个选项(如利贝特boost.asio),如果您不想重新发明方向盘,可以使用大量的库。

票数 4
EN

Stack Overflow用户

发布于 2015-10-20 19:09:39

在您的示例中,如果没有来自套接字的数据,select 就是阻塞调用。

您的聊天既可以与服务器一起运行,也可以与服务器并行运行:您已经得到了第一种情况;第二种情况,您最好选择一个单独的线程来处理聊天。C++有<thread>,您可能想了解它。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33244343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档