private async Task Accept() { try { while (IsListening) { var saea = _acceptSaeaPool.Take(); var socketError = await _listener.AcceptAsync(saea); if (socketError == SocketError.Success) { var acceptedSocket = saea.Saea.AcceptSocket; Task.Run(async() => { await Process(acceptedSocket); }) .Forget(); } else { // _log.ErrorFormat("Error occurred when accept incoming socket [{0}].", socketError); } _acceptSaeaPool.Return(saea); } } catch (Exception ex) when(!ShouldThrow(ex)) { } catch (Exception ex) { // _log.Error(ex.Message, ex); } }
public async Task SendAsync(byte[] data, int offset, int count) { BufferValidator.ValidateBuffer(data, offset, count, "data"); if (State != TcpSocketConnectionState.Connected) { throw new InvalidOperationException("This session has not connected."); } try { byte[] frameBuffer; int frameBufferOffset; int frameBufferLength; _configuration.FrameBuilder.Encoder.EncodeFrame(data, offset, count, out frameBuffer, out frameBufferOffset, out frameBufferLength); var saea = _saeaPool.Take(); saea.Saea.SetBuffer(frameBuffer, frameBufferOffset, frameBufferLength); await _socket.SendAsync(saea); _saeaPool.Return(saea); } catch (Exception ex) when(!ShouldThrow(ex)) { } }
private static void Accepted(object sender, SocketAsyncEventArgs e) { var receiveArgs = SaeaPool.Get(); receiveArgs.UserToken = new ClientSocket(BufferSize); var client = (ClientSocket)receiveArgs.UserToken; client.Socket = e.AcceptSocket; client.IsConnected = true; client.OnPacket += OnPacket; client.Receive(); client.Diffie = new DiffieHellman(); e.Completed -= Accepted; e.AcceptSocket = null; SaeaPool.Return(e); StartAccepting(); }