【问题标题】:internal working of the recv socket apirecv 套接字 api 的内部工作
【发布时间】:2011-04-26 09:31:40
【问题描述】:

我正在使用 c++ 开发 TCP 客户端服务器应用程序。此项目中现在允许使用第三方库。

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

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

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

我的查询
1. 上述假设是否正确?
2. 如果上述假设是正确的,那么如何解决这个问题。

【问题讨论】:

  • 看看this的问题,它讨论了你应该如何通过TCP处理来自服务器的消息。
  • 感谢 cpx 我认为它应该可以工作
  • 你是对的:recv 可能会完整返回两条消息。在其他情况下,recv 可能只返回消息的一部分,或者它可能返回所有 msg1 和部分 msg2。简而言之,recv 不知道也不尊重生成数据流的send 调用序列。 TCP 将保证的是:它返回的所有字节都是有序的,没有任何跳过。 (注意,其他规则适用于 UDP 或其他协议。)

标签: c++ tcp network-programming


【解决方案1】:

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

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

【讨论】:

  • Sjoerd 我同意你的看法。你能给我一些例子或案例吗......这样我就可以开始了。
  • 是否会在此处查看标头并获取消息大小,然后读取其余字节?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 2013-11-06
    • 2019-07-14
    • 1970-01-01
    • 2016-06-29
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多