是否可以触发1次发送触发的2次接收回叫?

时间:2013-07-29 15:10:35

标签: c++ c networking tcp io

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

编辑: (更多解释),这是否属于(TCP阻塞)?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

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