【问题标题】:What does it mean to flush a socket?冲洗插座是什么意思?
【发布时间】:2010-10-29 04:41:06
【问题描述】:

除了如何像文件一样读写套接字之外,我对套接字的了解并不多。我对使用套接字选择器有所了解。我不明白为什么你必须刷新一个套接字,那里到底发生了什么?这些位只是在记忆中的某个地方闲逛,直到它们被推开?我在网上看了一些关于套接字的东西,但都是非常抽象和高级的。

这里到底发生了什么?

【问题讨论】:

    标签: sockets networking


    【解决方案1】:

    写入网络套接字和发送数据会产生一定的开销。如果每次字节进入套接字时都发送数据,那么对于实际数据的每个字节,您最终会得到 40 多个字节的 TCP 标头。 (当然,假设您使用的是 TCP 套接字。其他套接字将具有不同的值)。为了避免这种低效率,套接字维护了一个本地缓冲区,该缓冲区通常超过 1000 字节。当该缓冲区被填满时,数据包会包裹一个标头,并将数据包发送到其目的地。

    在许多情况下,您不需要立即发送每个数据包;如果您正在传输文件,如果没有文件的最终数据,早期数据可能没有任何用处,因此效果很好。但是,如果您需要强制立即发送数据,则刷新缓冲区将发送任何尚未发送的数据。

    请注意,当您关闭套接字时,它会自动刷新所有剩余数据,因此无需在关闭之前刷新。

    【讨论】:

    • NAGL 是如何与此联系在一起的,你知道吗?
    【解决方案2】:

    你不能真正刷新套接字。

    (来自How can I force a socket to send the data in its buffer?

    你不能强迫它。时期。 TCP 自己决定何时 可以发送数据。现在,通常当您在 TCP 套接字上调用 write() 时,
    TCP确实会发送一个段,但没有保证也没有办法 强迫这个。 TCP不发送a的原因有很多
    段:关闭窗口和 Nagle 算法是两件事
    马上就想到了。

    阅读完整的帖子,它非常深入,为我澄清了很多事情。

    【讨论】:

      【解决方案3】:

      Nagle 的算法经常用于套接字。简而言之,它一直等到有大量数据要发送。问题是要在传输延迟和发送数据包的开销成本之间取得平衡。

      数据负载越大,浪费的带宽就越小,因为标头(大部分)是固定大小的。此外,中间系统的性能限制通常更明显地基于数据包速率,而不是整体数据速率。

      【讨论】:

      • 这个答案并没有真正解决冲洗套接字的关系。
      • 这个答案与这个问题有什么关系。刷新会覆盖 Nagle 的算法并立即发送吗?
      【解决方案4】:

      我没有使用flush 进行套接字编程。我确实记得在某处可以设置一些模式,其中面向流的发送尝试减少发送的小数据包的数量。但是,您将使用 sendall() 来确保发送缓冲区中的所有内容。

      shutdown() 函数在您进行后台处理时非常有用。当然,如果您不想让东西闲逛,您必须使用 close() 调用。

      查看Beej's guide 了解更多信息。

      【讨论】:

      • sendall() 和 flush() 一样
      猜你喜欢
      • 2017-12-04
      • 2014-06-11
      • 2010-10-13
      • 2013-04-10
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2013-02-09
      • 2011-08-31
      相关资源
      最近更新 更多