在阻塞模式下 send() 之后我可以立即释放我的数据吗?

Fra*_*y I 2 c sockets

文档说发送:

当消息无法放入套接字的发送缓冲区时,send() 通常会阻塞,除非套接字已置于非阻塞 I/O 模式。在非阻塞模式下,在这种情况下它将返回 EAGAIN。select(2) 调用可用于确定何时可以发送更多数据。

我处于阻塞模式,正在执行以下操作:

buf = malloc(size);

send (socket, buf, size);

free(buf)
Run Code Online (Sandbox Code Playgroud)

假设但非常大,大于缓冲区一次可以容纳的大小(因此它需要以两个块的形式进入缓冲区)。无论如何,在发送后我所处的阻塞模式下,数据被完全复制或处理并因此可删除,我可以放心吗?

mcl*_*fix 5

在阻塞模式下,send将阻塞直到 I/O 完成或触发错误。您应该检查返回的值,因为send操作不能保证发送的字节数与作为第三个参数传递的字节数相同。

只有当send返回的值等于发送的缓冲区的大小时,您才能确定整个块已被复制到内核内存中,或通过设备内存,或发送到目的地。