private void ReleaseWrite(SocketAsyncEventArgs writeEventArgs) { AsyncEventToken token = (AsyncEventToken)writeEventArgs.UserToken; token.Client.ReleaseSend(); token.Reset(); _sendPool.Push(writeEventArgs); _maxNumberSendOperations.Release(); }
private void StartSend(SocketAsyncEventArgs writeEventArgs) { AsyncEventToken token = (AsyncEventToken)writeEventArgs.UserToken; if (token.OutstandingCount <= _settings.BufferSize) { writeEventArgs.SetBuffer(writeEventArgs.Offset, token.OutstandingCount); Buffer.BlockCopy(token.Data, token.TransferredCount, writeEventArgs.Buffer, writeEventArgs.Offset, token.OutstandingCount); } else { writeEventArgs.SetBuffer(writeEventArgs.Offset, _settings.BufferSize); Buffer.BlockCopy(token.Data, token.TransferredCount, writeEventArgs.Buffer, writeEventArgs.Offset, _settings.BufferSize); } bool willRaiseEvent; try { willRaiseEvent = token.Client.Socket.SendAsync(writeEventArgs); } catch (ObjectDisposedException) { token.Client.Close(); ReleaseWrite(writeEventArgs); return; } catch (InvalidOperationException) { Logger.Error( $"{_identity}Error during StartSend: InvalidOperationException ({token.Client.Identity})"); token.Client.Close(); ReleaseWrite(writeEventArgs); return; } if (!willRaiseEvent) { ProcessSend(writeEventArgs); } }
public void Send(AsyncEventClient client, byte[] data) { _maxNumberSendOperations.Wait(); if (!_isRunning) { Logger.Debug($"{_identity}Server stopped, not sending anymore."); _maxNumberSendOperations.Release(); return; } if (!client.IsAlive) { _maxNumberSendOperations.Release(); return; } if (!client.Socket.Connected) { Logger.Error( $"{_identity}AsyncEventClient not connected during send, closing socket. ({client.Identity})"); client.Close(); _maxNumberSendOperations.Release(); return; } if (!_sendPool.TryPop(out SocketAsyncEventArgs writeEventArgs)) { Logger.Error( $"{_identity}Could not acquire writeEventArgs, closing socket. ({client.Identity})"); client.Close(); _maxNumberSendOperations.Release(); return; } AsyncEventToken token = (AsyncEventToken)writeEventArgs.UserToken; token.Assign(client, data); client.WaitSend(); StartSend(writeEventArgs); }
private void ProcessSend(SocketAsyncEventArgs writeEventArgs) { AsyncEventToken token = (AsyncEventToken)writeEventArgs.UserToken; if (writeEventArgs.SocketError == SocketError.Success) { token.Update(writeEventArgs.BytesTransferred); if (token.OutstandingCount == 0) { token.Client.LastActive = DateTime.Now; ReleaseWrite(writeEventArgs); } else { StartSend(writeEventArgs); } } else { token.Client.Close(); ReleaseWrite(writeEventArgs); } }