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用法

学习socket的select用法,下面代码大部分是从网上借鉴的,只不过把网络部分的socket的用法改为了本地socket,外加一些自己的处理,如果有冒犯之处请联系我,我立马删除,谢谢。...
  • u012656927
  • u012656927
  • 2017年07月04日 20:37
  • 299

Socket编程知识必学/SELECT 编程

Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序...
  • maopig
  • maopig
  • 2012年02月19日 16:56
  • 7661

socket select代码

做多了windows,发现多select模式是那么的陌生,当想用心挖掘一下ACE::select的封装的时候,才发现自己几乎写不出一个完整的select模式示例,这其实是我一直没有重视过这个东西,现在...
  • win2ks
  • win2ks
  • 2007年09月27日 14:46
  • 1604

简单的Socket select模式源代码(server,client)

  • 2010年01月30日 21:16
  • 56KB
  • 下载

socket 的select函数例子

好久没有写博客了,主要最近也没有学啥新的可以写博客的东西 select函数是通过设置FD_SET来实现在一个线程中实现读写网口的,下面这段代码主要是实现绑定端口-》监听-》设置socket为非阻塞-...
  • jia_zhengshen
  • jia_zhengshen
  • 2015年09月18日 16:20
  • 1460

linux socket中的select用法

Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(...
  • Commander_Officer
  • Commander_Officer
  • 2012年11月29日 10:33
  • 9070

socket编程中select的使用

Select在Socket编程中还是比较重要的,可是对于初学Socket的人来 说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序...
  • u012252959
  • u012252959
  • 2015年09月19日 14:10
  • 217

socket select函数的详细讲解

原型int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,const struct timeval* timeo...
  • gooer
  • gooer
  • 2009年03月02日 23:41
  • 95557

socket编程—select方法使用

0.背景 最近要写一个RPC库,即在客户端向服务端发送请求,服务器计算并返回结果,要求实现服务端能同时接收多个客户端请求但是不能使用线程库,根据提示我知道了可以使用select函数来完成非阻塞方式工...
  • song527730241
  • song527730241
  • 2016年05月31日 20:11
  • 2226

socket之select模式

windows提供了选择(select)、异步选择(WSAAsyncSelect)、事件选择(WSAEventSelect)、重叠I /O(overlapped I/O)和完成端口(completio...
  • ganpengjin1
  • ganpengjin1
  • 2015年03月27日 16:45
  • 2831
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socket select代码
举报原因:
原因补充:

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