18

我有一个使用本地库的 C# 应用程序,该库使用 UDP 通过 Internet 将视频发送到其他 IP。我对那个图书馆没有流量控制。

WebRequest我的应用程序还使用我可以控制它们的方式调用另一台服务器的 Web 服务。

问题是:

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

有什么方法可以优先考虑WebRequest或为他们节省一些带宽,以便我可以安全地得到响应?

4

2 回答 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。然后你有 2 个网站通过 REST 或数据库轮询进行通信。优点:开箱即用的简单解决方案。

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

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

于 2017-05-03T07:51:20.750 回答
4

为简单的 UDP 流设置 UDP 中继服务器非常简单,然后您可以根据需要使用它来限制流量。你可以把它放在你的应用程序中,这样一切都是独立的,并且你的中继服务器知道何时发出 Web 请求。创建一个 UdpClient 以接收 127.0.0.1 上的流量,并让视频流库连接到该地址而不是您的实际服务器。然后创建另一个 UdpClient,它将流量中继到您通常与库连接的实际目标。

您可以使用此方法以多种方式限制带宽,具体操作方式最终取决于您的要求。您可以在启动 Web 请求时暂停转发 UDP 帧,如果可以接受暂停,则在收到响应后继续转发它们。如果没有,那么您可以在中继数据时跟踪平均 UDP 帧/秒,并通过在您的网络请求待处理时将适当的延迟插入中继服务器来动态地将速率限制为 50%(或其他)。

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

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

于 2017-05-04T08:31:18.810 回答