如何以原子方式发送()缓冲区,以便它们不会被部分分派?

Posted

技术标签:

【中文标题】如何以原子方式发送()缓冲区,以便它们不会被部分分派?【英文标题】:How to send() buffers atomically, so that they are not dispatched partial? 【发布时间】:2013-10-04 23:26:20 【问题描述】:

目前我遇到了一个问题,如果我发送一个缓冲区,它可能只发送部分并返回发送的字节数。有没有办法设置一些选项或某事。防止bsd套接字部分发送?

【问题讨论】:

你可以试试 TCP corking。 UDP 应该总是发送完整的数据报。 我相信软木塞只是一个提示。它当然不能阻止所有的部分发送。 【参考方案1】:

一般情况下,使用SOCK_STREAM 套接字类型(例如 TCP)无法做到这一点。 SOCK_DATAGRAM(对于 IP,这意味着 UDP)和 SOCK_SEQPACKET(对于 IP,没有这样的东西)会做你想做的事,但有不同的限制。

无论如何,解决方案是您需要自己进行数据缓冲和成帧。也就是说,您需要在发送的流中包含带内信息,以使接收者能够重建您想要的“数据包”边界。

【讨论】:

以上是关于如何以原子方式发送()缓冲区,以便它们不会被部分分派?的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 如何分块文件以进行同时/异步处理?

如何以原子方式运行 2 个 SQL“SELECT”?或者在我处理它们之前获取行数的任何其他更好的方法

将模型与应用程序的其余部分分开是一种好的编程习惯吗

如何以原子方式删除和获取行数据? [关闭]

如何访问我的音频流,以便将它们定向到不同的音频输出

如何在使用之前清除内部服务器套接字缓冲区的内容