具有多个用户的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端口,以便您可以将读取工作负载分配到多个线程。但是,如果您所做的只是将数据传递给队列,那么这可能不会获得太多性能。