【发布时间】:2012-03-25 23:09:33
【问题描述】:
我正在通过非阻塞 TCP 套接字发送各种自定义消息结构。我想在一次 send() 调用中发送整个结构,或者如果发送缓冲区中只有部分消息的空间(即 send() 返回 EWOULDBLOCK),则返回不发送任何字节的错误。如果没有足够的空间,我会丢弃整个结构并报告溢出,但我希望之后可以恢复,即接收者只接收到一系列有效的完整结构。有没有办法检查发送缓冲区的可用空间,或者告诉 send() 调用按照描述的方式执行?基于数据报的套接字不是一个选项,必须是基于连接的 TCP。谢谢。
【问题讨论】:
-
简而言之:没有。即使您能够将其一件件发送,也不能保证收件人会一件件收到它。 (甚至不能保证他会得到它)
-
Check that write()/send() can process whole buffer without block, fail otherwise (no partial write) 的可能重复项(看起来答案是
SOCK_SEQPACKET可能在 Linux 上做你想做的事,但我找不到任何证据证明这是由POSIX) -
wildplasser 是正确的,但是...如果您的消息小于路径 MTU,您可以在绝大多数时间得到您想要的。然而。无论如何,根据我的经验,您不能依靠 PMTU 在公共互联网上保持不变。
标签: linux sockets tcp buffer send