【问题标题】:Is it possible to fire 2 receive callback which is fired by 1 send?是否可以触发由 1 个发送触发的 2 个接收回调?
【发布时间】:2013-07-29 15:10:34
【问题描述】:

我正在做一个网络项目。我必须知道,如果我将数据从客户端发送到服务器侦听器,侦听器可以使用 2 个或更多回调(TCP 阻塞)处理此数据吗?即我已经发送了“Hello World”,服务器监听器(TCP 阻塞)可以像 1“Hello”2“World”或 1“Hell”2“o World”等一样处理这个接收吗?如果这是可能的,我将为我的 TCP 数据包创建一个数据包处理程序。谢谢!

编辑: (更多描述),这可能吗(TCP 阻塞)?

  • 客户说“Hello world”
  • 服务器在第一个回调 "recv();" 中读取“Hello”(recv(); 函数给出“Hello”输出)
  • 服务器在第二次回调 "recv();" 中读取“world”(recv(); 函数给出“world”输出)

【问题讨论】:

  • 绝对有可能,分片掌握在底层网络手中。
  • 对于分片,你可以这样做,你甚至可以有2个以上的分裂。这取决于 tcp ip 堆栈。

标签: c++ c networking tcp io


【解决方案1】:

是的,这是绝对可能的。在这种特殊情况下,这是不太可能的,但是如果您的数据包比 12 字节大一点——比如几百或几千字节,如果您将它发送到比本地网络更远的地方,它几乎肯定会被拆分。

需要注意的是,你也可以得到相反的问题——发送方发送两个单独的“数据包”,而接收方只收到一个数据块。请记住,TCP 是流协议,而不是数据包协议 - 数据包仅作为底层协议栈的一部分存在,并且可以根据网络认为合适的方式拆分和合并。您可以保证收到的数据顺序正确,并且数据块的校验和是正确的。

【讨论】:

  • 这意味着我必须创建自己的数据包处理系统。谢谢!
【解决方案2】:

如果您确切知道数据的每个部分有多长(例如,“Hello”是 5 个字符长),您可以在第一个回调中阻止读取,然后在第二个回调中阻止读取(分别调用 recv())。

或者,如果您知道这些部分将如何分隔(在您的情况下是空格),那么您可以在第一次回调中将 recv() 1 个字节,然后,当您收到分隔符时,切换到在第二次回调中接收。

或者,也许您可​​以使用您的特殊协议(如果有的话)来区分它们。

但是,我仍然不确定您希望在哪一层单独解释这些包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多