使用select()时send()会阻塞吗?

时间:2012-01-15 21:35:35

标签: c sockets select

当通过调用select()发信号通知套接字可以写入时,如何知道我可以不阻塞地发送多少数据? (在完全发送缓冲区等的情况下)

select()返回的集合中的包含是否表示套接字已准备好至少一个字节的数据,然后send()会返回写入字节的短计数?

或者当我使用大于可用缓冲区空间的send()参数调用len时,它会阻塞吗?如果是这样,我怎么知道最高金额?

我在Linux上使用常规C套接字。

2 个答案:

答案 0 :(得分:5)

send调用不应该在第一次调用时阻塞,并且应该在第一次调用时发送至少一个字节 - 假设您正在使用流协议并假设它没有被信号中断,等等。 ,实际上只有两种方法可以确定您可以发送多少数据:

  1. 每次致电select后致电send,查看是否可以发送更多数据。

  2. 将套接字置于非阻止模式,然后致电send,直至出现EAGAINEWOULDBLOCK错误。

  3. 第二种选择是首选。 (第三种选择是在不同的线程中进行,只是让线程阻塞,这也是一个很好的解决方案。过去,线程实现并不那么成熟,因此非阻塞模式被视为高性能所必需的服务器。)

答案 1 :(得分:4)

你无法知道。你必须将套接字发送为非阻塞,然后注意返回值,告诉你它已经写了多少。