C# 无连接客户端/服务器策略(UDP)-.NET

C# 无连接客户端/服务器策略(UDP)-.NET,c#,.net,sockets,C#,.net,Sockets,注意:这是单向UDP传输(即没有返回路径)——我无法将数据发送回客户端 在这一点上,我已经编写了一些客户机/服务器组合,所有这些组合对于使用.NET UDPClient类在服务器端进行数据包传递来说都有好的和坏的结果。以下是它们的概要: 单阻塞线程/单端口(.Receive()):工作正常,除非减慢数据传输速度,否则不可避免地会丢失少量数据包,从而导致生成的文件无法使用 单异步线程/单端口(.BeginReceive()):同上——如果不限制发送方(客户端),我将丢失数据包 多线程,多端口:我创

注意:这是单向UDP传输(即没有返回路径)——我无法将数据发送回客户端

在这一点上,我已经编写了一些客户机/服务器组合,所有这些组合对于使用.NET UDPClient类在服务器端进行数据包传递来说都有好的和坏的结果。以下是它们的概要:

  • 单阻塞线程/单端口(.Receive()):工作正常,除非减慢数据传输速度,否则不可避免地会丢失少量数据包,从而导致生成的文件无法使用
  • 单异步线程/单端口(.BeginReceive()):同上——如果不限制发送方(客户端),我将丢失数据包
  • 多线程,多端口:我创建100个线程(随机数)并设置静态端口范围(例如10001-10100)。必须将客户端更改为动态遍历跨不同端口的发送。这在初始测试中似乎效果很好,但出现了新的问题(例如,试图跨不同线程登录的文件锁定问题)
  • 在这一点上,由于我使用的是UDP协议,无法重新传输丢失的数据包,所以我倾向于选择3。对于选项3,是否有人看到其他值得关注的问题(除了我已经遇到的访问争用问题)


    是否有人知道服务器可以采用任何其他策略来最大限度地减少将数据包丢失给未准备好的UDP侦听器的可能性?

    通常,您会放置一个专用线程来读取传入消息,并尽快将其放入某个队列中。然后,其他线程可以(至少)清空队列并处理数据。增加<代码>ReciveBufferSize将有助于避免因应用程序短暂减速而丢弃消息。顺便说一句,使用UDP“单向”传输文件似乎是一个可怕的想法,除非接收到的数据与此无关。如果消息丢失,客户端将永远不会知道。。。如果消息不包含某种消息计数器,服务器将保存一个fdile,并且永远不会知道它已损坏。@C.Gonzalez,谢谢您的输入。是的,我熟悉常见的面向连接的数据队列技术——我只是遇到了一些普通TCP侦听器不必考虑的独特问题。如果TCP侦听器不可用,TCP/IP将处理丢失数据包的检测和数据包的重新传输。在UDP中,我没有那个。我已经克服了(或至少大大减少了)你提到的其他问题。对于由于网络而丢弃的数据包,我无能为力,但我可以处理由于未准备好侦听器而丢失的信息。我想我也解决了访问争用问题。不要使用UDPClient类。最好的方法是使用IOCP,一个大的缓冲区和一个专用的优先线程将传入流写入一个连续的共享内存“循环”缓冲区。然后一些低优先级线程访问和读取共享内存缓冲区。