Как создать действительно бесконтактный UdpClient? - PullRequest
0 голосов
/ 10 июля 2020

Моя цель - создать прослушиватель UDP, который обрабатывает все дейтаграммы, поступающие на указанный порт, независимо от их происхождения. Затем он отвечает на этот источник каким-то сообщением.

public void StartListening(int port = 13000)
{
    ListenerPort = port;
    udpClient = new UdpClient(ListenerPort);

    udpClient.BeginReceive(new AsyncCallback(handleIncomingMessages), null);
}

private void handleIncomingMessages(IAsyncResult ar)
{
    var receivedData = udpClient.EndReceive(ar, ref senderIpEndPoint);
    //[...]
    udpClient.BeginReceive(new AsyncCallback(handleIncomingMessages), null);
}

Все работало нормально, пока я не отключил одно из этих «источников». Через несколько секунд мой слушатель поймал SocketException.

Существующее соединение было принудительно закрыто удаленным хостом.

Я всегда думал, что UDP - это протокол без установления соединения, но похоже, что UdpClient каким-то образом отслеживает доступность удаленного хоста. Есть ли какой-нибудь стандартный,. NET основной способ отключить это?

EDIT:

Вот трассировка стека ошибок:

System.Net.Sockets.SocketException
  HResult=0x80004005
  Message=An existing connection was forcibly closed by the remote host.
  Source=System.Net.Sockets
  StackTrace:
   at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
   at System.Net.Sockets.Socket.EndReceiveFrom(IAsyncResult asyncResult, EndPoint& endPoint)
   at System.Net.Sockets.UdpClient.EndReceive(IAsyncResult asyncResult, IPEndPoint& remoteEP)
   at NetworkController.UDP.NetworkManager.handleIncomingMessages(IAsyncResult ar) in [...]
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Net.ContextAwareResult.CompleteCallback()
   at System.Net.ContextAwareResult.<>c.<Complete>b__15_0(Object s)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)

...