Моя цель - создать прослушиватель 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)