while (1)
{
    if ((iThreadIndex+1) <= MAX_CONNET_NUMBER)
    {
Clientfd[iThreadIndex] = accept(Listenfd,(struct sockaddr *&saClient,&saLenClient);

if (INVALID_SOCKET == Clientfd[iThreadIndex])
{
printf("accept error ,ERROR CODE:%d\n",WSAGetLastError());
return -1;
}
printf("connect from: IP-%s PORT-%d Now Connect Num:%d\n",inet_ntoa(saClient.sin_addr),saClient.sin_port,iThreadIndex+1); if (! _beginthreadex(NULL,0,acceptThread,(void *)&Listenfd,0,&ClientThread[iThreadIndex]))
{
printf("create accept thread faild\n");
goto FAILED;
}
else
{
iThreadIndex++;
}
    }
    else
    {
printf("Maximum number of connections\n");
//Clientfd[iThreadIndex] = accept(Listenfd,(struct sockaddr *)&saClient,&saLenClient);
Sleep(200);
     }

        }
程序到达最大连接数时ACCETP还是成功、我想要当达到最大连接数时,客户端不能成功连接服务器。同时不能影响服务器对之前的连接的处理、上面代码可行,就是老打印 到达最大连接数我想让程序到达最大连接树。ACCEPT就失败?怎么弄?各位有什么好的办法解决最大连接数的问题?

解决方案 »

  1.   


    关闭之前的SOCKET 不会出问题吗、?、大家遇到这种问题咋办的?
      

  2.   


            if (INVALID_SOCKET == Clientfd[iThreadIndex])
            {
                printf("accept error ,ERROR CODE:%d\n",WSAGetLastError());
                return -1;
            }
            //^^^^^^^
             else
            {
            printf("Maximum number of connections\n");
            //Clientfd[iThreadIndex] = accept(Listenfd,(struct sockaddr *)&saClient,&saLenClient);
            Sleep(200);
             }
             //所以只要不是连接失败,就会提示 Maximum number of connectionsLZ注意if else 的关系,是else 与同它最近的if相对应(从中间开始向两边看)。
      

  3.   

    再贴一次代码
    while (1)
    {
    if ((iThreadIndex+1) <= MAX_CONNET_NUMBER)
    {
    Clientfd[iThreadIndex] = accept(Listenfd,(struct sockaddr *)&saClient,&saLenClient);

    if (INVALID_SOCKET == Clientfd[iThreadIndex])
    {
    printf("accept error ,ERROR CODE:%d\n",WSAGetLastError());
    return -1;
    }
    printf("connect from: IP-%s PORT-%d Now Connect Num:%d\n",inet_ntoa(saClient.sin_addr),saClient.sin_port,iThreadIndex+1); if (! _beginthreadex(NULL,0,acceptThread,(void *)&Listenfd,0,&ClientThread[iThreadIndex]))
    {
    printf("create accept thread faild\n");
    goto FAILED;
    }
    else
    {
    iThreadIndex++;
    }
    }
    else
    {
    printf("Maximum number of connections\n");
    //Clientfd[iThreadIndex] = accept(Listenfd,(struct sockaddr *)&saClient,&saLenClient);
    Sleep(200);
    }
    }
      

  4.   

    我发现及时到了listen 设置的最大连接数,accept 照样成功,send recv都没问题,在到达最大连接数后连接的客户端也不会阻塞,完全没事额、、、、咋回事呢
      

  5.   

    listen的最大连接数,应该是同时连接的最大数,你都是一个个连接的没事
      

  6.   

    listen 设置了最大连接数 ,可是 对accept 完全没事。那设置这个最大连接数还有什么意义???
    求指教
      

  7.   

    Maximum length of the queue of pending connections
      

  8.   

    .....backlog 
    Maximum length of the queue of pending connections. If set to SOMAXCONN, the underlying service provider responsible for socket s will set the backlog to a maximum reasonable value. There is no standard provision to obtain the actual backlog value.
      

  9.   

    知道了 listen 设置的是等待队列
      

  10.   

    如何限制最大连接数,即使达到最大连接数后,客户端在连接(CONNECT)返回不接受,而服务器正常工作。若接收后在断开,客户端连接却已建立连接成功,如何使不接受连接,并且服务断正常?
      

  11.   

    自己计数啊,自己关掉监听socket
      

  12.   

    试一下超过最大连接数,关闭该SOCKET
      

  13.   

    很简单呀     把超过最大数的位置改下    放到ACCEPT   如果当客户端进入,判断进入是否已经超过最大数     是,主动调用 CloseSocket 关闭连接!  listen 之后 实际就已经开始监听  accept实际是等待新连接而已       我觉得这函数实际就是游历socket链表    发现新的进入就返回   否则就一直游历    你也可以关闭 listen使用的socket  这样  listen就会立即错误结束!  accept自然就没用了    只是当最大数恢复正常的时候  你又必须重新listen、accept了
      

  14.   

    你listen后面的参数不是说是连接的最大数
    是能监听到的最大数吧 
      

  15.   

    一般用多线程处理客户端的请求
    其中还要做个管理socket线程的链表 及时清理废掉的线程