diff options
Diffstat (limited to 'Emby.Server.Implementations/Udp/UdpServer.cs')
| -rw-r--r-- | Emby.Server.Implementations/Udp/UdpServer.cs | 64 |
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) { |
