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

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>
            激情婷婷久久| 亚洲日本精品国产第一区| 国产精品久久夜| 欧美精品在线一区二区三区| 免播放器亚洲| 欧美黑人一区二区三区| 欧美激情综合五月色丁香| 亚洲精品日产精品乱码不卡| 亚洲精品国产视频| 亚洲视频免费在线观看| 亚洲欧美综合v| 欧美精品日韩一区| 国产精品成人一区二区三区吃奶| 欧美日韩在线第一页| 国产精品毛片a∨一区二区三区| 国产伦精品免费视频| 黑人一区二区| 欧美午夜精品久久久久免费视 | 狠狠色伊人亚洲综合成人| 1000部国产精品成人观看| 亚洲啪啪91| 亚洲欧美中文日韩在线| 久久国产精品久久久久久久久久| 麻豆精品一区二区综合av| 亚洲黄色成人久久久| 亚洲一区在线免费| 久久综合九色欧美综合狠狠| 欧美日韩国产小视频在线观看| 欧美性猛片xxxx免费看久爱| 激情亚洲成人| 亚洲在线观看视频| 亚洲小视频在线观看| 久久精品国产v日韩v亚洲| 亚洲国产岛国毛片在线| 亚洲欧美日韩精品久久久| 另类春色校园亚洲| 国产欧美va欧美va香蕉在| 亚洲黄色精品| 久久精品一区中文字幕| 夜久久久久久| 欧美激情第五页| 一区二区三区在线免费观看| 亚洲欧美在线观看| 99re6热在线精品视频播放速度| 久久国产99| 国产精品视频福利| av成人毛片| 欧美国产欧美综合| 欧美在线啊v一区| 国产精品一区视频| 一区二区三区视频在线观看| 欧美成人亚洲成人| 国产精品国产| 亚洲人成高清| 久久精品国产综合精品| 亚洲天堂男人| 欧美三级中文字幕在线观看| 亚洲精品乱码久久久久久蜜桃91| 巨胸喷奶水www久久久免费动漫| 亚洲欧美激情四射在线日 | 欧美在线播放一区| 亚洲自啪免费| 国产午夜精品美女毛片视频| 欧美在线影院在线视频| 亚洲欧美日韩人成在线播放| 国产九九精品视频| 久久精品成人欧美大片古装| 亚洲男女自偷自拍| 国产亚洲欧美一区在线观看| 久久国产精品久久久| 欧美一乱一性一交一视频| 国产一区久久| 免费亚洲电影在线| 美女国产一区| 亚洲天堂偷拍| 欧美亚洲系列| 影音先锋久久| 亚洲精品一区二区三| 欧美日本久久| 亚洲一区二区在线免费观看| 亚洲天堂久久| 国内精品视频在线观看| 欧美中文字幕在线播放| 性做久久久久久免费观看欧美 | 久久久噜噜噜久噜久久| 亚洲欧美激情精品一区二区| 亚洲欧美日本另类| 一区二区三区在线观看欧美| 久久久www| 久久久国际精品| 国产亚洲综合性久久久影院| 久久乐国产精品| 久久久久久久久久看片| 亚洲国产婷婷香蕉久久久久久| 久久不射2019中文字幕| 欧美成人中文字幕| 99精品黄色片免费大全| 亚洲精品一线二线三线无人区| 欧美日韩中文字幕在线视频| 亚洲欧美综合一区| 久久精品国产精品亚洲综合| 91久久久一线二线三线品牌| 亚洲级视频在线观看免费1级| 欧美亚洲成人网| 欧美一级在线播放| 欧美伊人久久久久久久久影院| 好看不卡的中文字幕| 欧美福利一区| 国产精品久久久久秋霞鲁丝| 国产日韩欧美二区| 在线观看一区| 亚洲免费观看视频| 欧美—级a级欧美特级ar全黄| 亚洲香蕉在线观看| 亚洲一区二区三区色| 99ri日韩精品视频| 欧美一区二区三区免费视| 亚洲经典三级| 午夜精品亚洲一区二区三区嫩草| 亚洲国产精品ⅴa在线观看 | 久久人体大胆视频| 亚洲香蕉视频| 久久婷婷国产麻豆91天堂| 亚洲一级在线| 欧美久久在线| 另类国产ts人妖高潮视频| 欧美图区在线视频| 亚洲成人在线免费| 国产欧美日本一区视频| 亚洲国产日本| 激情六月婷婷综合| 亚洲老板91色精品久久| 黄色免费成人| 亚洲嫩草精品久久| 欧美在线视频一区| 欧美日韩精品久久久| 欧美成人亚洲成人| 国产精品视频区| 亚洲日本欧美| 亚洲国产日韩精品| 欧美sm视频| 免费观看成人| 国内精品久久久久久久果冻传媒| 一个色综合导航| 日韩视频在线你懂得| 久久色中文字幕| 欧美专区在线播放| 国产精品日韩一区| 亚洲视频专区在线| 99热这里只有精品8| 欧美不卡高清| 亚洲电影在线看| 亚洲午夜在线观看视频在线| 欧美日韩精品中文字幕| 亚洲欧洲日夜超级视频| 亚洲精品日韩久久| 欧美精品电影| 亚洲毛片在线观看| 激情综合亚洲| 美女成人午夜| 亚洲欧洲一区二区三区| 亚洲日本成人网| 欧美国产精品日韩| 亚洲精品国产品国语在线app| 国产欧美 在线欧美| 久久久久久午夜| 欧美不卡视频| 亚洲欧洲午夜| 欧美激情综合网| 这里只有视频精品| 欧美在线播放视频| 欧美一区二视频| 久久精品在这里| 亚洲午夜激情网页| 欧美在线黄色| 一区二区三区在线不卡| 久热精品在线| 亚洲国内自拍| 亚洲欧美日韩天堂| 国内精品写真在线观看| 欧美aa在线视频| 99re在线精品| 久久精品日韩一区二区三区| 亚洲福利视频一区二区| 欧美日韩免费在线| 小黄鸭精品密入口导航| 老司机一区二区三区| 日韩特黄影片| 国产精品亚洲成人| 欧美一级淫片aaaaaaa视频| 欧美88av| 午夜亚洲视频| 在线国产精品播放| 欧美午夜精彩| 久久久久久久综合色一本| 一区二区精品在线观看| 老牛嫩草一区二区三区日本 | 久久久美女艺术照精彩视频福利播放 | 亚洲视频免费看| 激情久久五月|