首页 文章

通过绑定端口进行侦听,在.net中更可靠的UDP服务器?

提问于
浏览
0

我需要实现UDP服务器来接收来自一系列设备的报告,这些设备只能使用此协议进行报告(我无法更改它们) . 从历史上看,我使用C和Winsock来实现这种服务器(带有绑定到侦听端口的套接字并使用recvfrom) . 这种实现方式确保即使我的程序实际上没有阻塞recvfrom(),也会在Winsock库中缓冲少量数据包等待它,因此丢失的数据包更少 . 如果底层网络驱动程序支持,我甚至可以尝试使用WSAIoctl()调整缓冲区大小 .

我正在尝试为此目的实现.Net(框架4)服务,但我在互联网上找到的所有示例都使用了UdpClient类,这在某种程度上很好,但似乎不适合这项任务,因为它允许在收听过程中“漏洞” . 例如:

Dim server = New UdpClient(...)
Dim remote = New IPEndPoint(IPAddress.Any, 0)
...
Dim pkt1 = server.Receive()
... some processing A ...
Dim pkt2 = server.Receive(remote)
... some processing B ...
Dim pkt3 = server.Receive(remote)

在UDPClient类中实现API的方式,在我看来,如果数据包在程序的“处理A”或“处理B”阶段到达时可能会丢失,因为没有套接字实际绑定到侦听地址/在那个时候的端口和操作系统应该丢弃它们 . 我可以尝试尽快制作“处理A”和“处理B”,但它们将永远存在 .

我完全清楚UDP是一种无连接/不可靠的协议,这意味着无论我做什么,数据包都可能丢失,但是在数据包到达服务器之后因为API有限制而丢失数据包对我来说非常愚蠢 .

为了确保没有丢失数据包(只要它已到达服务器),就需要一个永久绑定到侦听端口的对象 . 我能够在VB6中使用Winsock ActiveX控件,因为我可以使用C / C中的二进制Winsock API,但我找不到在.Net中执行此操作的方法 . 有办法吗?我的分析是正确的还是我错过了一些观点?

提前致谢,

吉尔 .

1 回答

  • 1

    No packet will be lost 除非您通过发送如此大量的数据来填充网络缓冲区,否则您需要很长时间才能再次呼叫接收 . 如果您在执行其他操作时收到数据包,则会将它们缓冲在网络缓冲区中(这就是它的用途),直到您再次呼叫接收,这将在UDP中一次传送一个数据包(数据报) .

    (我很惊讶它直接使用Winsock是不一样的!)

    通常使用同步Receive()方法的对等体将具有如下循环:

    // Disclaimer: I don't know VB! 
    
    While True
       Dim datagram = server.Receive()
       // do stuff
    

相关问题