文档说发送:
当消息不适合套接字的发送缓冲区时, send()通常是块,除非套接字已被放置在非块中 - 进行I / O模式。在非阻塞模式下,它将返回EAGAIN 案件。 select(2)调用可用于确定何时可能 发送更多数据。
我处于阻止模式,按照以下方式执行操作:
buf = malloc(size);
send (socket, buf, size);
free(buf)
假设但是非常大,大于缓冲区一次可以容纳的数量(所以它需要进入缓冲区,因为两个块可以说)。无论如何,在发送之后我处于阻止模式中,我是否可以安全地将数据完全复制或处理并因此删除?
答案 0 :(得分:4)
在阻塞模式下,send
会阻塞,直到I / O完成或触发错误。您应该检查返回的值,因为send
操作不保证发送的字节数与第三个参数传递的字节数相同。
只有当send
返回的值等于发送的缓冲区大小时,才能确保整个块已被复制到内核内存中,或通过设备内存传递,或者发送到目的地。
答案 1 :(得分:1)
简短的回答是:是的,当文件描述符处于阻塞模式时,你可以在send()调用成功返回(没有错误)后释放缓冲区。
这样做的原因是阻塞概念本身:send()调用(以阻塞文件描述符为目标)仅在发生错误时返回,或者size
字节的数据在{{{ 1}}由操作系统的底层(通常是内核)缓冲或传输。
另请注意,send()的成功返回并不意味着数据已传输。这意味着它至少是由底层层缓冲的。