在Linux上,select()如何确定何时可以在不阻塞的情况下写入TCP / IP连接?

时间:2015-04-17 17:14:38

标签: c linux sockets select tcp

从select()的联机帮助页:

  

将监视writefds中的那些是否写入不会阻止

对于与TCP / IP连接关联的文件描述符,select()函数如何确定何时可以在不阻塞的情况下写入连接?另一种表达我的问题的方法也是,select()将返回的条件是什么,表明文件描述符可以被写入而不会阻塞?

如果发送缓冲区已满,我假设select()不会返回fd_set中的fd。如果是真的,这是唯一的考虑因素吗?我可以想象许多可能的标准来确定写入是否应该阻塞,所以我很有兴趣知道它在Linux上是如何工作的。

2 个答案:

答案 0 :(得分:5)

当发送缓冲区中有空间时,它将指示FD是可写的。没有其他考虑因素。

连接时,这包括连接完成时的情况,因为当时有效地分配了发送缓冲区。

答案 1 :(得分:1)

如果您写入数据,它们不会立即传输到对等方,但它们首先存储在套接字缓冲区中。然后内核将数据从套接字缓冲区中取出并传输它们。根据传输协议,数据可能会尽快传输(UDP),或者存在一些流量控制,导致数据保留在发送方,直到发送方确认它们(TCP)。如果有太多未确认的数据,它将停止处理套接字缓冲区内的数据,然后开始填充。一旦缓冲区中没有更多空间写入就会阻塞。一旦插槽缓冲区中有足够的空间再次写入,这将在select中发出信号。