select()可以用于客户端,而不仅仅是服务器吗?

我想创建一个进行多个连接的TCP客户端,而从它们接收数据的select()循环在一个单独的线程中运行。我不确定这是否可行,因为select()循环已经在运行,因此我不知道它是如何“注意到”即使线程安全问题得到处理也会添加新的套接字。 有没有办法做到这一点,或者我必须生成一个新线程并在每次建立新连接时使用recv()? (为清晰起见编辑。)     
已邀请:
当然有可能。
select()
函数接受三组文件句柄,一组用于读取,一组用于写入,一组用于错误。只需将您的套接字添加到读取集中,当服务器向您发送内容时您会被注意到。 此页面包含显示如何完成此操作的代码。     
在客户端套接字上选择()的另一个好理由是跟踪传出的TCP连接进度。例如,这允许设置连接超时。 将客户端套接字设置为非阻塞。 调用connect()。可能它会返回EINPROGRESS错误集(连接正在进行中,因为套接字是非阻塞的,所以不会被阻止)。 现在select()配置FD_SET以跟踪客户端套接字为'write-ready'。你也可以设置超时。 分析select()结果。 分析上次客户端套接字操作是否失败或成功。 最有用的是你可以在不同状态的几个套接字上使用它。因此,您可以真正无阻塞地处理多个套接字(客户端,服务器,传出,侦听,接受...)。所有这一切只有一个线程。     
一个简单的方法是在管道上
select
。安排完成后,线程也会在新连接上
select
,然后在管道上写一个字节。这会导致线程退出
select
。当它注意到管道是可读的时,它会读取字节以“重置”管道,以便它可以再次使用,更新其文件描述符集,然后返回到
select
ing。     

要回复问题请先登录注册