用Winsock写了一个C/S模式的聊天程序,现在想在服务器端控制连入的客户端的个数。比如,允许最多10个客户端接入,第11个客户端connect的时候使之失败,这应该怎么做呢?

解决方案 »

  1.   

    我曾经尝试在Server端的Accept线程中判断连入的客户端个数,如果达到最大值则不再accept新的客户端,当某个已连入的客户端退出会话后再继续accept。结果发现这样并不能使客户端的connect失败,客户端的connect成功地返回了!这之后的send函数也能正常返回。服务器端当然没有收到任何数据,但是当某个已连入的客户端退出会话后,服务器端立刻accept了这个客户端并收到了那些数据。应该怎么办才好呢?
      

  2.   

    定义一个记数变量COUNT
    然后在ACCEPT的消息中这样做
    if(count>10)
    {
       closesocket(...);
    }
    else
    {
       count++;
       accept(...);
    }
      

  3.   

    to zfive5(醉马不肖) :没有别的办法了吗?
      

  4.   

    下面是Accept线程的代码,g_nCltNum 是一个全局变量存放客户端的数量,accept了新的客户端后会使这个变量加1,有客户端退出的话会使之减1,并激活 g_hEvent。void _cdecl AcptThread( void* lpParam )
    {
        int         nAddrLen = 0;
        SOCKET      sClient = 0;
        SOCKADDR_IN addr_Client;    ZeroMemory( &addr_Client, sizeof( addr_Client ));
        
        while ( 1 )
        {
            if( g_nCltNum < MAX_CLIENTS )
            {
                nAddrLen = sizeof( addr_Client );
                sClient = accept( gsSock, (struct sockaddr *)&addr_Client, &nAddrLen );
                if ( sClient == INVALID_SOCKET )
                {
                    break;
                }            AddClient( sClient );
                _beginthread( ClientThread, 0, (void*)sClient );
            }
            else
            {
                WaitForSingleObject ( g_hEvent , INFINITE );
            }
        }
    }能不能在创建服务端Socket的时候就指定最大连入的客户端的数量呢?
      

  5.   

    大家有没有搞错啊, 这不是很明显的事情吗>??OnConnect(int ErrCode??)
    {
       if(count<N)
          Accept(CntSocketObject);
    }
      

  6.   

    在listen()中可以限定监听的次数,多与它时服务器不在LISTEN,所以更谈不上ACCEPT拉
      

  7.   

    listen()好像不是侦听的次数,而是侦听的队列数
      

  8.   

    用个全局变量来判断
    当>10的时候ACCETP的就都CLOSE掉
      

  9.   

    对,用个全局变量来判断当大于10,ACCETP的时候就都CLOSE掉
      

  10.   

    看来只有在大于的时候CLOSE掉了,谢谢大家。