select()的概念写入fd_set

时间:2010-11-22 10:30:08

标签: sockets networking select

根据我对select()的所有文档的理解,似乎可以使用select()写入fd_set来检查send()的{​​{1}}的套接字(描述符)是否可用可用于检测成功的非阻塞connect()尝试,但我没有得到的是套接字在成功connect()accept()后何时变得不可用? 这在理论上是否意味着套接字始终可用于send()

作为最后一个问题,将select()连接的套接字保留在整个会话的写入操作中是否切实可行?

感谢。

3 个答案:

答案 0 :(得分:3)

套接字无法写入的最常见情况是,当连接通过相对较慢的网络链接时,应用程序可能会饱和。操作系统将缓冲有限数量的数据,因此在发送更多数据之前,应用程序必须通过检查套接字是否可用(指示某些数据已发送且缓冲区具有可用空间)来限制自身。

至于你的另一个问题,如果你有一个单个线程使用的任何类型的多个套接字,例如,例如对于Web服务器,使用select()以便有效地管理它们当然是有意义的。

答案 1 :(得分:1)

使用非阻塞套接字时,任何操作都可能因WSAEWOULDBLOCK错误而失败。在connect()和send()的情况下,select()可用于确定挂起的connect()调用何时成功连接到服务器,或者套接字是否可写,以便它可以接受新数据而不会阻塞。 / p>

答案 2 :(得分:1)

'可用于发送'只是意味着套接字的发送缓冲区中有空间。大多数情况下都是如此,从连接完成和分配缓冲区开始。缓冲区填充时,这种情况永远是不真实的,而缓冲区填充只会在目标套接字的接收缓冲区填充时发生,只有在读取应用程序比写入程序慢时才会发生。