public void Send(ArraySegment <byte> sendBuffer)
        {
            if (sendBuffer.IsEmpty())
            {
                return;
            }

            m_SocketAsyncEventArgs.GetSendContextData().Add(sendBuffer);
            TrySend(m_SocketAsyncEventArgs);
        }
        public void TrySend(SocketAsyncEventArgs args)
        {
            if (!m_Sending.TryEnter())
            {
                return;
            }
            if (args.GetSendContextData().IsEmpty)
            {
                m_Sending.TryExit();
                return;
            }

            try
            {
                bool willRaiseEventLater;
                while (!(willRaiseEventLater = SendAsync(args)))
                {
                    var canSendAvailableBufferList = CompleteSend(args);
                    if (!canSendAvailableBufferList)
                    {
                        m_Sending.TryExit();
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                CloseSocketWhileSending(args, e);
            }
        }
 private bool CompleteSend(SocketAsyncEventArgs args)
 {
     if (args.SocketError != SocketError.Success)
     {
         return(false);
     }
     return(args.GetSendContextData().Skip(args.BytesTransferred));
 }
        private bool SendAsync(SocketAsyncEventArgs args)
        {
            if (IsClosed)
            {
                args.SocketError = SocketError.OperationAborted;
                return(false);
            }

            args.GetSendContextData().CopyBufferListTo(args);

            Debug.Assert(!args.BufferList.IsEmpty());

            return(m_Socket.SendAsync(args));
        }