コード例 #1
0
        private void ReleaseWrite(SocketAsyncEventArgs writeEventArgs)
        {
            AsyncEventToken token = (AsyncEventToken)writeEventArgs.UserToken;

            token.Client.ReleaseSend();
            token.Reset();
            _sendPool.Push(writeEventArgs);
            _maxNumberSendOperations.Release();
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
            }
        }