近来一直忙着工作上的代码,不难,就是很烦。写习惯了C++,再写C时,总觉得东一块西一块的,代码写的零零散散。于是将文件作为namespace,前缀作为class,总算能看明白了。。。。
    写好,编译时才发现没有其他同事的代码支持,就算编译过了也没法‘运行’自己的代码,于是开始剥离代码,一点点的抛开自己用不到代码,终于可以用一个main(),可以跑起来了,却又发现自己根本不会在目标机上调试,习惯了VCExpresss下的breakpoint后,去用printf(),那是没法接受的。于是又准备将用到的library进行‘portable’处理,发现不可能。。。那些都是不能cross-platform的API,挣扎了很久,终于决定在windows上模拟实现用到的library,就是自己在windows上实现目标机上的library,如sharedmemory等。
    终于这一切都搞定了,widnows下编译,链接,测试,好不痛快,虽然消耗了大量‘无用代码’的时间,还好,我指法比较好,嘿嘿~
    但自己的代码总要合成到系统中去的,在系统调试时,我一样会变得无从下手的,于是又了现在的‘狠招’--添加一个‘telnet’到代码中。。。。
    哇哈哈。。。有了telnet,一切尽在掌握在了~但,但,但。。。。才发现,自己不会写socket了。。。丢脸,唉,被ACE惯坏了~    
    说了一堆废话,正题来了,下面的代码是练习windows下的socket之作,很乱,没有头绪的,仅作代码保留用~。

 int CC_Telnet_Create(const char* ip, unsigned short port)
int CC_Telnet_Create(const char* ip, unsigned short port)


 {
{
 int i = -1;
    int i = -1;
 BOOL flag = 1;
    BOOL flag = 1;
 SOCKET ls = 0;
    SOCKET ls = 0;
 SOCKET as = 0;
    SOCKET as = 0;
 SOCKET cs[5];
    SOCKET cs[5];
 int count = 0;
    int count = 0;
 WSADATA wsa;
    WSADATA wsa;
 struct sockaddr_in addr;
    struct sockaddr_in addr;
 struct timeval val;
    struct timeval val;
 fd_set rd, wd;
    fd_set rd, wd;
 int ret = -1;
    int ret = -1;

 ret = WSAStartup(MAKEWORD(2, 2), &wsa);
    ret = WSAStartup(MAKEWORD(2, 2), &wsa);
 if(ret != NO_ERROR)
    if(ret != NO_ERROR)

 
     {
{
 printf("WSAStartup() failed.\n");
        printf("WSAStartup() failed.\n");
 return -1;
        return -1;
 }
    }
 
    
 ls  = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ls  = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if(ls == INVALID_SOCKET)
    if(ls == INVALID_SOCKET)

 
     {
{
 WSACleanup();
        WSACleanup();
 printf("socket() failed.\n");
        printf("socket() failed.\n");
 return -1;
        return -1;
 }
    }

 
    
 if(ioctlsocket(ls, FIONBIO, &flag) != 0)
    if(ioctlsocket(ls, FIONBIO, &flag) != 0)

 
     {
{
 WSACleanup();
        WSACleanup();
 printf("socket() failed.\n");
        printf("socket() failed.\n");
 return -1;
        return -1;
 }
    }

 addr.sin_family = AF_INET;
    addr.sin_family = AF_INET;
 addr.sin_addr.s_addr = inet_addr(ip);
    addr.sin_addr.s_addr = inet_addr(ip);
 addr.sin_port = htons(port);
    addr.sin_port = htons(port);

 
    
 if(bind(ls, (const struct sockaddr*)&addr, sizeof(addr)) != 0)
    if(bind(ls, (const struct sockaddr*)&addr, sizeof(addr)) != 0)

 
     {
{
 WSACleanup();
        WSACleanup();
 printf("bind() failed.\n");
        printf("bind() failed.\n");
 return -1;
        return -1;
 }
    }
 
    
 if(listen(ls, SOMAXCONN) != 0)
    if(listen(ls, SOMAXCONN) != 0)

 
     {
{
 WSACleanup();
        WSACleanup();
 printf("listen() failed.\n");
        printf("listen() failed.\n");
 return -1;
        return -1;
 }
    }


 val.tv_sec = 0;
    val.tv_sec = 0;
 val.tv_usec = 100;
    val.tv_usec = 100;
 while(1)
    while(1)

 
     {
{
 FD_ZERO(&rd);
        FD_ZERO(&rd);
 FD_ZERO(&wd);
        FD_ZERO(&wd);

 FD_SET(ls, &rd);
        FD_SET(ls, &rd);
 FD_SET(ls, &wd);
        FD_SET(ls, &wd);

 for(i = 0; i < count; ++ i)
        for(i = 0; i < count; ++ i)

 
         {
{
 FD_SET(cs[i], &rd);
            FD_SET(cs[i], &rd);
 //            FD_SET(cs[1], &wd);
//            FD_SET(cs[1], &wd);
 }
        }

 ret = select(0, &rd, &wd, NULL, NULL);
        ret = select(0, &rd, &wd, NULL, NULL);
 if(ret > 0)// SOCKET_ERROR)
        if(ret > 0)// SOCKET_ERROR)

 
         {
{
 for(i = 0; i < count; ++ i)
            for(i = 0; i < count; ++ i)

 
             {
{
 if(FD_ISSET(cs[i], &rd) != 0)
                if(FD_ISSET(cs[i], &rd) != 0)

 
                 {
{
 printf("cs = %d in rd.\n", cs[i]);
                    printf("cs = %d in rd.\n", cs[i]);                    
 }
                }
 if(FD_ISSET(cs[i], &wd) != 0)
                if(FD_ISSET(cs[i], &wd) != 0)

 
                 {
{
 printf("\ncs = %d in wd.\n", cs[i]);
                    printf("\ncs = %d in wd.\n", cs[i]);
 }
                }
 }
            }

 if(FD_ISSET(ls, &rd) != 0)
            if(FD_ISSET(ls, &rd) != 0)

 
             {
{
 as = accept(ls, NULL, NULL);
                as = accept(ls, NULL, NULL);
 if(as == INVALID_SOCKET)
                if(as == INVALID_SOCKET)

 
                 {
{
 WSACleanup();
                    WSACleanup();
 printf("accept() failed.\n");
                    printf("accept() failed.\n");
 return -1;
                    return -1;
 }
                }
 cs[count ++ ] = as;
                cs[count ++ ] = as;
 printf("accept - %d\n", as);
                printf("accept - %d\n", as);
 }
            }
 if(FD_ISSET(ls, &wd) != 0)
            if(FD_ISSET(ls, &wd) != 0)

 
             {
{
 printf("wd\n");
                printf("wd\n");
 }
            }
 }
        }
 else
        else

 
         {
{
 printf("erron = %d\n", WSAGetLastError());
            printf("erron = %d\n", WSAGetLastError());
 break;
            break;
 }
        }
 }
    }

 // close all socket, include listen socket
    // close all socket, include listen socket

 closesocket(ls);
    closesocket(ls);

 WSACleanup();
    WSACleanup();

 return 0;
    return 0;    
 }
}    还好,虽然API不一样,但流程或者叫做顺序和BSD的一样,写起来除了需要msdn查看使用方法外,倒也不是很费劲。。。