青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Codejie's C++ Space

Using C++

輪子:CmdChannel的CmdParser


    CmdParser是用于分解和分析命令輸入的,說是一個Parser,實際很簡單,就是將命令分解,然后將分解出來的命令字串跟已經'regist'的命令字串進行一一的比較,找到就返回注冊命令的指針,并傳入相應的參數(這部分代碼在TelnetServer中);找不到就執行默認的UnknownCmdProc。


#ifndef __CCCMD_H__
#define __CCCMD_H__

#include 
"CCDataType.h"


extern int cc_TelnetServer_ClientWriteText(SOCKET s, const char* text);


extern int cc_CmdParser_Parser(struct _cc_telnet_clientdata* client, struct _cc_cmddata** cmd, int* argc, char argv[][CC_SIZE_CMD]);
extern int cc_CmdParser_UnknownCmd(struct _cc_telnet_clientdata* client, const char* cmd);

extern int cc_RegCmd(const char* cmd, const char*help, const _cc_cmdcallback callback);
extern int cc_RegDefaultCmds();

extern int cc_CmdOutput(struct _cc_telnet_clientdata* client, const char* fmt, );

extern int cc_cmd_exit(struct _cc_telnet_clientdata* client, int argc, const char (*argv)[CC_SIZE_CMD]);
extern int cc_cmd_help(struct _cc_telnet_clientdata* client, int argc, const char (*argv)[CC_SIZE_CMD]);
extern int cc_cmd_list(struct _cc_telnet_clientdata* client, int argc, const char (*argv)[CC_SIZE_CMD]);
extern int cc_cmd_version(struct _cc_telnet_clientdata* client, int argc, const char (*argv)[CC_SIZE_CMD]);


#endif



#include 
<stdarg.h>

#include 
"CCCmd.h"

int cc_CmdParser_Search(const char* str, struct _cc_cmddata** cmd)
{
    
struct _cc_cmddata* c = cc_Global.cmd.cmd;
    
while(c != NULL)
    
{
        
if(strcmp(c->cmd, str) == 0)
        
{
            (
*cmd) = c;
            
return 0;
        }

        c 
= c->next;
    }

    
    
return -1;
}


int cc_CmdParser_Parser(struct _cc_telnet_clientdata* client, struct _cc_cmddata** cmd, int* argc, char argv[][CC_SIZE_CMD])
{
    
char str[CC_SIZE_CMD];
    
char* token = NULL;
    
char* sep = ",";

    memset(str, 
0sizeof(str));
    strncpy(str, client
->buf, client->recv - 2);
    
    token 
= strtok(str, sep);
    
if(token == NULL)
        
return -1;
    
    
if(cc_CmdParser_Search(token, cmd) != 0)
    
{
        cc_CmdParser_UnknownCmd(client, token);
        
return -1;
    }

    
    (
*argc) = 0;
    token 
= strtok(NULL, sep);
    
while(token != NULL)
    
{
        strncpy(
&argv[(*argc)], token, CC_SIZE_CMD);
        
++ (*argc);
        token 
= strtok(NULL, sep);
    }


    
return 0;
}


int cc_CmdParser_UnknownCmd(struct _cc_telnet_clientdata* client, const char* cmd)
{
    cc_CmdOutput(client, 
"Unknown command - %s\r\n", cmd);

    
return 0
}


int cc_RegDefaultCmds()
{
    cc_RegCmd(
".version""display version info.", cc_cmd_version);
    cc_RegCmd(
".exit""exit the connection.", cc_cmd_exit);
    cc_RegCmd(
".help""display help info of command.", cc_cmd_help);
    cc_RegCmd(
".list""list all connections.", cc_cmd_list);

    
return 0;
}



int cc_RegCmd(const char* cmd, const char* help, const _cc_cmdcallback callback)
{
    
struct _cc_cmddata* tmp = NULL;
    
struct _cc_cmddata* c = (struct _cc_cmddata*)malloc(sizeof(struct _cc_cmddata));
    c
->callback = callback;
    strncpy(c
->cmd, cmd, sizeof(c->cmd));
    strncpy(c
->help, help, sizeof(c->help));
    c
->next = NULL;

    
if(cc_Global.cmd.cmd == NULL)
    
{
        cc_Global.cmd.cmd 
= c;
    }

    
else
    
{
        tmp 
= cc_Global.cmd.cmd;
        
while(tmp->next != NULL)
        
{
            tmp 
= tmp->next;
        }

        tmp
->next = c;
    }


    
return 0;
}


int cc_CmdOutput(struct _cc_telnet_clientdata* client, const char* fmt, )
{
    
char buf[CC_SIZE_CMD];
    
int len = -1;
    va_list args;

    memset(buf, 
0sizeof(buf));
    va_start(args, fmt);
    len 
= vsprintf(buf, fmt, args);
    va_end(args);
    
return cc_TelnetServer_ClientWrite(client->sock, buf, len);

//    len = sprintf(buf, fmt, __VA_ARGS__);
}


/* ----------------------------- */
int cc_cmd_exit(struct _cc_telnet_clientdata* client, int argc, const char (*argv)[CC_SIZE_CMD])
{
    cc_CmdOutput(client, 
"bye.\r\n");
    
return -1;    
}


int cc_cmd_help(struct _cc_telnet_clientdata* client, int argc, const char (*argv)[CC_SIZE_CMD])
{
    
struct _cc_cmddata* tmp = cc_Global.cmd.cmd;
    
while(tmp != NULL)
    
{
        
if(argc > 0)
        
{
            
if(strncmp(tmp->cmd, argv[0], sizeof(tmp->cmd)) == 0)
            
{
                cc_CmdOutput(client, 
"%s : %s\r\n", tmp->cmd, tmp->help);

                
return 0;
            }

        }

        
else
        
{
            cc_CmdOutput(client, 
"%s : %s\r\n", tmp->cmd, tmp->help);
        }

        tmp 
= tmp->next;
    }

    
return 0;
}


int cc_cmd_list(struct _cc_telnet_clientdata* client, int argc, const char (*argv)[CC_SIZE_CMD])
{
    
struct _cc_telnet_clientdata* tmp = cc_Global.telnet.client;

    
while(tmp != NULL)
    
{
        
        cc_CmdOutput(client, 
"conn %d : %s:%d in %s", tmp->index, tmp->ip, tmp->port, asctime(gmtime(&tmp->updated)));
        tmp 
= tmp->next;
    }

    cc_CmdOutput(client, 
"\r\n");
    
return 0;
}


int cc_cmd_version(struct _cc_telnet_clientdata* client, int argc, const char (*argv)[CC_SIZE_CMD])
{
    cc_CmdOutput(client, 
"CmdChannel library v0.0.0.2 by Jie.(codejie@gmail.com).\r\n");
    
return 0;
}

posted on 2009-12-16 23:01 codejie 閱讀(470) 評論(0)  編輯 收藏 引用 所屬分類: C++輪子精神

公告

Using C++

導航

統計

留言簿(73)

隨筆分類(513)

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产在线视频| 欧美日韩高清在线播放| 国产亚洲精品7777| 久久电影一区| 久久精品国内一区二区三区| 亚洲小少妇裸体bbw| 欧美性理论片在线观看片免费| 亚洲一区二区欧美| 亚洲女女女同性video| 狠狠噜噜久久| 亚洲国产欧美一区二区三区同亚洲| 乱人伦精品视频在线观看| 亚洲精品一级| 亚洲欧美日韩成人| 黑人一区二区三区四区五区| 亚洲大胆av| 国产伦精品一区二区三区高清版| 久久亚洲精品欧美| 欧美区在线播放| 久久国产精品99精品国产| 久久欧美肥婆一二区| 亚洲深夜影院| 久久av一区二区三区| 99re6这里只有精品| 亚洲欧美一区在线| 亚洲精品在线看| 亚洲男人第一网站| 亚洲人成绝费网站色www| 亚洲午夜一区二区| 亚洲人成人一区二区三区| 亚洲欧美在线x视频| 亚洲美女电影在线| 久久精品国产99国产精品澳门| 一本色道久久综合狠狠躁篇怎么玩| 亚洲一区亚洲二区| 亚洲精品久久在线| 久久九九免费| 欧美一区二区高清在线观看| 欧美成人免费视频| 久久麻豆一区二区| 国产免费观看久久| 夜夜嗨av色综合久久久综合网| 国产一区二区三区奇米久涩| 亚洲伦理中文字幕| 亚洲人成毛片在线播放| 久久久久se| 久久狠狠亚洲综合| 国产精品日韩欧美一区二区三区| 亚洲国产综合在线| 亚洲人体1000| 每日更新成人在线视频| 久久女同互慰一区二区三区| 国产深夜精品福利| 亚洲欧美激情诱惑| 在线亚洲免费| 欧美日韩免费网站| 日韩视频不卡| 一区二区三区精品| 欧美视频日韩| 一本综合久久| 亚洲一区二区三区中文字幕在线| 欧美精品一区二区三| 欧美激情一区二区三区高清视频| 在线成人免费观看| 久久综合网hezyo| 欧美成人精品一区| 亚洲国产精品小视频| 免费在线日韩av| 亚洲激情精品| 亚洲视频一二| 国产精品高潮呻吟| 午夜久久黄色| 99精品视频一区| 欧美激情综合在线| 一本久道久久综合婷婷鲸鱼| 亚洲欧美日韩久久精品| 国产九九精品视频| 久久乐国产精品| 欧美国产精品中文字幕| 亚洲三级影片| 欧美视频一区| 香蕉久久国产| 亚洲大胆在线| 亚洲天堂av电影| 国产亚洲精品久久久久久| 欧美一区二区免费| 亚洲高清自拍| 亚洲女同同性videoxma| 国产欧美一区二区三区久久| 久久久久久久激情视频| 亚洲激情综合| 欧美一区二区三区精品电影| 狠狠色狠色综合曰曰| 欧美日韩1080p| 欧美一级久久| 亚洲激情国产| 久久久精品国产一区二区三区| 91久久国产综合久久91精品网站| 欧美日韩高清在线| 久久精品久久99精品久久| 亚洲国内欧美| 久久精品91| 99成人免费视频| 国产尤物精品| 欧美午夜女人视频在线| 久久久久国产一区二区三区四区| 亚洲精品乱码久久久久久| 久久精品人人爽| 宅男在线国产精品| 亚洲风情亚aⅴ在线发布| 国产精品久久9| 女人香蕉久久**毛片精品| 午夜在线播放视频欧美| 亚洲精品小视频| 欧美成人中文| 久久精品99无色码中文字幕| 99re66热这里只有精品4| 亚洲第一精品夜夜躁人人躁| 国产精品入口日韩视频大尺度| 欧美aa在线视频| 久久免费精品视频| 香蕉久久夜色精品国产使用方法 | 国产免费成人在线视频| 欧美乱妇高清无乱码| 快射av在线播放一区| 午夜亚洲性色福利视频| 在线午夜精品自拍| 亚洲美女av黄| 亚洲精品自在久久| 欧美多人爱爱视频网站| 久久一区二区三区超碰国产精品| 欧美一级视频免费在线观看| 中日韩在线视频| 99精品视频一区二区三区| 亚洲区一区二| 亚洲精品日韩综合观看成人91| 亚洲福利视频专区| 在线观看亚洲| 亚洲电影欧美电影有声小说| 国内精品免费午夜毛片| 激情欧美日韩| 一区在线影院| 亚洲电影免费在线| 亚洲激情视频| 亚洲精品免费网站| 亚洲毛片在线| 在线午夜精品| 午夜精品久久久久久久| 国产主播一区| 伊人蜜桃色噜噜激情综合| 狠狠色综合网| 在线观看亚洲视频| 亚洲黄色三级| 一区二区三区国产在线| 亚洲性av在线| 久久成人18免费观看| 久久综合久久综合九色| 欧美激情免费在线| 亚洲伦伦在线| 亚洲欧美日韩综合| 久久影院亚洲| 欧美—级a级欧美特级ar全黄| 欧美日韩一区二区精品| 国产精品剧情在线亚洲| 好吊色欧美一区二区三区四区 | 91久久精品国产91性色tv| 日韩亚洲视频| 亚欧成人精品| 欧美+日本+国产+在线a∨观看| 亚洲片在线观看| 亚洲一区不卡| 快射av在线播放一区| 欧美日韩亚洲一区三区| 国产真实乱子伦精品视频| 日韩一区二区福利| 欧美诱惑福利视频| 亚洲第一天堂无码专区| 亚洲亚洲精品在线观看| 美女主播精品视频一二三四| 欧美日韩亚洲高清一区二区| 国产在线乱码一区二区三区| 亚洲欧洲精品一区二区三区| 性色av一区二区三区红粉影视| 欧美xxx成人| 亚洲欧美色一区| 欧美另类视频| 一区二区视频免费完整版观看| 亚洲视频在线观看| 另类图片国产| 亚洲免费影视| 欧美久久久久| 亚洲成人影音| 久久国产加勒比精品无码| 最新中文字幕亚洲| 久久久久久9| 国产欧美日韩在线| 亚洲图片欧美日产| 亚洲欧洲日本专区| 久久免费高清| 国内精品久久久久久影视8|