【问题标题】:Multiple send() method calls and 1 receive method. Is this normal?多个 send() 方法调用和 1 个接收方法。这是正常的吗?
【发布时间】:2012-01-23 00:39:32
【问题描述】:

如果在客户端我连接到服务器并多次调用套接字上的Send()方法发送短数据,服务器有时只收到一个包含所有累积数据的“数据包”是否正常?多种发送方式的总和?

【问题讨论】:

标签: sockets network-programming


【解决方案1】:

是的。 TCP 是一个流,没有单独的“数据包”的概念 - 您应该期望一次接收一个字节的所有内容,所有内容合并在一起或介于两者之间。

唯一的保证是不会丢失任何数据,并且会按照您发送它的顺序到达。

【讨论】:

    【解决方案2】:

    是的,这对于基于 TCP 流的套接字来说是完全正常的。默认情况下,启用发送合并的Nagle algorithm,这会减少在短时间内传输的数据包数量。如果您希望每个send() 传输自己的数据包,则必须禁用该算法。有时在特殊情况下需要这样做,但通常默认行为对于大多数套接字使用来说是足够且可取的。

    【讨论】:

    • 即使您禁用 Nagle,您也可能在单个接收缓冲区中获得多个 send()s,例如因为多个 IP 数据报在接收进程安排之前到达,或者由于重传或发送窗口已满而在一个 IP 数据报中发送。
    猜你喜欢
    • 2018-12-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多