Async C# UDP port d'écoute exception socketexception

J'ai un assez simple Asynchrone UDP port d'écoute, le programme d'installation en tant que service, et elle fonctionne très bien pour un certain temps maintenant, mais récemment, il s'est écrasé sur une exception socketexception An existing connection was forcibly closed by the remote host. J'ai trois questions:

  1. Ce qui cause cela? (Je ne pense pas que les sockets UDP avait une connexion)
  2. Comment puis-je reproduire, à des fins de test?
  3. Comment puis-je proprement gérer l'exception, donc tout va continuer à travailler?

Mon code ressemble à quelque chose comme:

private Socket udpSock;
private byte[] buffer;
public void Starter(){
//Setup the socket and message buffer
udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpSock.Bind(new IPEndPoint(IPAddress.Any, 12345));
buffer = new byte[1024];
//Start listening for a new message.
EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock);
}
private void DoReceiveFrom(IAsyncResult iar){
try{
//Get the received message.
Socket recvSock = (Socket)iar.AsyncState;
EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
int msgLen = recvSock.EndReceiveFrom(iar, ref clientEP);
byte[] localMsg = new byte[msgLen];
Array.Copy(buffer, localMsg, msgLen);
//Start listening for a new message.
EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock);
//Handle the received message
Console.WriteLine("Recieved {0} bytes from {1}:{2}",
msgLen,
((IPEndPoint)clientEP).Address,
((IPEndPoint)clientEP).Port);
//Do other, more interesting, things with the received message.
} catch (ObjectDisposedException){
//expected termination exception on a closed socket.
//...I'm open to suggestions on a better way of doing this.
}
}

L'exception est levée lors de la recvSock.EndReceiveFrom() de la ligne.

OriginalL'auteur chezy525 | 2011-03-04

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *