示例#1
0
        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);
            }
        }
示例#2
0
        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))
            {
            }
        }
示例#3
0
        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();
        }