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

Codejie's C++ Space

Using C++

輪子:Ubuntu上也能用的CCTelnetServer.c

    不說(shuō)啥了,貼代碼。

#include <stdio.h>
#include 
<time.h>
#include 
<string.h>

#if defined(WIN32)

#include 
<winsock2.h>

#else
#include 
<unistd.h>
#include 
<sys/socket.h>
#include 
<netinet/in.h>
#include 
<arpa/inet.h>
#include 
<sys/ioctl.h>
#include 
<pthread.h>
#endif


#include 
"CCDataType.h"
#include 
"CCCmd.h"
#include 
"CCOutput.h"
#include 
"CCTelnetServer.h"

int cc_TelnetServer_AddClient(SOCKET s, const struct sockaddr * addr)
{
    
int index = 0;
    
    
if(cc_Global.telnet.count + 1 > cc_Global.telnet.max)
    
{
        cc_TelnetServer_ClientWriteText(s, 
"Sorry, the number of connection has exceeded the limit.\n");
#if defined(WIN32)
        closesocket(s);
#else
        close(s);
#endif
    }

    
else
    
{
        
struct _cc_telnet_clientdata * tmp = cc_Global.telnet.client;
        
struct _cc_telnet_clientdata * client = (struct _cc_telnet_clientdata*)malloc(sizeof(struct _cc_telnet_clientdata));
        client
->sock = s;
        strncpy(client
->ip, inet_ntoa(((const struct sockaddr_in*)addr)->sin_addr), sizeof(client->ip));
        client
->port = ((const struct sockaddr_in*)addr)->sin_port;
        client
->updated = time(NULL);
        client
->recv = 0;
        client
->next = NULL;

        
if(tmp == NULL)
        
{
            client
->index = 0;
            cc_Global.telnet.client 
= client;
        }

        
else
        
{
            index 
= tmp->index;
            
while(tmp->next != NULL)
            
{
                
if(index < tmp->index)
                    index 
= tmp->index;
                tmp 
= tmp->next;
            }

            client
->index = index + 1;
            tmp
->next = client;
        }


        
++ cc_Global.telnet.count;

        CC_LOG_OUTPUT(
"INFO""Client %d connected.\n", client->index);

        cc_TelnetServer_ClientWritePrompt(s);
    }


    
return 0;
}


int cc_TelnetServer_RemoveClient(struct _cc_telnet_clientdata* client)
{
    
struct _cc_telnet_clientdata* tmp = cc_Global.telnet.client;

    
if(tmp->next == NULL)
    
{
        cc_Global.telnet.client 
= NULL;        
    }

    
else if(tmp == client)
    
{
        cc_Global.telnet.client 
= tmp->next;
    }

    
else
    
{
        
while(tmp->next != client)
        
{
            tmp 
= tmp->next;
        }

        tmp
->next = client->next;
    }

#if defined(WIN32)
    closesocket(client
->sock);
#else
    close(client
->sock);
#endif
    
-- cc_Global.telnet.count;
    free(client);

    
return 0;
}


void cc_TelnetServer_RemoveAllClients()
{
    
struct _cc_telnet_clientdata* client = cc_Global.telnet.client, *tmp = NULL;
    
while(client != NULL)
    
{
        tmp 
= client;
        client 
= client->next;

    
#if defined(WIN32)
        closesocket(tmp
->sock);
    
#else
        close(tmp
->sock);
    
#endif

        free(tmp);
        
-- cc_Global.telnet.count;
    }

}


int cc_TelnetServer_SetFd(fd_set* fd)
{
    
int ret = cc_Global.telnet.sock;
    
struct _cc_telnet_clientdata* client = cc_Global.telnet.client;

    FD_ZERO(fd);
    FD_SET(cc_Global.telnet.sock, fd);

    
while(client != NULL)
    
{
        FD_SET(client
->sock, fd);
        
if(client->sock > ret)
            ret 
= client->sock;
        client 
= client->next;
    }

    
return ret;
}


int cc_TelnetServer_CheckFd(fd_set* fd)
{
    SOCKET cs 
= INVALID_SOCKET;
    
struct sockaddr addr;
#if defined(WIN32)
    
int len = sizeof(struct sockaddr);
#else
    socklen_t len 
= sizeof(struct sockaddr);
#endif
    
struct _cc_telnet_clientdata* client = cc_Global.telnet.client;

    
if(FD_ISSET(cc_Global.telnet.sock, fd) != 0)
    
{
        cs 
= accept(cc_Global.telnet.sock, &addr, &len);
        
if(cs != 0)
        
{
            cc_TelnetServer_AddClient(cs, 
&addr);
        }

    }

    
    
while(client != NULL)
    
{
        
if(FD_ISSET(client->sock, fd) != 0)
        
{
            cc_TelnetServer_OnClientRead(client);
            
break;
        }

        client 
= client->next;
    }

    
return 0;
}



//int cc_TelnetServer_Socket2File(SOCKET s, FILE** file)
//{
//    *file = fdopen(s, "w");
//    if((*file) == NULL)
//        return -1;
////    setlinebuf((*file));
//
//    return 0;
//}

/* ------------------------------- */
int cc_TelnetServer_ClientWrite(SOCKET s, const char* buf, int size)
{
    
char output[CC_SIZE_CMD];
    
int len = 0, i = 0;
    
while(i < size)
    
{
        
if(buf[i] == '\n')
        
{
            
if(i > 0)
            
{
                
if(buf[i - 1!= '\r')
                
{
                    output[len 
++= '\r';
                }

            }

            
else
            
{
                output[len 
++= '\r';
            }

        }

        output[len 
++ ] = buf[i];
        
++ i;
    }

    
    send(s, output, len, 
0);

    
return 0;
}


int cc_TelnetServer_ClientWriteText(SOCKET s, const char* text)
{
    
return cc_TelnetServer_ClientWrite(s, text, strlen(text));
}


int cc_TelnetServer_ClientWritePrompt(SOCKET s)
{
    
return cc_TelnetServer_ClientWriteText(s, cc_Global.telnet.prompt);
}


int cc_TelnetServer_ClientBufferProc(struct _cc_telnet_clientdata* client, const char* input, int size)
{
    
struct _cc_cmddata* cmd = NULL;
    
int argc = -1;
    
char argv[CC_SIZE_CMD/2][CC_SIZE_CMD];
    
int pos = -1;

    memset(argv, 
0sizeof(argv));

    
if(client->recv + size > CC_SIZE_CMD)
    
{
        client
->recv = 0;
        cc_TelnetServer_ClientWriteText(client
->sock, "command is too long.\r\n");
        cc_TelnetServer_ClientWritePrompt(client
->sock);
        
        
return 0;
    }

    
    memcpy(client
->buf + client->recv, input, size);
    pos 
= client->recv;
    client
->recv += size;

    
while(pos < client->recv)
    
{
        
if(client->buf[pos] == 0x08)//bs
        {
            
if(pos > 0)
            
{
                memcpy(client
->buf + pos - 1, client->buf + pos + 2, (client->recv - pos - 1));
                client
->recv -= 2;
            }

            
else if(pos == 0)
            
{
                memcpy(client
->buf, client->buf + 1, (client->recv - 1)); 
                client
->recv -= 1;
            }

            
else
            
{
                
return -1;
            }

            
break;
        }

        
//else if(client->buf[pos] == 0x1b)//esc
        
//{
        
//    client->recv = 0;
        
//    cc_TelnetServer_ClientWriteText(client->sock, "\r\n");
        
//    cc_TelnetServer_ClientWritePrompt(client->sock);
        
//}
        else if(client->buf[pos] == '\r' || client->buf[pos] == '\n')
        
{
            
if(client->recv > 2)
            
{
                
if(cc_CmdParser_Parser(client, &cmd, &argc, argv) == 0)
                
{
                    
if((cmd->callback)(client, argc, (const char (*)[CC_SIZE_CMD])argv) != 0)
                        
return -1;
                }

            }

            client
->recv = 0;
            cc_TelnetServer_ClientWritePrompt(client
->sock);
        }


        
++ pos;
    }

    
return 0;
 
//  
 
//   

    
//if (input[0] == ' ' ||
    
//    input[0] == ',' ||
    
//    input[0] == '!' || 
    
//    input[0] == '.' ||
    
//    input[0] == '/' ||
    
//    input[0] == '<' ||
    
//    input[0] == '>' ||
    
//    input[0] == '?' ||
    
//    input[0] == '_' ||
    
//    (input[0] >= '0' && input[0] <= '9') ||
    
//    (input[0] >= 'A' && input[0] <= 'Z') ||
    
//    (input[0] >= 'a' && input[0] <= 'z'))
 
//   {
 
//       memcpy(client->buf + client->recv, input, size);
 
//       client->recv += size;
 
//       cc_TelnetServer_ClientWrite(client->sock, input, size);
 
//   }
 
//   else if(input[0] == 0x08)//bs
 
//   {
 
//       if(client->recv > 0)
 
//       {
 
//           -- client->recv;
 
//           cc_TelnetServer_ClientWrite(client->sock, input, size);
 
//       }
 
//   }
 
//   else if(input[0] == 0x1b && input[1] == 0)
 
//   {
 
//       client->recv = 0;
 
//       cc_TelnetServer_ClientWrite(client->sock, "\r\n", 2);
 
//   }
 
//   else if(input[0] == '\r')
 
//   {
 
//       if(client->recv > 0)
 
//       {
 
//           cc_TelnetServer_ClientWrite(client->sock, "\r\n", 2);
 
//           //if(cc_CmdParser_Parser(client->buf, client->recv, &cmd, &argc, &argv) == 0)
 
//           //{
 
//           //    return cmd->callback(client, argc, argv);
 
//           //}
 
//           //else
 
//           //{
 
//           //    return -1;
 
//           //}

 
//           cc_TelnetServer_ClientWrite(client->sock, "\r\n", 2);
 
//           client->recv = 0;
 
//           cc_TelnetServer_ClientWrite(client->sock, ">", 1);
 
//       }
 
//   }
 
//   return 0;
}


int cc_TelnetServer_OnClientRead(struct _cc_telnet_clientdata* client)
{
    
int rc = -1;
    
char input[64];

    rc 
= recv(client->sock, input, sizeof(input), 0);
    
if(rc > 0)
    
{
        
if(cc_TelnetServer_ClientBufferProc(client, input, rc) != 0)
        
{
            CC_LOG_OUTPUT(
"INFO""Client %d request to disconnect.\n", client->index);
            cc_TelnetServer_RemoveClient(client);
        }

    }

    
else if(rc == 0)
    
{
        CC_LOG_OUTPUT(
"INFO""Client %d disconnect.\n", client->index);
        cc_TelnetServer_RemoveClient(client);
    }

    
else
    
{
        CC_LOG_OUTPUT(
"ERROR""Client %d read failed.\n", client->index);
        cc_TelnetServer_RemoveClient(client);
    }


    
return 0;
}


/* -------------------------- */

int cc_TelnetServer_Init()
{
    
int flag = 1;
    
struct sockaddr_in addr;

#if defined(WIN32)
    WSADATA wsa;

    
int ret = WSAStartup(MAKEWORD(22), &wsa);
    
if(ret != NO_ERROR)
    
{
        CC_LOG_OUTPUT(
"ERROR""WSAStartup() failed.\n");
        
return -1;
    }

#endif

    cc_Global.telnet.sock 
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
if(cc_Global.telnet.sock == INVALID_SOCKET)
    
{
        CC_LOG_OUTPUT(
"ERROR""socket() failed.\n");
        
return -1;
    }

#if defined(WIN32)    
    
if(ioctlsocket(cc_Global.telnet.sock, FIONBIO, &flag) != 0)
#else
    
if(ioctl(cc_Global.telnet.sock, FIONBIO, &flag) != 0)
#endif
    
{
        CC_LOG_OUTPUT(
"ERROR""ioctl() failed.\n");
        
return -1;
    }


    addr.sin_family 
= AF_INET;
    addr.sin_addr.s_addr 
= inet_addr(cc_Global.telnet.ip);
    addr.sin_port 
= htons(cc_Global.telnet.port);
    
    
if(bind(cc_Global.telnet.sock, (const struct sockaddr*)&addr, sizeof(addr)) != 0)
    
{
        CC_LOG_OUTPUT(
"ERROR""bind() failed.\n");
        
return -1;
    }

    
    
if(listen(cc_Global.telnet.sock, SOMAXCONN) != 0)
    
{
        CC_LOG_OUTPUT(
"ERROR""listen() failed.\n");
        
return -1;
    }


    
return 0;
}


int cc_TelnetServer_Final()
{
    cc_TelnetServer_RemoveAllClients();

    
if(cc_Global.telnet.sock != INVALID_SOCKET)
#if defined(WIN32)
        closesocket(cc_Global.telnet.sock);
#else
        close(cc_Global.telnet.sock);
#endif

#if defined(WIN32)
    WSACleanup();
#endif

    
return 0;
}


int cc_TelnetServer_Run()
{
    
struct timeval val;
    fd_set rd;
    
int maxfd = -1;
    
int ret = 1;

    val.tv_sec 
= 0;
    val.tv_usec 
= 100;

    cc_Global.telnet.run 
= 1;
    
while(cc_Global.telnet.run)
    
{
        maxfd 
= cc_TelnetServer_SetFd(&rd);  

//        CC_LOG_OUTPUT("DEBUG", "maxfd:%d\n", maxfd);
        ret = select(maxfd + 1&rd, NULL, NULL, &val);
        
if(ret > 0)
        
{
            CC_LOG_OUTPUT(
"DEBUG""OnRead\n");
            cc_TelnetServer_CheckFd(
&rd);
        }

        
else if(ret < 0)
        
{
            CC_LOG_OUTPUT(
"ERROR""select() failed.\n");
            
break;
        }

        
else
        
{
//            CC_LOG_OUTPUT("INFO", "OnTimeout\n");
        }

    }

    cc_Global.telnet.run 
= 0;

#if defined(WIN32)

#else
    pthread_exit(NULL);
#endif

    
return 0;
}


int cc_TelnetServer_Create()
{
    CC_LOG_OUTPUT(
"INFO""Create telnet server thread\n");

    
if(cc_TelnetServer_Init() == 0)
    
{
        cc_TelnetServer_Run();
    }

    
else
    
{
        CC_LOG_OUTPUT(
"ERROR""Create failed.\n");
    }

    cc_TelnetServer_Final();

    CC_LOG_OUTPUT(
"INFO""Telnet server thread terminate.\n");

    
return 0;
}


    空了再添加一些代碼,比如socket的reuse,還有UNIX下的Socket到FILE*,這樣就應(yīng)該可以和工作上的代碼無(wú)縫連接了~

posted on 2009-12-23 17:51 codejie 閱讀(293) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++輪子精神

公告

Using C++

導(dǎo)航

統(tǒng)計(jì)

留言簿(73)

隨筆分類(513)

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久琪琪电影院| 国产女优一区| 午夜在线成人av| 久久gogo国模啪啪人体图| 1204国产成人精品视频| 亚洲国产精品专区久久| 欧美日韩中文在线| 欧美一区二区三区免费观看视频| 久久九九电影| 一区二区毛片| 亚洲欧美在线免费| 亚洲国产另类久久久精品极度| 亚洲国产精品尤物yw在线观看| 国产精品99免视看9| 久久精品在线免费观看| 欧美a级片网| 午夜精品99久久免费| 久久精品99国产精品酒店日本| 亚洲美女中文字幕| 性欧美18~19sex高清播放| 一色屋精品亚洲香蕉网站| 亚洲乱码国产乱码精品精天堂| 国产精品私人影院| 欧美电影电视剧在线观看| 国产精品成人在线| 欧美成人乱码一区二区三区| 欧美日韩一区二区在线播放| 久久手机免费观看| 欧美视频一区二区三区…| 久久视频精品在线| 欧美午夜精品久久久久久孕妇| 久久久久国产一区二区三区| 欧美精品日韩精品| 久久久久久网站| 欧美日韩精品免费在线观看视频| 久久久精品动漫| 欧美日韩亚洲视频一区| 久久香蕉国产线看观看av| 欧美婷婷久久| 欧美成人一区二区三区片免费| 国产精品激情av在线播放| 欧美国产91| 国产日韩在线视频| 夜夜嗨av一区二区三区中文字幕 | 国产精品午夜视频| 亚洲国产精彩中文乱码av在线播放| 国产精品亚洲精品| 亚洲精品美女在线观看播放| 国产曰批免费观看久久久| 一区二区三区免费在线观看| 亚洲国产精品va在线看黑人动漫 | 亚洲精品一区二区三区不| 欧美一区二区久久久| 在线亚洲欧美视频| 美日韩在线观看| 久久精品一区二区三区不卡| 欧美午夜不卡影院在线观看完整版免费 | 亚洲综合精品| 欧美激情精品久久久久久免费印度 | 狠狠久久综合婷婷不卡| 一区二区三区回区在观看免费视频| 91久久国产精品91久久性色| 久久国产日韩欧美| 午夜久久久久久| 欧美日韩成人一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 国产欧美亚洲一区| 一本一道久久综合狠狠老精东影业 | 日韩视频不卡| 亚洲精品乱码视频| 裸体丰满少妇做受久久99精品| 久久超碰97人人做人人爱| 欧美视频免费看| 亚洲欧洲在线播放| 91久久精品国产91久久| 久久免费视频观看| 麻豆成人在线播放| 国产主播在线一区| 性伦欧美刺激片在线观看| 亚洲欧美在线一区| 国产精品久久久免费| 夜夜爽99久久国产综合精品女不卡| 亚洲精品久久久久久下一站| 久久中文字幕一区| 巨胸喷奶水www久久久免费动漫| 国产欧美在线观看一区| 亚洲一区二区精品| 亚洲欧美中文在线视频| 国产精品久久久久免费a∨大胸| 99国产精品99久久久久久粉嫩 | 亚洲影院免费| 欧美性色综合| 99精品热视频| 亚洲视频一起| 欧美色大人视频| 一个人看的www久久| 亚洲在线1234| 国产精品一页| 欧美一区二区三区在线播放| 欧美在线一区二区三区| 国产精品专区h在线观看| 午夜精品美女久久久久av福利| 欧美在线视屏| 国产一区二区久久| 久久久久亚洲综合| 欧美激情视频在线播放| 亚洲精品国产精品国自产观看| 欧美国产一区二区在线观看| 亚洲人成免费| 亚洲免费在线播放| 国产欧美日韩精品专区| 欧美一区二区视频免费观看| 久久青青草原一区二区| 亚洲高清视频在线观看| 欧美华人在线视频| av不卡在线观看| 欧美一区二区三区四区在线观看地址 | 久久精品国产精品亚洲| 免费成人在线观看视频| 亚洲日本欧美在线| 欧美三级在线视频| 亚洲欧美视频在线观看| 久久青草福利网站| 最新国产成人av网站网址麻豆| 欧美日韩国产精品一区二区亚洲 | 亚洲欧美中文在线视频| 国户精品久久久久久久久久久不卡 | 91久久精品美女| 欧美日韩一区不卡| 亚洲欧美不卡| 免费视频亚洲| 一区二区三区四区五区精品| 国产精品免费看久久久香蕉| 久久国产高清| 亚洲国产三级网| 亚洲欧美www| 精久久久久久久久久久| 欧美风情在线| 亚洲男人av电影| 蜜臀久久99精品久久久画质超高清| 亚洲人成在线观看一区二区 | 欧美国产亚洲另类动漫| 亚洲一区二区3| 国产在线成人| 欧美精品激情blacked18| 亚洲一区高清| 欧美国产日韩一区二区三区| 亚洲一区二区三区四区视频| 国内精品免费午夜毛片| 欧美电影免费观看高清完整版| 在线视频欧美一区| 免费欧美日韩国产三级电影| 亚洲一区二区三区成人在线视频精品| 国产日本欧美一区二区三区在线| 麻豆亚洲精品| 亚洲一区二区视频在线| 免费中文日韩| 亚洲欧美成人一区二区在线电影| 激情综合亚洲| 国产精品成人播放| 久久综合色天天久久综合图片| 亚洲最新合集| 欧美成人免费全部| 午夜伦欧美伦电影理论片| 亚洲黄色在线| 国产毛片一区| 欧美裸体一区二区三区| 欧美中文字幕视频| 日韩亚洲欧美一区| 裸体歌舞表演一区二区| 亚洲专区在线| 亚洲欧洲一区| 国自产拍偷拍福利精品免费一| 欧美日韩久久久久久| 久久米奇亚洲| 亚洲视屏一区| 亚洲国产综合91精品麻豆| 久久精品主播| 亚洲欧美日韩国产一区| 亚洲日本va午夜在线影院| 国产午夜精品全部视频播放| 欧美日韩一区免费| 美女国产一区| 欧美专区亚洲专区| 亚洲一区二区三区午夜| 亚洲精品久久7777| 欧美大香线蕉线伊人久久国产精品| 欧美在线观看你懂的| 亚洲视频福利| 亚洲精品免费在线播放| 国产一区激情| 国产精品欧美久久| 欧美日韩精品久久久| 蜜臀久久99精品久久久画质超高清| 香蕉久久夜色精品国产| 亚洲一级二级| 99视频一区| 亚洲日本视频| 欧美激情在线观看| 免费成年人欧美视频|