private IAsyncResult BeginSubNegotiation_UsernamePassword(AsyncCallback cb, object state)
        {
            byte[] buffer            = this.Prepare_UsernamePasswordCmd();
            UsernamePassword_SO d_so = new UsernamePassword_SO(cb, state);

            base.NStream.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(this.SubUsernamePassword_Write_End), d_so);
            return(d_so);
        }
        private void SubUsernamePassword_Write_End(IAsyncResult ar)
        {
            UsernamePassword_SO asyncState = (UsernamePassword_SO)ar.AsyncState;

            try
            {
                asyncState.UpdateContext();
                base.NStream.EndWrite(ar);
                this.BeginReadWhole(asyncState.Reply, 0, 2, new AsyncCallback(this.SubUsernamePassword_Read_End), asyncState);
            }
            catch (Exception exception)
            {
                asyncState.Exception = exception;
                asyncState.SetCompleted();
            }
        }
        private void SubUsernamePassword_Read_End(IAsyncResult ar)
        {
            UsernamePassword_SO asyncState = (UsernamePassword_SO)ar.AsyncState;

            try
            {
                asyncState.UpdateContext();
                this.EndReadWhole(ar);
                this.Validate_UsernamePasswordReply(asyncState.Reply);
            }
            catch (Exception exception)
            {
                asyncState.Exception = exception;
            }
            asyncState.SetCompleted();
        }
        IAsyncResult BeginSubNegotiation_UsernamePassword(AsyncCallback cb,
            object state)
        {
            //---------------------------------------
            // Prepare authentication information
            byte[] cmd = Prepare_UsernamePasswordCmd();

            UsernamePassword_SO stateObj = new UsernamePassword_SO(cb, state);

            //---------------------------------------
            // Send authentication information
            NStream.BeginWrite(cmd, 
                0, 
                cmd.Length,
                new AsyncCallback(SubUsernamePassword_Write_End),
                stateObj);

            return stateObj;
        }