如何在一个包中接收 TCP 套接字数据而不划分

How can I recv TCP socket data in one package without dividing

本文关键字:套接字 TCP 数据 划分 包中接 一个      更新时间:2023-10-16

由于我创建了一个TCP套接字,因此在发送少量 data.no 片段时可以。 所有数据都集中在一个包中。 但是当数据变得越来越大时。TCP包已被分成几部分。真的很烦人。是否有任何选项可以在插座上设置,插座会自动为我放入一个包装中?

这是一个字节流。 所有字节都将以正确的顺序正确到达,但不一定在您需要它们时到达。 如果您需要发送比一个字节更复杂的任何内容,则需要在TCP之上使用另一个协议。这就是为什么有所有其他TCP/IP协议,如HTTP,SMTP等。

不,

没有。 甚至在某些情况下,您可能会收到 1 个字节。

考虑使用更高级别的消息传递库,如 ZMQ。它为您处理所有消息打包和解包。

TCP为您提供可靠的双向字节流。它负责排序、传输层分组、重传和流量控制。数十年的研究都用于优化其性能。相当漂亮。您为所有这些便利付出的很小的代价是,您必须循环写入和读取流,在接收时监视可以处理的完整应用程序协议消息,并在发送时刷新尚未缓冲的字节。

欢迎来到套接字编程!

我会在这里插话并说,如果不在为您处理应用程序协议的库上添加额外的依赖项,您几乎无法解决问题。有一些较低级别的消息打包库(谷歌的协议缓冲区等)可能会有所帮助。

习惯于循环

读取和写入TCP数据可能是最有益的。它经过验证且非常便携。即使您在自己实际编写流编解码器时付出了很小的代价。

尝试几次。这是一种有用的体验,您可以重复使用,一旦掌握了窍门,它真的没有那么困难和烦人(就像其他任何东西一样,真的)。

此外,单元测试相当容易(而不是处理深奥的库和具有糟糕/稀疏文档选项的不常见协议)。

您可以通过使用 setsockopt()SO_RECVLOWAT 设置低水位线,在支持套接字读取的平台上优化套接字读取以返回更大的块。但是您仍然必须处理获取小于水印的字节的可能性。

我认为你想要SOCK_SEQPACKET(或者可能是SOCK_RDM)。请参阅套接字(2)。