【问题标题】:c++ select async programmingc++ 选择异步编程
【发布时间】:2011-04-12 04:18:37
【问题描述】:

有没有办法让“选择”等待读取和写入,同时还能够添加新的文件描述符?最好在一个线程上?

【问题讨论】:

  • 如果你只有一个线程,那么谁在添加新的文件描述符?
  • @Oli:我认为 OP 只是想取消 select 调用并在再次调用 select 之前添加描述符。
  • @Andre:但是只有一个线程,什么时候他想打破select?是否有一些外部刺激?
  • @Oli:嗯,我实际上在使用套接字。所以可能会有更多的客户端连接。
  • @Andrew:但大概您的侦听套接字是该选择的一部分,因此当新客户端连接时,选择 确实 返回,允许您更改下一个 fd 集打电话。

标签: c++ select asynchronous


【解决方案1】:

现在我知道您的场景是什么(基于套接字的服务器可能想要接受新的传入连接),您是否知道可以将侦听套接字的文件描述符附加到select 的列表中?参见例如http://www.lowtek.com/sockets/select.html.

(转述示例:)

fd_set socks;

FD_ZERO(&socks);

// Add listener socket
listen(sock, n);
FD_SET(&socks, sock);

// Add existing socket connections
for (i = 0; i < num_existing_connections; i++)
{
    FD_SET(&socks, connection[i]);
}

// Will break if any of the existing connections are active,
// or if a new connection appears.
select(..., &socks, ...);

【讨论】:

  • 这个网站很有帮助。谢谢!
【解决方案2】:

据我所知,您可以在同一个线程中执行此操作,但不能同时执行。在这样的问题中,我通常在描述符列表中添加我的虚拟环回套接字,每当我必须在 FD_LIST 中添加一个新套接字时,我只需向我的虚拟套接字发送一个字节,它就会中断选择循环。然后我可以更新 FD_LIST 并再次选择继续。

【讨论】:

  • 您还可以使用最后一个参数为select 调用添加超时。
  • 当然可以。但是在这种情况下,如果您在选择中使用较长的时间间隔,那么您必须等到您的新套接字被添加到 FD_LIST 中。如果您在 select 中使用非常短的间隔或者您不需要立即添加套接字,那么使用间隔参数是一个不错的选择。
猜你喜欢
  • 2018-03-08
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2016-09-28
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多