【问题标题】:Windows Sockets understanding recv and sendWindows Sockets 理解接收和发送
【发布时间】:2019-07-10 20:28:03
【问题描述】:

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

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

然后是这个:

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

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

recv(clientSocks, buf, 2000, 0)

对吗?

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

编辑:

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

【问题讨论】:

  • 它是TCP 套接字吗? send(serverSocks, "Size: 1348", strlen("File Size: 1348", 0) 没有意义。如果您可以编译,那将是未定义的行为,因为您将在字符串文字 Size: 1348 之后在内存中读取。
  • 是的,它是一个tcp套接字,我编辑了代码,对不起。
  • 我应该使用 sizeof() 吗?编辑:我再次编辑了代码,对不起。
  • TCP 是一种流协议。如果您想要比“八位字节序列”更多的结构,则需要在其之上实现自己的协议。
  • 是的,这是有道理的,如果我喜欢,“客户端:大小是这样的”->“服务器:确认”->“客户端:发送数据”。这样,我可以确保客户端发送的所有消息都是另一条消息的一部分。艾

标签: c++ windows sockets


【解决方案1】:

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

recv(clientSocks, buf, 2000, 0)

对吗?

是的。

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

您必须以这样一种方式构建每条消息,以便接收者知道一条消息的结束位置和下一条消息的开始位置。您可以:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 2015-11-12
    • 2011-08-06
    • 2018-05-03
    • 2020-06-08
    • 1970-01-01
    • 2013-02-15
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多