Windows套接字了解recv和发送

时间:2019-02-17 06:02:35

标签: c++ windows sockets

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

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

然后跟随此:

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

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

recv(clientSocks, buf, 2000, 0)

对吗?

我该如何从服务器端接收它? 还是我什至需要客户端首先将大小发送到服务器?还是我什至不知道大小就可以接收全部数据?

编辑:

也许我需要澄清我的问题。我该如何判断该数据是客户端发送的第一(或第二)数据的一部分?

1 个答案:

答案 0 :(得分:1)

  

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

     

recv(clientSocks,buf,2000,0)

     

对吗?

是的

  

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

您必须以使接收者知道一条消息的结尾和下一条消息开始的方式来构造每条消息。您可以:

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

  2. 在每条消息的末尾添加一个唯一的定界符,这些东西永远不会出现在消息数据本身中,例如ETX字节,空终止符,换行符等。接收方可以读取字节直到到达定界符为止。

  

还是我甚至需要客户端将大小首先发送到服务器?还是我什至不知道大小就可以接收全部数据?

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