2011-04-11 47 views
2

有没有办法让'select'等待读取和写入,同时也能够添加新的文件描述符?最好在一个线程上?C++ select异步编程

+0

如果你只有一个线程,那么谁是增加新的文件描述符? – 2011-04-11 20:06:48

+0

@Oli:我想OP只是想取消'select'调用并在另一个调用'select'之前添加描述符。 – 2011-04-11 20:09:52

+1

@Andre:但只有一个线程,*何时*他想要打破“选择”?有一些外部刺激吗? – 2011-04-11 20:11:22

回答

2

现在我知道你的场景是什么(一个基于套接字的服务器可能想接受新的传入连接),你知道你可以将你的监听套接字的文件描述符追加到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, ...); 
+0

该网站是非常有帮助的。谢谢! – Andrew 2011-04-11 20:54:51

3

据我所知,你可以在同一个线程中做,但不能在同一时间。在这样的问题中,我通常在描述符列表中添加我的虚拟回送套接字,并且每当我必须在FD_LIST中添加一个新的套接字时,我只是向我的虚拟套接字发送一个字节,并打破了选择循环。然后我可以更新FD_LIST,然后再次选择继续。

+0

您还可以使用最后一个参数向'select'调用添加超时。 – 2011-04-11 20:11:43

+0

当然可以。但在这种情况下,如果您在选择中使用较长的时间间隔,则必须等到新的套接字添加到FD_LIST中。如果在select中使用非常短的时间间隔,或者您不需要立即添加套接字,那么使用interval参数是不错的选择。 – Tayyab 2011-04-11 20:17:40