Ich implementiere ein einfaches lokales Netzwerk-Erkennungsprotokoll, also rufe ich UdpClient.Send und dann UdpClient.BeginReceive auf. Falls mehr als eine Antwort ansteht, rufe ich UdpClient.BeginReceive am Ende des Callbacks auf. Etwas wie folgt aus:Wo ist UdpClient.CancelReceive?
UdpClient client = new UdpClient(AddressFamily.InterNetwork);
client.EnableBroadcast = true;
client.Send(request, request.Length, broadcastEndPoint);
client.BeginReceive(Callback, client);
... und dann in Callback
:
void Callback(IAsyncResult ar)
{
UdpClient client = (UdpClient)ar.AsyncState;
IPEndPoint remoteEndPoint = null;
byte[] response = client.EndReceive(ar, ref remoteEndPoint);
// Do something with response
client.BeginReceive(Callback, client);
}
Mein Problem ist, dass meine Hauptschleife client.Close
ruft, während es noch aus einem Empfangs ist. Der Empfang wird abgeschlossen, und der nächste Aufruf von BeginReceive löst eine Ausnahme aus: System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
Warum hat UdpClient keine CancelReceive-Methode? Was kann ich stattdessen tun?
Was: UdpClient client = (UdpClient) ar.AsyncState; if (client.Client == null) return; – ajcs