Codejie's C++ Space

Using C++

练习:socket under windows


    近来一直忙着工作上的代码,不难,就是很烦。写习惯了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 i = -1;
    BOOL flag 
= 1;
    SOCKET ls 
= 0;
    SOCKET 
as = 0;
    SOCKET cs[
5];
    
int count = 0;
    WSADATA wsa;
    
struct sockaddr_in addr;
    
struct timeval val;
    fd_set rd, wd;
    
int ret = -1;

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

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


    
    
if(ioctlsocket(ls, FIONBIO, &flag) != 0)
    
{
        WSACleanup();
        printf(
"socket() failed.\n");
        
return -1;
    }


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

    
    
if(bind(ls, (const struct sockaddr*)&addr, sizeof(addr)) != 0)
    
{
        WSACleanup();
        printf(
"bind() failed.\n");
        
return -1;
    }

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



    val.tv_sec 
= 0;
    val.tv_usec 
= 100;
    
while(1)
    
{
        FD_ZERO(
&rd);
        FD_ZERO(
&wd);

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

        
for(i = 0; i < count; ++ i)
        
{
            FD_SET(cs[i], 
&rd);
//            FD_SET(cs[1], &wd);
        }


        ret 
= select(0&rd, &wd, NULL, NULL);
        
if(ret > 0)// SOCKET_ERROR)
        {
            
for(i = 0; i < count; ++ i)
            
{
                
if(FD_ISSET(cs[i], &rd) != 0)
                
{
                    printf(
"cs = %d in rd.\n", cs[i]);                    
                }

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

            }


            
if(FD_ISSET(ls, &rd) != 0)
            
{
                
as = accept(ls, NULL, NULL);
                
if(as == INVALID_SOCKET)
                
{
                    WSACleanup();
                    printf(
"accept() failed.\n");
                    
return -1;
                }

                cs[count 
++ ] = as;
                printf(
"accept - %d\n"as);
            }

            
if(FD_ISSET(ls, &wd) != 0)
            
{
                printf(
"wd\n");
            }

        }

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

    }


    
// close all socket, include listen socket

    closesocket(ls);

    WSACleanup();

    
return 0;    
}

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

posted on 2009-12-09 17:45 codejie 阅读(244) 评论(3)  编辑 收藏 引用 所属分类: 随笔而已

评论

# re: 练习:socket under windows[未登录] 2009-12-10 01:54 Liu

这些代码看着眼熟啊,很像大学里面的代码……

话说回来,你们那么大的板子,居然连remote gbd都不支持么?非要printf()

不过printf()确实是万能法宝啊  回复  更多评论   

# re: 练习:socket under windows[未登录] 2009-12-10 01:56 Liu

靠,打字打错了,remote gdb,你们用的啥编译器啊?对应的总有调试器吧?  回复  更多评论   

# re: 练习:socket under windows 2009-12-10 09:32 codejie

@Liu
随便写的了,让你老奸笑了~~~
扳子上是标准的linux,想来调试可以用gdb,ddd,但你也知道我的水平,这些对我太复杂了,还是VC的breakpoint好用。。。当然,我还没有见过扳子呢,听说明年也许,八成,可能会弄来一块~  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

Using C++

导航

统计

留言簿(73)

随笔分类(513)

积分与排名

最新评论

阅读排行榜

评论排行榜