织梦CMS - 轻松建站从此开始!

罗索

socket select代码

落鹤生 发布于 2011-06-09 09:09 点击:次 
做多了windows,发现多select模式是那么的陌生,当想用心挖掘一下ACE::select的封装的时候,才发现自己几乎写不出一个完整的 select模式示例,这其实是我一直没有重视过这个东西,现在细细分析来,发现,它要比我以往在处理类似问题的时候处理的更为简单。
TAG:

做多了windows,发现多select模式是那么的陌生,当想用心挖掘一下ACE::select的封装的时候,才发现自己几乎写不出一个完整的 select模式示例,这其实是我一直没有重视过这个东西,现在细细分析来,发现,它要比我以往在处理类似问题的时候处理的更为简单。

  1. WSAData    wd; 
  2.     WSAStartup(MAKEWORD(2,2),&wd); 
  3.     SOCKET    sock    = socket(AF_INET,SOCK_STREAM,0); 
  4.     sockaddr_in    saddr; 
  5.     saddr.sin_family    = AF_INET; 
  6.     saddr.sin_addr.s_addr    = inet_addr("127.0.0.1"); 
  7.     saddr.sin_port    = htons(2350); 
  8.     bind(sock,(SOCKADDR*)&saddr,sizeof(saddr)); 
  9.     listen(sock,5); 
  10.  
  11.     SOCKET    sk2        = socket(AF_INET,SOCK_STREAM,0); 
  12.     sockaddr_in    saddr2; 
  13.     saddr2.sin_family    = AF_INET; 
  14.     saddr2.sin_addr.s_addr    = inet_addr("127.0.0.1"); 
  15.     saddr2.sin_port    = htons(2340); 
  16.     bind(sk2,(SOCKADDR*)&saddr2,sizeof(saddr2)); 
  17.     listen(sk2,5); 
  18.  
  19.     fd_set    rfd;        //read fd 
  20.     fd_set    bkfd;        //fdbake 
  21.     //fd_set    wfd;        //write fd 
  22.     //fd_set    etfd;        //except fd 
  23.     SOCKET    sac    = INVALID_SOCKET; 
  24.     SOCKET    sac2    = INVALID_SOCKET; 
  25.  
  26.     FD_ZERO(&bkfd); 
  27.     FD_SET(sock,&bkfd); 
  28.     FD_SET(sk2,&bkfd); 
  29.     while(true
  30.     { 
  31.         memcpy(&rfd,&bkfd,sizeof(bkfd)); 
  32.         int    sret    = select(0,&rfd,NULL,NULL,NULL); 
  33.         cout<<"sret:"<<sret<<endl; 
  34.         if( ! (sret > 0) ) 
  35.         { 
  36.             cout<<"lasterror:"<<WSAGetLastError()<<endl; 
  37.             //break; 
  38.         } 
  39.         if (FD_ISSET(sock,&rfd)) 
  40.         { 
  41.             closesocket(sac); 
  42.             int    len    = sizeof(saddr); 
  43.             sac    = accept(sock,(SOCKADDR*)&saddr,&len); 
  44.             FD_SET(sac,&bkfd); 
  45.         } 
  46.         else if (FD_ISSET(sk2,&rfd)) 
  47.         { 
  48.             closesocket(sac2); 
  49.             int    len    = sizeof(saddr2); 
  50.             sac2    = accept(sk2,(SOCKADDR*)&saddr2,&len); 
  51.             FD_SET(sac2,&bkfd); 
  52.         } 
  53.         else if (FD_ISSET(sac,&rfd)) 
  54.         { 
  55.             char    buf[1024]; 
  56.             int    len = recv(sac,buf,1024,0); 
  57.             if(!(len > 0)) 
  58.             { 
  59.                 closesocket((sac)); 
  60.                 cout<<"close a socket"<<endl; 
  61.                 FD_CLR(sac,&bkfd); 
  62.             } 
  63.             else 
  64.             { 
  65.                 buf[len]    = 0; 
  66.                 cout<<"recv:"<<buf<<endl; 
  67.             } 
  68.         } 
  69.         else if (FD_ISSET(sac2,&rfd)) 
  70.         { 
  71.             char    buf[1024]; 
  72.             int    len = recv(sac2,buf,1024,0); 
  73.             if (len <= 0) 
  74.             { 
  75.                 closesocket(sac2); 
  76.                 cout<<"close a socket"<<endl; 
  77.                 FD_CLR(sac,&bkfd); 
  78.             } 
  79.             else 
  80.             { 
  81.                 buf[len]    = 0; 
  82.                 cout<<"recv:"<<buf<<endl; 
  83.             } 
  84.         } 
  85.     } 
  86.     WSACleanup(); 
  87.     return 0; 

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

(win2ks)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201106/14537.html]
本文出处:CSDN博客 作者:win2ks
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容