【问题标题】:Do send/recv transfer data in identical chunks?发送/接收是否以相同的块传输数据?
【发布时间】:2012-01-30 20:57:51
【问题描述】:

来自我的客户:

send(socket, "this is a buffer", ...);
send(socket, "second buffer", ...);

在我的服务器上,recv 是否保证以来自 "this is a buffer"r 结束一个块,并以来自 "second buffer's 开始另一个块?

【问题讨论】:

    标签: c winsock send data-transfer recv


    【解决方案1】:

    不,一点也不。由于网络的所有处理,您无法控制收到数据时会发生什么。您无法对在任何 recv 调用中将获得多少做出任何假设(除非它将是

    【讨论】:

    • 我的意思是,在我的例子中,我是否会收到(例如)"a buffer\0second bu"
    • 如果答案是肯定的,我如何区分一个“数据包”和另一个?我应该使用某种终止序列吗?
    • 是的,您也可以收到。您需要在数据中包含一些内容来区分您的“数据包”。您可以制定一个约定,发送“数据包”的长度或某种在数据中看不到的分隔符。
    【解决方案2】:

    不,Windows 套接字(与其他基于 TCP 的抽象一样)是流式传输的。您正在寻找一种使用 Windows 套接字的打包方式。

    试试这个: http://tangentsoft.net/wskfaq/examples/packetize.html

    【讨论】:

    • 更准确地说,Windows TCP 套接字是流式传输的。相反,UDP 套接字是基于消息的。 TCP 套接字上的每个send() 只是将数据添加到流中,流上的send()recv() 之间没有一对一的关系。 UDP 套接字上的每个send() 发送一条不同的消息,并且消息之间存在一对一的关系。
    【解决方案3】:

    我不会依赖它。阅读时,您可能会一次获得所有内容。中间有很多事情 - 数据包重新排序、网络延迟等,会影响数据包实际到达另一端的时间,并且可能是第二个缓冲区可能比第一个缓冲区更快地通过并等待(如果你'正在使用 TCP,如果不是,则不使用)第一个到达。然后无论到达什么都会给你。您应该在接收端解析您的数据,而不依赖于它是如何发送的(TCP 为您提供了一定的顺序保证,UDP 也不这样做)。

    【讨论】:

      【解决方案4】:

      如果您希望 recv 在收到指定数量的字节之前一直阻塞,您可以使用标志 MSG_WAITALL。

      http://pubs.opengroup.org/onlinepubs/007904975/functions/recv.html

      【讨论】:

        【解决方案5】:

        对于 UDP 和其他数据报协议,数据包边界将根据需要保留。对于 TCP 和其他流协议,就没有这样的运气了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-15
          • 2011-08-04
          • 2013-07-18
          • 2014-01-14
          • 2018-01-26
          • 1970-01-01
          • 1970-01-01
          • 2017-06-25
          相关资源
          最近更新 更多