丢弃用于 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 winsock2 TCP/IP协议 tcpip.sys 网卡驱动 有啥相互关系?