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

时间:2013-09-17 07:10:05

标签: sockets winapi tcp buffer winsock

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

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

将丢弃缓冲区,SO_SNDBUF是否设置为零?

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

  • 汇编数据包
  • 数据包订购
  • 设计决策

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

2 个答案:

答案 0 :(得分:0)

不进入内核空间。你怎么会解决它?此时所有进程的数据混合在一起,因此很难说要发送什么和不发送什么。即使存在某种类型的API,您的流程至少也必须有权做这样的事情。

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

答案 1 :(得分:0)

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

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