具有多个用户的C#UDP服务器

具有多个用户的C#UDP服务器,c#,udp,C#,Udp,以代码为例: class UPDServer { //start listener public void start() { UdpClient listener = new UdpClient(this._porta); IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 10000); State s = new State(); s.listener

以代码为例:

class UPDServer {

    //start listener
    public void start() {
        UdpClient listener = new UdpClient(this._porta);
        IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 10000);

        State s = new State();
        s.listener = listener;
        s.ipEndPoint = ipEndPoint;

        // begin to listen again
        listener.BeginReceive(new AsyncCallback(ReceiveCallback), s);

   }

 //receive data
   public void ReceiveCallback(IAsyncResult ar)
   {
      // we got data
      State s = (State)(ar.AsyncState);

      Byte[] received = e.escuta.EndReceive(ar, ref e.ipEndPoint);
      string text = ""; = Encoding.ASCII.GetString(received);
      // ... do somenthing with text

      // begin to listen again
      s.listener.BeginReceive(new AsyncCallback(ReceiveCallback), e);
   }
}
在上面的代码中,从EndReceive到下一个BeginReceive之间有一个时间跨度,没有人在听,我认为如果在这个时间跨度内有消息,它将丢失

嗯,我想是有一些缓冲区,但即使如此,如果缓冲区在没有人监听消息的时间跨度内填满,消息也会丢失

我记得有人说过,只要在同一个端点上多次调用BeginReceive,就可以非常简单地解决这个问题,所以我尝试了以下方法:

   for( int x = 0; x < 5;x++) {
      escuta.BeginReceive(new AsyncCallback(ReceiveCallback), e);
   }
for(int x=0;x<5;x++){
escuta.BeginReceive(新的异步回调(ReceiveCallback),e);
}
奇怪的是,在同一个套接字上调用beginReceive不会抛出错误,但每次收到消息时,所有五个beginReceive都会触发,并且所有五个都收到相同的消息


有什么方法可以改进代码吗?

首先,不能保证在使用UDP时可以获得所有数据,因此必须使代码/协议具有容错性

除非您的处理非常密集,并且您希望大量数据涌入,否则您可能不需要做不同的事情。只需添加一些错误检测代码,这样您就可以知道您的代码是否无法处理


但是,如果需要保持接收循环的速度,则在接收数据时,将其复制到队列中,供另一个线程处理,以便可以快速重新开始读取。或者在某些情况下,您可以编写end receive,以便在多个数据包背对背的情况下处理重新进入。

我知道,当协议为UDP时,没有什么是确定的,但是我不会因为代码而丢失数据。是的,我期待着大量的数据。数据已经在队列中,另一个线程将数据写入磁盘。我想我会抱最好的希望。感谢您的帮助另一个想法(根据您的情况可能会飞,也可能不会飞)是向您的客户机公开多个UDP端口,以便您可以将读取工作负载分配到多个线程。但是,如果您所做的只是将数据传递给队列,那么这可能不会获得太多性能。