recv套接字api的内部工作 我正在使用C++进行TCP客户端服务器应用程序的工作。第三方lib现在允许在这个项目中。

recv套接字api的内部工作 我正在使用C++进行TCP客户端服务器应用程序的工作。第三方lib现在允许在这个项目中。,c++,tcp,network-programming,C++,Tcp,Network Programming,在这里,客户端和服务器之间的交换使用定义良好的协议格式。一旦客户端接收到数据包,它将发送数据包进行解析。我有协议管理器,它将负责解析活动 我有以下疑问 当数据从网络到达客户端时, 操作系统缓冲它,直到应用程序调用recv函数 因此,两条消息msg1和msg2到达缓冲区,对recv的调用将返回msg1+msg2。 现在,这可能会导致解析活动失败 我的疑问 1.上述假设是否正确? 2.如果上述关联正确,那么如何解决此问题。TCP模拟流,因此在TCP中没有消息的概念。如果需要消息,应用程序必须有一些协

在这里,客户端和服务器之间的交换使用定义良好的协议格式。一旦客户端接收到数据包,它将发送数据包进行解析。我有协议管理器,它将负责解析活动

我有以下疑问 当数据从网络到达客户端时, 操作系统缓冲它,直到应用程序调用recv函数

因此,两条消息msg1和msg2到达缓冲区,对recv的调用将返回msg1+msg2。 现在,这可能会导致解析活动失败

我的疑问 1.上述假设是否正确?
2.如果上述关联正确,那么如何解决此问题。

TCP模拟流,因此在TCP中没有消息的概念。如果需要消息,应用程序必须有一些协议来分隔它们


UDP确实有一个消息,因此可以检索单独的消息。

您可以为消息使用LV协议长度值。 将消息长度编码为前1-4个字节,然后放入消息。 类似这样的内容,例如:14Hello world\0


在您的服务器中,当客户端发送内容时,您必须先录制前1-4个字节,然后再录制消息的长度。

Sjoerd我同意您的看法。您能给我一些示例或案例吗。。。因此,我可以从这里开始。在这里偷看标头并获取消息大小,然后读取剩余字节是否合适?看看问题,它讨论了如何通过TCP处理来自服务器的消息。感谢cpx,我认为它应该起作用。您是对的:recv可能会完整返回两条消息。在其他情况下,recv可能只返回消息的一部分,也可能返回全部msg1和部分msg2。简而言之,recv不知道也不尊重生成数据流的发送调用序列。TCP保证的是:它返回的所有字节都是有序的,没有跳过任何内容。注意:其他规则适用于UDP或其他协议。