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

Codejie's C++ Space

Using C++

輪子:CmdChannel的CmdParser


    CmdParser是用于分解和分析命令輸入的,說是一個Parser,實際很簡單,就是將命令分解,然后將分解出來的命令字串跟已經(jīng)'regist'的命令字串進行一一的比較,找到就返回注冊命令的指針,并傳入相應(yīng)的參數(shù)(這部分代碼在TelnetServer中);找不到就執(zhí)行默認的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 閱讀(474) 評論(0)  編輯 收藏 引用 所屬分類: C++輪子精神

公告

Using C++

導航

統(tǒng)計

留言簿(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一区二区| 欧美亚洲免费电影| 久久中文字幕一区二区三区| 蜜臀av一级做a爰片久久| 欧美精品18+| 国产乱码精品| 在线观看亚洲a| 99精品国产福利在线观看免费 | 怡红院精品视频| 亚洲精品美女久久7777777| 在线视频精品| 久久久精品视频成人| 欧美黄免费看| 中日韩视频在线观看| 久久精品国产综合| 欧美国产激情二区三区| 国产精品视屏| 日韩午夜精品| 美日韩免费视频| 一级日韩一区在线观看| 久久精品国产第一区二区三区| 欧美韩日一区二区三区| 国产日韩在线播放| 一区二区三区日韩欧美精品| 久久精品中文字幕免费mv| 亚洲欧洲精品一区二区| 亚洲天堂免费在线观看视频| 久久亚洲私人国产精品va媚药| 欧美亚州一区二区三区| 亚洲欧洲一区二区三区| 久久综合久久88| 午夜视频在线观看一区二区三区 | 国产日韩欧美精品在线| 99视频精品全国免费| 免费看av成人| 欧美亚洲免费| 国产精品视频免费观看| 一区二区三区欧美亚洲| 亚洲高清在线| 欧美一区二区三区婷婷月色 | 欧美在线免费观看亚洲| 欧美日韩激情网| 一区二区免费在线视频| 女女同性精品视频| 亚洲欧美日韩中文在线制服| 欧美一区二区精品久久911| 亚洲福利视频一区| 欧美一站二站| 国产欧美日韩另类视频免费观看| 亚洲色图综合久久| 亚洲伦理在线| 欧美精品久久久久久久免费观看 | 一区二区电影免费在线观看| 欧美激情亚洲| 久久亚洲综合色| 激情综合在线| 久久久久久夜| 欧美第一黄色网| 久久久五月婷婷| 一区在线免费观看| 欧美a级大片| 另类综合日韩欧美亚洲| 在线看不卡av| 亚洲成在线观看| 免费成人av| 一区二区激情| 亚洲一区国产视频| 国产一区日韩二区欧美三区| 久久一区二区精品| 欧美激情一区二区三区蜜桃视频| 一本色道久久综合亚洲精品不卡 | 美女视频网站黄色亚洲| 麻豆av一区二区三区久久| 亚洲人成啪啪网站| 一区二区三区www| 国产欧美精品日韩精品| 久久综合九色欧美综合狠狠| 欧美成人一区二区三区在线观看| 一区二区欧美日韩视频| 亚洲欧美中日韩| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲第一天堂av| 国产精品久久久久久av下载红粉 | 亚洲网站在线播放| 亚洲欧美国产不卡| 亚洲黄一区二区三区| 一区二区冒白浆视频| 韩国亚洲精品| 亚洲美女一区| 狠狠色综合色区| 99re这里只有精品6| 精品不卡一区二区三区| 99视频精品全国免费| 在线电影院国产精品| 亚洲一区二区精品| 亚洲精品国精品久久99热一| 亚洲一区网站| 亚洲精品一区二区三区婷婷月| 一区二区三区免费网站| 国产精品久久久久影院色老大 | 欧美a级片网站| 欧美午夜三级| 国产精品99久久久久久久vr| 午夜精品久久久久久久99热浪潮 | 亚洲自拍偷拍色片视频| 国产精品欧美在线| 香港久久久电影| 女人色偷偷aa久久天堂| 亚洲精品美女91| 欧美午夜宅男影院在线观看| 亚洲免费视频观看| 女女同性女同一区二区三区91| 99精品国产一区二区青青牛奶 | 久久婷婷一区| 亚洲人永久免费| 国产精品久久久久久久久借妻| 午夜一区二区三区在线观看 | 欧美日韩亚洲91| 欧美一区二区三区日韩| 亚洲国产电影| 欧美在线看片| 最新高清无码专区| 国产精品久久久久久户外露出| 久久精品中文字幕一区| 日韩香蕉视频| 另类激情亚洲| 亚洲一区精品视频| 在线观看一区视频| 国产精品wwwwww| 久久综合九九| 亚洲在线不卡| 亚洲精品乱码久久久久久蜜桃91| 久久疯狂做爰流白浆xx| aa日韩免费精品视频一| 黄色精品在线看| 国产精品日韩| 欧美大秀在线观看| 欧美一区二区三区免费观看视频 | 午夜一区不卡| 亚洲精选一区| 欧美高清视频在线观看| 欧美一级理论性理论a| 日韩视频在线一区二区| 红桃视频一区| 日韩亚洲欧美一区| 1024成人网色www| 欧美精品尤物在线| 一区二区三区不卡视频在线观看| 性欧美大战久久久久久久久| 国产日韩成人精品| 久久久久久久999精品视频| 免费不卡在线观看| 国产精品久久久久av| 久久婷婷一区| 欧美一区二区三区的| 亚洲欧美另类综合偷拍| 小黄鸭精品密入口导航| 久久久国产一区二区三区| 亚洲一区二区在线观看视频| 亚洲精品在线观看免费| 亚洲国产精品一区制服丝袜| 理论片一区二区在线| 久久综合999| 久久久一本精品99久久精品66| 性久久久久久久久久久久| 午夜精品久久久久| 午夜精品视频网站| 亚洲影院在线| 亚洲永久免费观看| 午夜精品网站| 久久精品亚洲热| 麻豆9191精品国产| 能在线观看的日韩av| 快播亚洲色图| 亚洲大胆视频| 91久久精品国产| 亚洲人成绝费网站色www| 亚洲黄色在线| 99这里只有久久精品视频| 在线视频精品一区| 亚洲一区bb| 欧美一区1区三区3区公司| 久久超碰97中文字幕| 久久精品综合| 免费久久99精品国产自在现线| 蜜臀久久99精品久久久久久9| 欧美阿v一级看视频| 欧美日韩日本网| 国产精品一区二区视频| 狠狠综合久久| 日韩视频一区二区三区| 亚洲一区二区三区午夜| 久久久久久久91| 亚洲国产日韩欧美在线图片| 日韩一级成人av| 欧美在线视频免费| 欧美激情综合五月色丁香|