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