diff options
Diffstat (limited to 'Emby.Server.Implementations/Net/UdpSocket.cs')
| -rw-r--r-- | Emby.Server.Implementations/Net/UdpSocket.cs | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/Emby.Server.Implementations/Net/UdpSocket.cs b/Emby.Server.Implementations/Net/UdpSocket.cs index 58e4d6f89..523ca3752 100644 --- a/Emby.Server.Implementations/Net/UdpSocket.cs +++ b/Emby.Server.Implementations/Net/UdpSocket.cs @@ -118,6 +118,8 @@ namespace Emby.Server.Implementations.Net public IAsyncResult BeginReceive(byte[] buffer, int offset, int count, AsyncCallback callback) { + ThrowIfDisposed(); + EndPoint receivedFromEndPoint = new IPEndPoint(IPAddress.Any, 0); return _Socket.BeginReceiveFrom(buffer, offset, count, SocketFlags.None, ref receivedFromEndPoint, callback, buffer); @@ -125,17 +127,21 @@ namespace Emby.Server.Implementations.Net public int Receive(byte[] buffer, int offset, int count) { + ThrowIfDisposed(); + return _Socket.Receive(buffer, 0, buffer.Length, SocketFlags.None); } public SocketReceiveResult EndReceive(IAsyncResult result) { + ThrowIfDisposed(); + IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint remoteEndPoint = (EndPoint)sender; var receivedBytes = _Socket.EndReceiveFrom(result, ref remoteEndPoint); - var buffer = (byte[]) result.AsyncState; + var buffer = (byte[])result.AsyncState; return new SocketReceiveResult { @@ -148,13 +154,20 @@ namespace Emby.Server.Implementations.Net public Task<SocketReceiveResult> ReceiveAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { + ThrowIfDisposed(); + var taskCompletion = new TaskCompletionSource<SocketReceiveResult>(); + bool isResultSet = false; Action<IAsyncResult> callback = callbackResult => { try { - taskCompletion.TrySetResult(EndReceive(callbackResult)); + if (!isResultSet) + { + isResultSet = true; + taskCompletion.TrySetResult(EndReceive(callbackResult)); + } } catch (Exception ex) { @@ -167,6 +180,7 @@ namespace Emby.Server.Implementations.Net if (result.CompletedSynchronously) { callback(result); + return taskCompletion.Task; } cancellationToken.Register(() => taskCompletion.TrySetCanceled()); @@ -176,6 +190,8 @@ namespace Emby.Server.Implementations.Net public Task<SocketReceiveResult> ReceiveAsync(CancellationToken cancellationToken) { + ThrowIfDisposed(); + var buffer = new byte[8192]; return ReceiveAsync(buffer, 0, buffer.Length, cancellationToken); @@ -183,13 +199,20 @@ namespace Emby.Server.Implementations.Net public Task SendToAsync(byte[] buffer, int offset, int size, IpEndPointInfo endPoint, CancellationToken cancellationToken) { + ThrowIfDisposed(); + var taskCompletion = new TaskCompletionSource<int>(); + bool isResultSet = false; Action<IAsyncResult> callback = callbackResult => { try { - taskCompletion.TrySetResult(EndSendTo(callbackResult)); + if (!isResultSet) + { + isResultSet = true; + taskCompletion.TrySetResult(EndSendTo(callbackResult)); + } } catch (Exception ex) { @@ -202,6 +225,7 @@ namespace Emby.Server.Implementations.Net if (result.CompletedSynchronously) { callback(result); + return taskCompletion.Task; } cancellationToken.Register(() => taskCompletion.TrySetCanceled()); @@ -211,6 +235,8 @@ namespace Emby.Server.Implementations.Net public IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, IpEndPointInfo endPoint, AsyncCallback callback, object state) { + ThrowIfDisposed(); + var ipEndPoint = NetworkManager.ToIPEndPoint(endPoint); return _Socket.BeginSendTo(buffer, offset, size, SocketFlags.None, ipEndPoint, callback, state); @@ -218,6 +244,8 @@ namespace Emby.Server.Implementations.Net public int EndSendTo(IAsyncResult result) { + ThrowIfDisposed(); + return _Socket.EndSendTo(result); } |
