最近在研究IOCP,听说其在大规模socket连接上很有优势,但我试了一下怎么没感受出来呢,测试环境:Windows XP, CPU core(TM)2 Duo 1.60gHz
内存: 1.00GB, 开发环境VC6.0兄弟我采用IOCP如下应用
m_sSocket = socket(AF_INET, SOCK_STREAM, 0);

if (m_sSocket == INVALID_SOCKET)    
return false;   

//SOCKADDR_IN addr;    
sockaddr_in addr;   
addr.sin_family = AF_INET;    
addr.sin_port = htons(port);    
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);   
//addr.sin_addr.S_un.S_addr = inet_addr(ip);   if (bind(m_sSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)    
return false;     if (listen(m_sSocket, 10) == SOCKET_ERROR)    
return false;     if ((m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL)     //   创建完成端口的句柄   
return false;    this->m_acceptThread = true;   
g_haThread = CreateThread(NULL, 0, AcceptThread, (LPVOID)this, 0, &m_athreadID);    //   创建连接线程,用来接收客户端的连接    this->m_workThread = true;   
g_hwThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, &m_wthreadID); //   创建工作线程,用来处理完成端口消息的   
          ------------------------------------------------
       在AcceptThread线程中用一个死循环不停的在等客户端连接
    while(true)
       {
   client= accept(pthis->m_sSocket, NULL, NULL);   
          // 连接后处理
       }       =================================================================================================================
        其下兄弟我又用经典的select模式来作对比实验
       while(TRUE)
{
memcpy(&readfds, &fdCocpy, sizeof(fd_set));

int nSel = select(NULL, &readfds, NULL, NULL, NULL/*&SelectTime*/);
if(nSel > 0)
{
if(FD_ISSET(SvrSocket.m_sServer, &readfds))
{
SOCKET sClient = accept(SvrSocket.m_sServer, (struct sockaddr*)&sockinClient, &nSockinSize);
char* m_strClientIP = inet_ntoa(sockinClient.sin_addr);
int  m_nClientPort = ntohs(sockinClient.sin_port);
i++;
printf("i=%d,Client :%d, IP= %s, port =%d \n",i, sClient, m_strClientIP, m_nClientPort);

    FD_SET(sClient,&acceptfds);
}
} }
        ==============================================================================================
        测得采用IOCP方式, 最大连接到16021,客户端就不能再连啦
         采用Select模式,最大连接到16212,客户端不能再连接,以后进行的几次测试最大连接数都是维持在16000多,机器内存总消耗也就维持在40%左右,采用IOCP方式连接数反而都比经典的select的方式少一两百,不是说采用完成端口方式在大规模客户端连接方面很有优势吗,怎么没有体现出来呢,还是我的应用方式有什么不对的地方吗,请各位达人指教!
               
        

解决方案 »

  1.   

    就是OS帮你做了很多事,不需要你管了。其实自己用重叠IO也能实现完成端口
      

  2.   

    看了一下,你那个叫IOCP吗?差得太远了。真正的IOCP过10W没问题,设计的好可以过100W连接。
      

  3.   

    我做过IOCP的,但是没有测试过最多连接用户的数目,当时也就连了1000个左右吧。比传统的多线程连接方式,在消耗系统资源方面,效率要高一些,至于select模型的没有比较过。但是看了一下你的代码,只创建了一个工作线程,按照经验公式,工作线程的创建数目是(cpu数*2+2) 单核应该是4线程,双核6线程,四核10线程等等。而且IOCP应该用异步套接字,你用的阻塞模式。
       我看过一些资料,IOCP并不是连接数多,而是连接数多时消耗系统资源少,但是许多人反应这方面的优势不明显。