处理 TCP 流

Sig*_*101 1 c++ client tcp c++builder-5

我们的服务器似乎是基于数据包的。它是对旧的基于串行的系统的改编。多年来,它已被添加、修改、重建等。由于 TCP 是流协议而不是数据包协议,因此有时数据包会被分解。ServerSocket 的设计方式是,当 Client 发送数据时,部分数据包含我们消息的大小,例如55. 有时这些数据包被分成多个部分。它们按顺序到达,但由于我们不知道消息将如何拆分,因此我们的服务器有时不知道如何识别拆分消息。

所以,已经给了你背景信息。如果数据包被拆分,重建数据包的最佳方法是什么?我们正在使用 C++ Builder 5(是的,我知道,旧的 IDE,但这是我们目前可以使用的全部。大量工作需要在 .NET 或更新的技术中重新设计)。

ere*_*eOn 5

TCP 保证数据将按照发送的顺序到达。

也就是说,您可以将所有传入的数据附加到缓冲区。然后检查您的缓冲区是否包含一个或多个数据包,并将它们从缓冲区中删除,将所有剩余数据保留在缓冲区中以备将来检查。

当然,这假设您的数据包有一些标头指示以下数据的大小。

让我们考虑具有以下结构的数据包:

[LEN] X X X...
Run Code Online (Sandbox Code Playgroud)

其中LEN是数据的大小,每个 X 是一个字节。

如果您收到:

4 X X X
[--1--]
Run Code Online (Sandbox Code Playgroud)

数据包不完整,您可以将其留在缓冲区中。然后,其他数据到达,您只需将其附加到缓冲区:

4 X X X X 3 X X X
        [---2---]
Run Code Online (Sandbox Code Playgroud)

然后,您有 2 条完整的消息可以轻松解析。

如果您这样做,请不要忘记以与主机无关的形式发送任何长度(ntohs并且ntohl可以提供帮助)。