C++ 处理TCP数据时的预期情况

C++ 处理TCP数据时的预期情况,c++,tcp,recv,C++,Tcp,Recv,我正在使用POSIX操作系统(vxWorks),希望了解如何处理TCP数据。我知道在UDP中,一切都取决于您,TCP在底层的管理要多得多 假设我连接的远程套接字承诺向我发送JSON数据。文档简单地说,一旦建立,我们将向您发送JSON数据 在TCP套接字上使用函数recv,并假设我给它提供了一个极端大小的缓冲区,那么即使消息可能在接口层上以多个块发送,我是否希望始终能够获得完美组装的JSON数据,或者我需要解析我收到的每个数据缓冲区,直到我认为我有一个完整格式的JSON消息吗?TCP不知道应用程序

我正在使用POSIX操作系统(vxWorks),希望了解如何处理TCP数据。我知道在UDP中,一切都取决于您,TCP在底层的管理要多得多

假设我连接的远程套接字承诺向我发送JSON数据。文档简单地说,一旦建立,我们将向您发送JSON数据


在TCP套接字上使用函数
recv
,并假设我给它提供了一个极端大小的缓冲区,那么即使消息可能在接口层上以多个块发送,我是否希望始终能够获得完美组装的JSON数据,或者我需要解析我收到的每个数据缓冲区,直到我认为我有一个完整格式的JSON消息吗?

TCP不知道应用程序消息。如果您的协议有消息边界,您需要在TCP之上实现分层协议以查找消息边界。

您需要连接所有数据,然后在收到所有数据后将其解析为JSON。正确。您可以获得比预期更多或更少的字节。最简单的方法通常是使用一种“帧协议”,在这种协议中,您可以发送一个4字节的整数作为每条消息的前4个字节。那么,如果我说,嘿
send
这个JSON数据甚至没有那么大(1kb),它可以
recv
以许多不同的块潜在地返回给我?它甚至可以在同一条消息中包含一个JSON对象的结尾和另一个JSON对象的开头吗?@ony_pox232是的,是的。TCP是一个字节流,它没有消息的概念,因此发送的每一条消息都必须以这样一种方式进行构架,即接收方知道一条消息的结束和下一条消息的开始。例如,在发送JSON之前先发送JSON的长度。或者在JSON之后发送一个永远不会出现在JSON本身中的终止分隔符。在TCP之上运行的每个协议都是这样工作的。@ony_pox232是的。TCP流只是一个有序的字节流,
recv
只返回流中当前可用的字节。因此,每次调用
recv
时,您可能只得到一个字节(或者根本没有),或者您可能会得到表示数千条消息的几GB字节。它只是一个字节流——由你来解析和理解这个流(不管你得到的数据块大小如何)。第一个问题的答案是肯定的。第二个问题的答案是,TCP并不能阻止这种情况的发生,但上面的应用程序协议可能会阻止这种情况的发生。例如,它可以指定只发送一个JSON对象,并且在确认第一个JSON对象之前不会发送另一个JSON对象。您必须根据其规范实际实现在TCP之上分层的特定协议。