⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cli_telnet.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
            else
            {
                strcat(szFSMInfoEn, "\r\n    the RecvBinary option state   : 0 ");
                strcat(szFSMInfoCh, "\r\n    接收二进制选项状态: 0 ");
            }

            strcat(szFSMInfoEn, "\r\n    the next state      : TSDATA ");
            strcat(szFSMInfoCh, "\r\n    下一状态    : TSDATA ");
            if (   pTermStruct->TelnetParam.OptionCmd == TCWILL
                && ! pTermStruct->TelnetParam.RecvBinary )
            {
                strcat(szFSMInfoEn, "\r\n    the action          : send \"IAC DO TXBINARY\" ");
                strcat(szFSMInfoCh, "\r\n    执行动作    : send \"IAC DO TXBINARY\" ");
                strcat(szFSMInfoEn, "\r\n    RecvBinary = 1\n\r ");
                strcat(szFSMInfoCh, "\r\n    RecvBinary = 1\n\r ");
            }
            else if (   pTermStruct->TelnetParam.OptionCmd == TCWONT
                     && pTermStruct->TelnetParam.RecvBinary )
            {
                strcat(szFSMInfoEn, "\r\n    the action          : send \"IAC DONT TXBINARY\" ");
                strcat(szFSMInfoCh, "\r\n    执行动作    : send \"IAC DONT TXBINARY\" ");
                strcat(szFSMInfoEn, "\r\n    RecvBinary = 0\n\r ");
                strcat(szFSMInfoCh, "\r\n    RecvBinary = 0\n\r ");
            }
        }
        CLI_TelFSMDegOut(szFSMInfoEn, szFSMInfoCh);
    }

    /*--------------------------------------------------------------*/
    /* 接收到"IAC WILL/WONT BINARY-TRANSMISSION"                    */
    /* 根据当前recieve BINARY-TRANSMISSION选项状态值                */
    /* 如果符合客户端的要求,则不动作                               */
    /* 否则设置recieve BINARY-TRANSMISSION 选项                     */
    /* 并应答客户端"IAC DO/DONT BINARY-TRANSMISSION"                */
    /*--------------------------------------------------------------*/
    if ( pTermStruct->TelnetParam.RecvBinary )
    {
        if ( pTermStruct->TelnetParam.OptionCmd == TCWILL )
            return 1 ;
    }
    else if ( pTermStruct->TelnetParam.OptionCmd == TCWONT )
        return 1 ;

    pTermStruct->TelnetParam.RecvBinary = ! ( pTermStruct->TelnetParam.RecvBinary ) ;

    pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCIAC ;
    if ( pTermStruct->TelnetParam.RecvBinary )
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCDO ;
    else
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCDONT ;
    pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)c ;

    pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;

    CLI_SendToTerm ( pTermStruct ) ;


    return 1 ;
}

/*==================================================================*/
/*      函数名      :CLI_WillTxBinary                               */
/*      函数功能    :处理telnet do/don't BINARY-TRANSMISSION选项    */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据             */
/*                   _U8 c  接收到的输入字符                      */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据             */
/*      返回值      :_U32   1:成功                                 */
/*      调用函数    :CLI_DebugOutString ( )                         */
/*      被调函数    :                                               */
/*==================================================================*/

_U32 CLI_WillTxBinary ( PTerm_Data_S pTermStruct, _U8 c )
{
    _S8 szFSMInfoEn[1024] = "";
    _S8 szFSMInfoCh[1024] = "";

    if(pTermStruct == G_NULL)
    {
        return 1;
    }
    if ( G_TRUE == m_bCliTelnetDebugOn )
    {
        if ( pTermStruct->iRecvLen == 1 )
        {
            strcat(szFSMInfoEn, "\r\n  The telnet NVT FSM :");
            strcat(szFSMInfoCh, "\r\n  Telnet 网络虚拟终端状态机 :");
            strcat(szFSMInfoEn, "\r\n    the current state   : TSDOPT");
            strcat(szFSMInfoCh, "\r\n    当前状态    : TSDOPT");
            strcat(szFSMInfoEn, "\r\n    the input character : TXBINARY ( Transition Binary ) ");
            strcat(szFSMInfoCh, "\r\n    输入字符    : TXBINARY ( Transition Binary ) ");
            if ( pTermStruct->TelnetParam.OptionCmd == TCDO )
            {
                strcat(szFSMInfoEn, "\r\n    the option negotiate command is : DO");
                strcat(szFSMInfoCh, "\r\n    选项协商命令: DO");
            }
            else
            {
                strcat(szFSMInfoEn, "\r\n    the option negotiate command is : DONT");
                strcat(szFSMInfoCh, "\r\n    选项协商命令: DONT");
            }

            if ( pTermStruct->TelnetParam.SendBinary )
            {
                strcat(szFSMInfoEn, "\r\n    the SendBinary option state  : 1 ");
                strcat(szFSMInfoCh, "\r\n    发送二进制选项状态: 1 ");
            }
            else
            {
                strcat(szFSMInfoEn, "\r\n    the SendBinary option state  : 0 ");
                strcat(szFSMInfoCh, "\r\n    发送二进制选项状态: 0 ");
            }

            strcat(szFSMInfoEn, "\r\n    the next state      : TSDATA ");
            strcat(szFSMInfoCh, "\r\n    下一状态    : TSDATA ");
            if (   pTermStruct->TelnetParam.OptionCmd == TCDO
                && ! pTermStruct->TelnetParam.SendBinary )
            {
                strcat(szFSMInfoEn, "\r\n    the action          : send \"IAC WILL TXBINARY\" ");
                strcat(szFSMInfoCh, "\r\n    执行动作    : send \"IAC WILL TXBINARY\" ");
                strcat(szFSMInfoEn, "\r\n    SendBinary = 1\n\r ");
                strcat(szFSMInfoCh, "\r\n    SendBinary = 1\n\r ");
            }
            else if (   pTermStruct->TelnetParam.OptionCmd == TCDONT
                     && pTermStruct->TelnetParam.SendBinary )
            {
                strcat(szFSMInfoEn, "\r\n    the action          : send \"IAC WONT TXBINARY\" ");
                strcat(szFSMInfoCh, "\r\n    执行动作    : send \"IAC WONT TXBINARY\" ");
                strcat(szFSMInfoEn, "\r\n    SendBinary = 0\n\r ");
                strcat(szFSMInfoCh, "\r\n    SendBinary = 0\n\r ");
            }
        }
        CLI_TelFSMDegOut(szFSMInfoEn, szFSMInfoCh);
    }

    /*--------------------------------------------------------------*/
    /* 接收到"IAC DO/DONT BINARY-TRANSMISSION"                      */
    /* 根据当前的send BINARY-TRANSMISSION 选项状态                  */
    /* 如果和客户端要求相符,则不动作                                */
    /* 否则设置send BINARY-TRANSMISSION 选项                        */
    /* 应答客户端以"IAC WILL/WONT BINARY-TRANSMISSION"              */
    /*--------------------------------------------------------------*/
    if ( pTermStruct->TelnetParam.SendBinary )
    {
        if ( pTermStruct->TelnetParam.OptionCmd == TCDO )
            return 1 ;
    }
    else if ( pTermStruct->TelnetParam.OptionCmd == TCDONT )
        return 1 ;

    pTermStruct->TelnetParam.SendBinary = ! ( pTermStruct->TelnetParam.SendBinary ) ;

    pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCIAC ;
    if ( pTermStruct->TelnetParam.SendBinary )
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCWILL ;
    else
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCWONT ;
    pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)c ;

    pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;

    CLI_SendToTerm ( pTermStruct ) ;

    return 1 ;
}

/*==================================================================*/
/*      函数名      :CLI_DoTermType                                 */
/*      函数功能    :处理telnet do/don't TERMINAL_TYPE选项          */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据             */
/*                   _U8 c  接收到的输入字符                      */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据             */
/*      返回值      :_U32   1:成功                                 */
/*      调用函数    :CLI_DebugOutString ( )                         */
/*      被调函数    :                                               */
/*==================================================================*/

_U32 CLI_DoTermType ( PTerm_Data_S pTermStruct, _U8 c )
{
    _S8 szFSMInfoEn[1024] = "";
    _S8 szFSMInfoCh[1024] = "";

    if(pTermStruct == G_NULL)
    {
        return 1;
    }
    if ( G_TRUE == m_bCliTelnetDebugOn )
    {
        if ( pTermStruct->iRecvLen == 1 )
        {
            strcat(szFSMInfoEn, "\r\n  The telnet NVT FSM :");
            strcat(szFSMInfoCh, "\r\n  Telnet 网络虚拟终端状态机 :");
            strcat(szFSMInfoEn, "\r\n    the current state   : TSWOPT");
            strcat(szFSMInfoCh, "\r\n    当前状态    : TSWOPT");
            strcat(szFSMInfoEn, "\r\n    the input character : TERMTYPE");
            strcat(szFSMInfoCh, "\r\n    输入字符    : TERMTYPE");
            strcat(szFSMInfoEn, "\r\n    the next state      : TSDATA");
            strcat(szFSMInfoCh, "\r\n    下一状态    : TSDATA");
            if ( pTermStruct->TelnetParam.OptionCmd == TCWONT )
            {
                strcat(szFSMInfoEn, "\r\n    the option negotiate command is : WONT");
                strcat(szFSMInfoCh, "\r\n    选项协商命令: WONT");
                strcat(szFSMInfoEn, "\r\n    the action       : send \"IAC DONT TERMTYPE\"\n\r");
                strcat(szFSMInfoCh, "\r\n    执行动作    : send \"IAC DONT TERMTYPE\"\n\r");
            }
            else
            {
                strcat(szFSMInfoEn, "\r\n    the option negotiate command is : WILL");
                strcat(szFSMInfoCh, "\r\n    选项协商命令: WILL");
                strcat(szFSMInfoEn, "\r\n    the action       : send \"IAC SB TERMTYPE SEND IAC SE\"\n\r");
                strcat(szFSMInfoCh, "\r\n    执行动作    : send \"IAC SB TERMTYPE SEND IAC SE\"\n\r");
            }
        }
        CLI_TelFSMDegOut(szFSMInfoEn, szFSMInfoCh);
    }

    /*--------------------------------------------------------------*/
    /* 如果接收到"IAC WONT TERM-TYPE"                               */
    /*    则发送 "IAC DONT TERM-TYPE"                               */
    /*--------------------------------------------------------------*/
    if ( pTermStruct->TelnetParam.OptionCmd == TCWONT )
    {
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCIAC ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCDONT ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)c ;

        pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;

        CLI_SendToTerm ( pTermStruct ) ;

        return 1 ;
    }
    /*--------------------------------------------------------------*/
    /* 否则如果接收到 "IAC WILL TERM-TYPE"                          */
    /* 则发送 "IAC SB TERMTYPE SEND IAC SE"开始子协商终端类型       */
    /*--------------------------------------------------------------*/

    else if ( pTermStruct->TelnetParam.OptionCmd == TCWILL )
    {
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCIAC ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCSB ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = TOTERMTYPE ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = TT_SEND ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCIAC ;
        pTermStruct->szSendBuf[ pTermStruct->iSendLen++ ] = (_S8)TCSE ;

        pTermStruct->szSendBuf[ pTermStruct->iSendLen ] = '\0' ;

        CLI_SendToTerm ( pTermStruct ) ;

        pTermStruct->TelnetParam.FirstTermType[0] = '\0' ;
        pTermStruct->TelnetParam.TermType[0] = '\0' ;

        return 1 ;
    }


    return 1 ;
}

/*==================================================================*/
/*      函数名      :CLI_SubTermType                                */
/*      函数功能    :进行终端类型选项子协商                         */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据             */
/*                   _U8 c  接收到的输入字符                      */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据             */
/*      返回值      :_U32   1:成功                                 */
/*      调用函数    :CLI_DebugOutString ( )                         */
/*      被调函数    :                                               */
/*==================================================================*/

_U32 CLI_SubTermType ( PTerm_Data_S pTermStruct, _U8 c )
{
    _S8 szTmp[2] ;
    _S8 szFSMInfoEn[1024] = "";
    _S8 szFSMI

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -