aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/Udp/UdpServer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/Udp/UdpServer.cs')
-rw-r--r--Emby.Server.Implementations/Udp/UdpServer.cs64
1 files changed, 46 insertions, 18 deletions
diff --git a/Emby.Server.Implementations/Udp/UdpServer.cs b/Emby.Server.Implementations/Udp/UdpServer.cs
index 21ef3cab6..8dc1fae4b 100644
--- a/Emby.Server.Implementations/Udp/UdpServer.cs
+++ b/Emby.Server.Implementations/Udp/UdpServer.cs
@@ -139,30 +139,58 @@ namespace Emby.Server.Implementations.Udp
{
_udpClient = _socketFactory.CreateUdpSocket(port);
- Task.Run(() => StartListening());
+ Task.Run(() => BeginReceive());
}
- private async void StartListening()
+ private readonly byte[] _receiveBuffer = new byte[8192];
+
+ private void BeginReceive()
{
- while (!_isDisposed)
+ if (_isDisposed)
{
- try
- {
- var result = await _udpClient.ReceiveAsync(CancellationToken.None).ConfigureAwait(false);
+ return;
+ }
- OnMessageReceived(result);
- }
- catch (ObjectDisposedException)
- {
- }
- catch (OperationCanceledException)
- {
- }
- catch (Exception ex)
+ try
+ {
+ var result = _udpClient.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, OnReceiveResult);
+
+ if (result.CompletedSynchronously)
{
- _logger.ErrorException("Error receiving udp message", ex);
+ OnReceiveResult(result);
}
}
+ catch (ObjectDisposedException)
+ {
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error receiving udp message", ex);
+ }
+ }
+
+ private void OnReceiveResult(IAsyncResult result)
+ {
+ if (_isDisposed)
+ {
+ return;
+ }
+
+ try
+ {
+ var socketResult = _udpClient.EndReceive(result);
+
+ OnMessageReceived(socketResult);
+ }
+ catch (ObjectDisposedException)
+ {
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error receiving udp message", ex);
+ }
+
+ BeginReceive();
}
/// <summary>
@@ -239,13 +267,13 @@ namespace Emby.Server.Implementations.Udp
try
{
- await _udpClient.SendWithLockAsync(bytes, bytes.Length, remoteEndPoint, CancellationToken.None).ConfigureAwait(false);
+ await _udpClient.SendToAsync(bytes, 0, bytes.Length, remoteEndPoint, CancellationToken.None).ConfigureAwait(false);
_logger.Info("Udp message sent to {0}", remoteEndPoint);
}
catch (OperationCanceledException)
{
-
+
}
catch (Exception ex)
{