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

时间:2009-11-05 15:52:15

标签: c networking sockets network-programming

我想创建一个进行多个连接的TCP客户端,而从它们接收数据的select()循环在另一个线程中运行。我不确定这是否可行,因为select()循环已经在运行,因此即使处理了线程安全问题,我也看不到它会如何“注意到”添加了新的套接字。 / p>

有没有办法做到这一点,或者每次建立新连接时我是否必须生成新线程并使用recv()?

(为清晰起见而编辑)。

3 个答案:

答案 0 :(得分:2)

当然有可能。 select()函数接受三个集合中的文件句柄,一个用于读取,一个用于写入,一个用于错误。只需将您的套接字添加到读取集中,当服务器向您发送内容时您就会注意到。

This page代码显示了如何完成此操作。

答案 1 :(得分:0)

在客户端套接字上选择()的另一个好理由是跟踪传出的TCP连接进度。例如,这允许设置连接超时。

  • 将客户端套接字设置为非阻塞。
  • 调用connect()。可能会返回EINPROGRESS错误集(连接正在进行中,因为套接字是非阻塞的,所以不会被阻止)。
  • 现在select()使用FD_SET配置为跟踪客户端套接字为“可写”。你也可以设置超时。
  • 分析select()结果。
  • 分析上次客户端套接字操作是否失败或成功。

最有用的是你可以在不同状态的几个套接字上使用它。因此,您可以真正无阻塞地处理多个套接字(客户端,服务器,传出,侦听,接受...)。所有这一切只有一个主题。

答案 2 :(得分:0)

执行此操作的一种简单方法是在管道上同时select。安排完成后,线程也会在新连接上select,然后在管道上写一个字节。这会导致线程退出select。当它注意到管道是可读的时,它会读取字节以“重置”管道,以便它可以再次使用,更新其文件描述符集,然后返回select