订阅所有文章
文章搜索

高级搜索这是社么?这是顶尖最新推出的文章增强型搜索功能!
全网 本站
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> VC >> 文章正文

WinSock I/O系列1:多路复用I/O支持多Client的实现及效率讨论

作者:HuangRG  来源:CSDN  点击  更新:2006-12-19 7:03:26  编辑: 画王w  字体

1.       引言

多路复用I/O模型(select)是UNIX/LINUX用得的最多的一种I/O模型,在Windows下也

可做为一种同步I/O使用。本文给出该I/O模型处理多Client的简单(在主线程中)实现。

2.       关于select

select I/O模型是一种异步I/O模型,在单线程中Linux/WinNT默认支持64个客户端套

接字。这种I/O模型主要涉及以下几个函数及宏:

int select(…)、FD_ZERO、FD_SET、FD_ISSET以及FD_SETSIZE。

3.       用select开发一个Server

3.1 只支持单个Client

    // 相关初始化处理, 创建监听套接字

    listen(listensock,  5);

    clientsock  =  accept(listensock,  NULL,  NULL);

    for  (; ;)

    {

             FD_ZERO(&readfds); 

             FD_SET(clientsock, &readfds);

             nResult = select(

                     0,         // Windows中这个参数忽略,Linux中在此处为1

                     readfds,    // 可读套接字集合

                     ……

              )

             if   (nResult  = =  SOCKET_ERROR)

                    return –1;

             // 判断cliensock是否处于待读状态

             if  (FD_ISSET(clientsock,  &readfds))

            {
                              // 相关处理

            }

    }

其实Winsock中的WSAEventSelect模型是与之类似的。

3.2  在单线程中支持63个Client

   SOCKET clientsockarray[FD_SETSIZE – 1];   // FD_SETSIZE is 64

  // 相关初始化处理, 创建监听套接字

  

  listen(listensock, 5);

  // 初始化套接字数组

 InitSock(clientsockarray);

  FD_ZERO(&readfds);

  FD_SET(listensock,  &readfds);

  for  (; ;)

 {

 nRet  = select(0,  &readfds,  NULL,  NULL,  NULL);

// 判断监听套接字是否可读

 if  (FD_ISSET(listensock,  &readfds))

 {

         clientsock = accept(listensock,  NULL,  NULL);

          // 将客户套接字放到套接字数组中

          if   (!InsertSock(clientsockarray, clientsock))

          {

                   printf("客户端超过了63个,此次连接被拒绝.\n");

                   closesocket(clientsock);

                   continue;

           }  

  }

   

  // 逐个处理处于待决状态的套接字

[1] [2] [3] 下一页

  • 上一篇文章:

  • 下一篇文章:
  •      
    热门文章  
    推荐文章  
    相关文章    
     发表评论
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备05002835号