丢弃用于 TCP 连接的 winsock 内部缓冲区中的排队数据

Posted

技术标签:

【中文标题】丢弃用于 TCP 连接的 winsock 内部缓冲区中的排队数据【英文标题】:Discard queued data in winsock internal buffers for TCP connections 【发布时间】:2013-09-17 07:10:04 【问题描述】:

以下问题适用于winsock TCP 套接字连接。

有没有办法丢弃任何已经发送但排队的内部 winsock 缓冲区,以便在线路质量再次变好时不会发送(即嘈杂的 WLAN联系)。 发送数据的原因是发送旧的视频直播流帧没有意义,应该丢弃所有旧帧,以便只发送最新的帧。

如果 SO_SNDBUF 设置为零,缓冲区会被丢弃吗?

编辑:我知道 UDP 在这里可能是更好的选择,但有一些理由反对使用 UDP:

数据包组装 数据包排序 设计决策

特别是排序需要在应用程序端进行额外的缓冲。丢弃任何帧数小于已处理数据包的方法可能是一种选择,但这可能会导致丢弃大量帧的情况。

【问题讨论】:

我认为您甚至不能将 SO_SNDBUF 设置为零,如果您可以将其设置为小于其中已有的任何数据,我会感到惊讶,事实上感到惊讶。跨度> 这是我对它的评论。 【参考方案1】:

不是没有进入内核空间。你甚至会如何解决它?在这一点上,来自所有流程的数据混合在一起,所以很难说什么要发送,什么不应该发送。即使存在某种 API,您的进程至少必须有权执行此类操作。

另外,你为什么要发送视频 TCP?如果您担心性能(例如在处理旧帧时不会陷入困境),UDP 可能是更好的选择。

【讨论】:

【参考方案2】:

不,一旦您将数据传递给操作系统,它就会拥有它,并将尽最大努力将其传递到另一端。您无法更改或删除该数据。

您可以做的是降低发送缓冲区的大小,这样操作系统就不会排队太多数据 - 而是自己在应用程序中排队数据。您可以控制应用程序中的队列,并且可以丢弃该数据。需要进行一些微调,因为发送缓冲区过低会降低吞吐量。

【讨论】:

以上是关于丢弃用于 TCP 连接的 winsock 内部缓冲区中的排队数据的主要内容,如果未能解决你的问题,请参考以下文章

VB6 Winsock 多个 TCP 连接 > DoEvents 问题

WinSock TCP 长连接(while循环)

Winsock 连接很慢

winsock winsock2 TCP/IP协议 tcpip.sys 网卡驱动 有啥相互关系?

负载均衡器后面的 Spark yarn-client 模式会丢弃非活动 TCP 连接

RTT 的计算 - Winsock