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

时间:2013-10-23 19:23:07

标签: .net udp winsock

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

我正在尝试为此目的实现.Net(Framework 4)服务,但我在Internet上找到的所有示例都使用了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 个答案:

答案 0 :(得分:1)

不会丢失数据包,除非您通过发送如此大量的数据来填充网络缓冲区,或者在再次呼叫接收之前需要很长时间。如果您在执行其他操作时收到数据包,则会将它们缓冲在网络缓冲区中(这就是它的用途),直到您再次呼叫接收,这将在UDP中一次传送一个数据包(数据报)。

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

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

// Disclaimer: I don't know VB! 

While True
   Dim datagram = server.Receive()
   // do stuff