socket select代码

原创 2007年09月27日 14:46:00
做多了windows,发现多select模式是那么的陌生,当想用心挖掘一下ACE::select的封装的时候,才发现自己几乎写不出一个完整的select模式示例,这其实是我一直没有重视过这个东西,现在细细分析来,发现,它要比我以往在处理类似问题的时候处理的更为简单。
    WSAData    wd;
    WSAStartup(MAKEWORD(
2,2),&wd);
    SOCKET    sock    
= socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in    saddr;
    saddr.sin_family    
= AF_INET;
    saddr.sin_addr.s_addr    
= inet_addr("127.0.0.1");
    saddr.sin_port    
= htons(2350);
    bind(sock,(SOCKADDR
*)&saddr,sizeof(saddr));
    listen(sock,
5);

    SOCKET    sk2        
= socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in    saddr2;
    saddr2.sin_family    
= AF_INET;
    saddr2.sin_addr.s_addr    
= inet_addr("127.0.0.1");
    saddr2.sin_port    
= htons(2340);
    bind(sk2,(SOCKADDR
*)&saddr2,sizeof(saddr2));
    listen(sk2,
5);

    fd_set    rfd;        
//read fd
    fd_set    bkfd;        //fdbake
    
//fd_set    wfd;        //write fd
    
//fd_set    etfd;        //except fd
    SOCKET    sac    = INVALID_SOCKET;
    SOCKET    sac2    
= INVALID_SOCKET;

    FD_ZERO(
&bkfd);
    FD_SET(sock,
&bkfd);
    FD_SET(sk2,
&bkfd);
    
while(true)
    
...{
        memcpy(
&rfd,&bkfd,sizeof(bkfd));
        
int    sret    = select(0,&rfd,NULL,NULL,NULL);
        cout
<<"sret:"<<sret<<endl;
        
if! (sret > 0) )
        
...{
            cout
<<"lasterror:"<<WSAGetLastError()<<endl;
            
//break;
        }

        
if (FD_ISSET(sock,&rfd))
        
...{
            closesocket(sac);
            
int    len    = sizeof(saddr);
            sac    
= accept(sock,(SOCKADDR*)&saddr,&len);
            FD_SET(sac,
&bkfd);
        }

        
else if (FD_ISSET(sk2,&rfd))
        
...{
            closesocket(sac2);
            
int    len    = sizeof(saddr2);
            sac2    
= accept(sk2,(SOCKADDR*)&saddr2,&len);
            FD_SET(sac2,
&bkfd);
        }

        
else if (FD_ISSET(sac,&rfd))
        
...{
            
char    buf[1024];
            
int    len = recv(sac,buf,1024,0);
            
if(!(len > 0))
            
...{
                closesocket((sac));
                cout
<<"close a socket"<<endl;
                FD_CLR(sac,
&bkfd);
            }

            
else
            
...{
                buf[len]    
= 0;
                cout
<<"recv:"<<buf<<endl;
            }

        }

        
else if (FD_ISSET(sac2,&rfd))
        
...{
            
char    buf[1024];
            
int    len = recv(sac2,buf,1024,0);
            
if (len <= 0)
            
...{
                closesocket(sac2);
                cout
<<"close a socket"<<endl;
                FD_CLR(sac,
&bkfd);
            }

            
else
            
...{
                buf[len]    
= 0;
                cout
<<"recv:"<<buf<<endl;
            }

        }

    }

    WSACleanup();
    
return 0;

 现在我感觉到,如果想做轻量级的多sock或者异步模式,select是个不错的选择。

深入理解socket中的select模型

  • 2016年08月09日 15:08
  • 71KB
  • 下载

socket工程文件select版本

  • 2015年09月01日 20:59
  • 6.7MB
  • 下载

Socket编程实践(10) --select的限制与poll的使用

select的限制用select实现的并发服务器,能达到的并发数一般受两方面限制:1)一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n(number)来调整或者使...

Windows Socket 异步编程(非阻塞模式) -- Select回送示例

使用Select异步模式来实现返送示例。服务器启动并监听9999端口,并将收到的客户端信息打印并返送给客户端。 重点理解的是:一个套接字是否是可读、可写状态。当服务器端socket在Accept...
  • HMSIWTV
  • HMSIWTV
  • 2012年09月06日 19:26
  • 9372

socket server client select模型

  • 2013年12月30日 11:04
  • 4KB
  • 下载

Socket编程中select()的妙用

来自: 用过 WinSock API 网友们知道:WinSock 编程中有一很方便的地方便是其 息驱动机制,不管是底层 API 的 WSAAsyncSelect() 还是 MFC...

socket通信可执行程序select版本

  • 2015年09月01日 21:04
  • 9KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socket select代码
举报原因:
原因补充:

(最多只允许输入30个字)