【问题标题】:How to deal with two sockets, when one socket is doing things in background当一个socket在后台做事时,如何处理两个socket
【发布时间】:2016-09-19 12:25:19
【问题描述】:

我正在使用套接字创建程序。我有两个套接字:一个用于监听,一个用于连接到外部服务器。 一是连接到无限循环中的服务器读取数据,服务器不断地将数据流式传输到我的程序,并“实时”将该数据写入输出。

第二个是监听消息——当消息为 PAUSE 时,程序应该停止从第一个套接字读取数据。

遇到这种情况怎么办? Poll()/select() 不是解决方案,因为这两个套接字需要同时工作,并且当 poll 检测到要从套接字一个读取的数据时,我将进入无限循环,并停止侦听第二个套接字。

我曾想过要打破在恒定时间内从服务器读取数据的无限循环,但是当消息到来时它必须等待。

请帮帮我!

【问题讨论】:

  • 我不明白为什么 poll/select 不是这里的解决方案 - 为什么你“进入无限循环并停止收听”?不过,多线程是另一种可能的解决方案。
  • 在一个线程根据需要不断监听的情况下使用多线程。或者定期轮询套接字并将接收到的数据排入某种缓冲区/队列。
  • @OliverCharlesworth poll/select 等待一个或多个文件描述符“准备好”,我的第一个套接字总是准备好,那么第二个套接字应该“说”什么呢?
  • @Michocio,选择/轮询允许多个套接字在单个时间点“准备好”(据我所知)。您将按顺序浏览它们。
  • @thcpx “在某个时间点“准备好”是什么意思?

标签: c++ c sockets tcp udp


【解决方案1】:

我最好的建议是epoll(),因为我使用它,但我相信你也可以使用 poll()select() .阅读手册并尝试一下。

Here 是一个很好的使用示例。

祝你好运。

【讨论】:

    【解决方案2】:

    在您的情况下,我会使用 epoll 和多个线程。当然,您必须处理多线程的所有有趣的潜在问题,例如饥饿或死锁。我找到了this 资源,它可以帮助您实施这样的解决方案。

    如果您需要有关epoll 本身的更多信息,请查看c10k 问题中的epoll section。还有这个link 谈到异步编程中的 epoll。

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2012-04-20
      • 1970-01-01
      • 2012-07-25
      • 2021-02-24
      • 2013-10-18
      相关资源
      最近更新 更多