Я реализую простой протокол обнаружения локальной сети, поэтому я вызываю UdpClient.Send, а затем UdpClient.BeginReceive. Если ожидается более одного ответа, я вызываю UdpClient.BeginReceive в конце обратного вызова. Примерно так:
UdpClient client = new UdpClient(AddressFamily.InterNetwork);
client.EnableBroadcast = true;
client.Send(request, request.Length, broadcastEndPoint);
client.BeginReceive(Callback, client);
... а затем в 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);
}
Моя проблема заключается в том, что мой основной цикл вызывает client.Close
, пока еще есть ожидающие получения. Прием завершается, и мой следующий вызов BeginReceive выдает исключение: System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
Почему в UdpClient нет метода CancelReceive? Что я могу сделать вместо этого?