首页 > 解决方案 > Windows Sockets 理解接收和发送

问题描述

我在这里有点困惑,说我这样做:

send(serverSocks, "Size: 1348", strlen("Size: 1348"), 0)

然后是这个:

send(serverSocks, "SomeDataThatIs1348LongAndThatNeedsToBeSent", strlen("SomeDataThatIs1348LongAndThatNeedsToBeSent"), 0)

由于它们是连续发送的,因此当我执行以下操作时,我有可能只收到一张:

recv(clientSocks, buf, 2000, 0)

正确的?

我将如何从服务器端接收它?还是我什至需要客户端先将大小发送到服务器?或者我可以在不知道大小的情况下接收整个数据?

编辑:

也许我需要让我的问题更清楚。我怎么知道这些数据是客户端发送的第一个(或第二个)数据的一部分?

标签: c++windowssockets

解决方案


由于它们是连续发送的,因此当我执行以下操作时,我有可能只收到一件:

recv(clientSocks, buf, 2000, 0)

正确的?

是的。

我将如何从服务器端接收它?

您必须以这样一种方式构建每条消息,即接收者知道一条消息在哪里结束,下一条消息在哪里开始。您可以:

  1. 在发送消息数据之前发送消息的长度。然后接收器可以先读取长度,然后读取跟随长度的特定字节数。

  2. 在每条消息的末尾附加一个唯一的分隔符,该分隔符永远不会出现在消息数据本身中,例如 ETX 字节、空终止符、换行符等。然后接收方可以读取字节,直到到达分隔符。

还是我什至需要客户端先将大小发送到服务器?或者我可以在不知道大小的情况下接收整个数据?

TCP 是一种流传输,它没有消息边界的概念,因此您必须在传输的数据本身中处理这一点。


推荐阅读