我有一个C#应用程序,它使用本机库,使用UDP通过互联网将视频发送到其他IP。我对该库没有流量控制。
我的应用程序还使用WebRequest
调用另一台服务器的Web服务,我可以控制它们。
问题是:
当我的互联网带宽较低时,视频流会占用我的所有带宽。所以我在那段时间内没有得到我的网络服务方法的回复。
有没有办法确定WebRequest
的优先顺序或为它们节省一些带宽,以便我能安全地获得响应?
答案 0 :(得分: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或数据库轮询进行通信的网站。 优点:简单的开箱即用解决方案。
缺点:您的限制不是动态的,并且在您的配置文件中。
请注意,如果您的互联网网络速度变化很大,则不应使用此方法。
答案 1 :(得分:4)
为简单的UDP流设置UDP中继服务器非常简单,然后您可以根据需要使用它来限制流量。您可以将它放在您的应用程序中,这样一切都是自包含的,并且您的中继服务器知道何时发出Web请求。创建一个UdpClient以接收127.0.0.1上的流量,并让视频流库连接到它而不是实际的服务器。然后创建另一个UdpClient,将流量中继到您通常与库连接的实际目标。
您可以使用此方法以任意数量的方式限制带宽,如何操作最终将取决于您的要求。您可以在启动Web请求时暂停转发UDP帧,并在获得响应后继续转发它们,如果暂停是可接受的。如果没有,那么您可以在中继数据时跟踪平均UDP帧数/秒,并通过在Web请求待处理时向您的中继服务器插入适当的延迟来动态速率限制为50%(或其他)。
您可以在这里查看DNS请求的简单UDP中继服务器实现示例,基本原理是相同的: