我的C#应用程序中的带宽塑形

18

我有一个使用本地库发送UDP视频到其他IP地址的C#应用程序,我无法控制该库的流量。

我的应用程序还调用另一台服务器的Web服务,使用WebRequest来进行控制。

问题是:

当我的互联网带宽较低时,视频流会占用所有带宽。因此,在此期间,我无法从我的Web服务方法中获取响应。

是否有任何方法可以优先考虑WebRequest或节省一些带宽以便我可以安全地获得响应?


2
据我所知,流量整形通常会在路由器上使用QoS来完成。 - user47589
你对网络有控制权吗?还是它是移动的?你说“当你的互联网带宽低时”。这是因为应用程序可能在多个位置运行,还是因为有时你的互联网速度变慢?如果你有控制权并且这是一个商业网络,你应该能够为不同的连接设置不同的保留带宽。所以你可以通过拆分API并为它们都分配保留带宽来实现这一点。但是,如果你无法控制网络或流媒体库,则可能难以限制它。 - Austin Winstanley
@Amy 我没有访问路由器配置的权限。 - Matin Lotfaliee
@AustinWinstanley 不,我对网络没有任何控制。互联网运行缓慢。 - Matin Lotfaliee
@Webruster 这是实时视频。 - Matin Lotfaliee
显示剩余7条评论
2个回答

6

我不知道C#中有任何可以按此方式优先处理流量的方法。

我知道这不是完全符合堆栈溢出的答案,但这是我在没有适当的网络基础设施访问时处理流媒体服务不会占用带宽的方式。

当您确定要使用哪种方法时,我建议您查看https://superuser.com,它应该能够回答您在实现解决方案时遇到的任何障碍。

解决方案一。

将其拆分为2个服务,并通过每个服务的REST API或数据库轮询进行通信。然后使用网络限制程序来优先处理其中一个服务的流量。https://www.netlimiter.com/https://netbalancer.com/是可以做到这一点的软件示例,但还有许多其他软件。

优点:您将具有流媒体服务的动态限制。

缺点:您必须在服务器上运行另一个程序,而且它绝对不是免费的。

解决方案二。

使用IIS,在IIS中有一个内置的限制,https://www.iis.net/configreference/system.applicationhost/weblimits,查看maxGlobalBandWidth。然后您有两个通过REST或数据库轮询进行通信的网站。

优点:简单易用的解决方案。

缺点:您的限制不是动态的,而是在配置文件中。

请注意,如果您的互联网网络速度变化很大,则不应使用此方法。


他说他无法控制第一个库,而且它是一个UDP视频流,因此我认为它不是REST API,也不会转到IIS端点。 - Mike Marynowski
他不需要对第一个库进行任何控制。只需按原样使用它即可。然后,当他需要发布控制消息时,他的应用程序使用REST API告诉其他服务发送消息。根据他的评论,我认为这只是嵌入在服务中的流式库。 - Archlight
他的问题表明该库是他的应用程序的一部分,而不是服务的一部分。 - Mike Marynowski
没错,如果他的应用程序不能作为服务运行,那么IIS将无法使用。在解决方案一中,无论是winform、wpf还是服务都没有关系。 - Archlight
我更喜欢第一种解决方案,因为应用程序在客户端上运行而不是服务器上。现在的问题是如何嵌入Netlimiter?我该如何编写自己的Netlimiter? - Matin Lotfaliee
我认为创建一个网络限制器是一项重要的工作。你可以将其他安装程序捆绑在一起。但如果这是一个任何人都可以安装和运行的应用程序,我认为你应该考虑看看麦克的答案。 - Archlight

4
设置简单的UDP中继服务器以处理简单的UDP流非常直观,您可以根据需要对流量进行限制。您可以将其放入应用程序中,使所有内容都是自包含的,并且您的中继服务器知道何时发出Web请求。创建一个UdpClient以接收127.0.0.1上的流量,并使视频流库连接到该UdpClient而不是实际服务器。然后创建另一个UdpClient,它将中继流量到您通常使用库连接到的实际目标。

您可以通过此方法以任何数量的方式限制带宽,如何执行最终取决于您的要求。如果暂停转发UDP帧在开始Web请求时并在获取响应后恢复转发是可以接受的,则可以这样做。如果不能,则可以在中继服务器中插入适当的延迟,以动态地将平均UDP帧/秒限制为50%(或其他百分比),同时等待Web请求。

您可以在此处查看DNS请求的简单UDP中继服务器实现示例,基本原理将相同:

https://social.msdn.microsoft.com/Forums/en-US/ce062e62-395f-4110-a4dd-3e9ed3c88286/udp-relay-server?forum=netfxnetcom


这是一个非常有趣的解决方案。你有实际的使用经验吗?由于有多个流,我会有点担心IO量翻倍的问题。 - Archlight
我已经构建了基于TCP的中继服务器,就像这样,而没有遇到任何问题。由于您正在发送到本地主机,因此它实际上不会离开内存,因此与其他所有操作(解码、编码等)相比,它应该是相当小的开销,但您必须进行测试。您可以编写一个简单的中继服务器,大约15行代码,然后查看它如何影响您的流。 - Mike Marynowski
我刚刚检查了我们用C#编写的一个TCP中继应用程序在传输90Mbps数据时的CPU使用情况,它在3Ghz Xeon上使用了约1个CPU的5%。通过中继传输时,峰值下载速度完全不受影响。你可以根据这个做出自己的判断 :) - Mike Marynowski
这真的很好。CPU并不重要,因为继电器的东西应该对其负荷较轻。我在想IO方面的问题。我的东西正在流式传输JSON,并且峰值达到20 MB/s(160 mbps),我正在将流的部分中继到其他服务器,并遇到了问题(虚拟机和SAN设置)。 - Archlight
那是一个有趣的解决方案。我认为Netlimiter正好做了同样的事情。 - Matin Lotfaliee
1
我认为CPU使用率是这样一个中继器唯一有趣的指标,因为发送到本地主机实际上并不使用任何真正的IO,它只是一个memcpy,因为它通过操作系统网络堆栈移动。它实际上并没有经过网络适配器或类似的东西。 - Mike Marynowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接