当通过调用select()
发信号通知套接字可以写入时,如何知道我可以不阻塞地发送多少数据? (在完全发送缓冲区等的情况下)
select()
返回的集合中的包含是否表示套接字已准备好至少一个字节的数据,然后send()
会返回写入字节的短计数?
或者当我使用大于可用缓冲区空间的send()
参数调用len
时,它会阻塞吗?如果是这样,我怎么知道最高金额?
我在Linux上使用常规C套接字。
答案 0 :(得分:5)
send
调用不应该在第一次调用时阻塞,并且应该在第一次调用时发送至少一个字节 - 假设您正在使用流协议并假设它没有被信号中断,等等。 ,实际上只有两种方法可以确定您可以发送多少数据:
每次致电select
后致电send
,查看是否可以发送更多数据。
将套接字置于非阻止模式,然后致电send
,直至出现EAGAIN
或EWOULDBLOCK
错误。
第二种选择是首选。 (第三种选择是在不同的线程中进行,只是让线程阻塞,这也是一个很好的解决方案。过去,线程实现并不那么成熟,因此非阻塞模式被视为高性能所必需的服务器。)
答案 1 :(得分:4)
你无法知道。你必须将套接字发送为非阻塞,然后注意返回值,告诉你它已经写了多少。