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

lxg*_*xgr 8 c sockets select

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

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

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

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

Die*_*Epp 5

send呼叫不应在第一次调用块,并应在第一次通话发送至少一个字节-假设你使用的是流协议,并假设它没有信号中断等,但实际上只有两种方式弄清楚你可以发送多少数据:

  1. select每次通话后拨打电话,send查看是否可以发送更多数据.

  2. 将套接字置于非阻塞模式,并调用send直到它给出EAGAINEWOULDBLOCK出错.

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