From c5e6fbe60209b1e3ccc15d91dc1ae76688582738 Mon Sep 17 00:00:00 2001 From: Mikael Falkvidd Date: Tue, 14 Apr 2020 09:16:02 +0200 Subject: [PATCH] Handle synchronous return of socket.ReceiveFromAsync() If data is already pending when socket.ReceiveFromAsync() is called, the return value will be set to false. When this happens, the System.Net.Sockets.SocketAsyncEventArgs.Completed event will not be triggered, so we must call it ourselves. If we fail to call the Completed event ourselves, the DTLS server will stop responding to any incoming data, indefinitely. --- src/DTLS.Net/Server.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/DTLS.Net/Server.cs b/src/DTLS.Net/Server.cs index 318f7db..0a962bc 100644 --- a/src/DTLS.Net/Server.cs +++ b/src/DTLS.Net/Server.cs @@ -406,7 +406,12 @@ private void ReceiveCallback(object sender, SocketAsyncEventArgs e) remoteEndPoint = new IPEndPoint(IPAddress.IPv6Any, 0); e.RemoteEndPoint = remoteEndPoint; e.SetBuffer(0, 4096); - socket.ReceiveFromAsync(e); + bool pending = socket.ReceiveFromAsync(e); + if (!pending) + { + // If ReceiveFromAsync returns false, the callback will not be triggered automatically so we must call it ourselves. + ReceiveCallback(sender, e); + } } } }