如何在一个包中接收 TCP 套接字数据而不划分
How can I recv TCP socket data in one package without dividing
由于我创建了一个TCP套接字,因此在发送少量 data.no 片段时可以。 所有数据都集中在一个包中。 但是当数据变得越来越大时。TCP包已被分成几部分。真的很烦人。是否有任何选项可以在插座上设置,插座会自动为我放入一个包装中?
这是一个字节流。 所有字节都将以正确的顺序正确到达,但不一定在您需要它们时到达。 如果您需要发送比一个字节更复杂的任何内容,则需要在TCP之上使用另一个协议。这就是为什么有所有其他TCP/IP协议,如HTTP,SMTP等。
没有。 甚至在某些情况下,您可能会收到 1 个字节。
考虑使用更高级别的消息传递库,如 ZMQ。它为您处理所有消息打包和解包。
TCP为您提供可靠的双向字节流。它负责排序、传输层分组、重传和流量控制。数十年的研究都用于优化其性能。相当漂亮。您为所有这些便利付出的很小的代价是,您必须循环写入和读取流,在接收时监视可以处理的完整应用程序协议消息,并在发送时刷新尚未缓冲的字节。
欢迎来到套接字编程!
我会在这里插话并说,如果不在为您处理应用程序协议的库上添加额外的依赖项,您几乎无法解决问题。有一些较低级别的消息打包库(谷歌的协议缓冲区等)可能会有所帮助。
习惯于循环读取和写入TCP数据可能是最有益的。它经过验证且非常便携。即使您在自己实际编写流编解码器时付出了很小的代价。
尝试几次。这是一种有用的体验,您可以重复使用,一旦掌握了窍门,它真的没有那么困难和烦人(就像其他任何东西一样,真的)。
此外,单元测试相当容易(而不是处理深奥的库和具有糟糕/稀疏文档选项的不常见协议)。
您可以通过使用 setsockopt()
和 SO_RECVLOWAT
设置低水位线,在支持套接字读取的平台上优化套接字读取以返回更大的块。但是您仍然必须处理获取小于水印的字节的可能性。
我认为你想要SOCK_SEQPACKET
(或者可能是SOCK_RDM
)。请参阅套接字(2)。
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- ASIO 的 TCP 套接字::async_wait() 并在此之后关闭套接字
- Visual Studio(C++):如何使用TCP套接字发送多个值
- TCP套接字(客户端-服务器)recv()返回-1值
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- C++中TCP套接字的recv函数
- 通过 TCP 套接字发送大型 base64 字符串
- 提升 ASIO TCP 套接字 1.70 不向后兼容
- 尝试连接到 TCP 套接字 (Linux) 时连接被拒绝
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 如何知道请求是否完全使用 TCP 套接字接收?
- Qt TCP 套接字 - 写入超过 15 个字节
- 要打开以供C++中的应用程序最佳使用的并行套接字/TCP连接数
- C++ 如何通过套接字 (TCP) 进行二进制序列化
- 套接字 TCP 服务器程序问题
- Cpp套接字-TCP传输(使用同一端口发送,然后接收)