S端用IOCP, 将Listener_socket绑定到IOCP, 一开始先Create十个AccpetExSocket准备接收C端的连接, 同时Create一个线程监视,一旦AccpetEx用完, 则再Create十个.问题是C端测试时, 创建的线程一旦超过十个, 就会出现10061的错误, 我猜想是由于S端AccpetEx用完后,在Create新AccpetEx时,有连接到达,这时由于没有AccpetEx用于调用, 故C端出现10061的错误.不知是否正确?我的连接是长连接, 每个Socket收发完一次数据后,并不closesocket.故先Create的十个AccpetExSocket只能接受头十次连接.请问应如何解决这个问题?(即如果同时有大量的长连接,AccpetExSocket将很快用完,在新Create期间的连接应如何处理?)多谢!!!

解决方案 »

  1.   

    可以简单地把FD_ACCEPT事件与一个EVENT对象关联起来,然后用WaitForSingleObject来等待这个事件被触发,一旦触发后,马上投递新的AcceptEx
      

  2.   

    每次accecpt完成之后,都再投递一次AcceptEx,这样pending的Accept就不会减少了。
      

  3.   

    如果谁能帮忙检查一下, 
    请留个EMAIL.我给你发过去。
      

  4.   

    检查一下你的AcceptEx调用方法是否正确:BOOL CreateAcceptSocket(BOOL fUpdateIOCP)
    {
        int         nRet;
        DWORD       dwRecvNumBytes = 0;     


        //The context for listening socket uses the SockAccept member to store the
        //socket for client connection. 
        if (fUpdateIOCP)
    {
            g_pCtxtListenSocket = UpdateCompletionPort(g_sdListen, ClientIoAccept, FALSE);
            if (g_pCtxtListenSocket == NULL)
    {
                WriteDalError("failed to update listen socket to IOCP\n");
                return(FALSE);
    }
    }

        g_pCtxtListenSocket->pIOContext->SocketAccept = CreateSocket();
        if (INVALID_SOCKET == g_pCtxtListenSocket->pIOContext->SocketAccept)
    {
            WriteDalError("failed to create new accept socket\n");
            return(FALSE);
    }

        // pay close attention to these parameters and buffer lengths
        nRet = AcceptEx(
    g_sdListen, 
    g_pCtxtListenSocket->pIOContext->SocketAccept,
    (LPVOID)(g_pCtxtListenSocket->pIOContext->Buffer),
    //DEFAULT_IOCP_BUFF_SIZE - (2 * (sizeof(SOCKADDR_IN) + 16)),
    0,
    sizeof(SOCKADDR_IN) + 16,
    sizeof(SOCKADDR_IN) + 16,
    &dwRecvNumBytes,
    (LPOVERLAPPED) &(g_pCtxtListenSocket->pIOContext->Overlapped)
    );
        if (nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError())) 
    {
            WriteError("AcceptEx Failed: %d\n", WSAGetLastError());
            return(FALSE);
    }

        return(TRUE);
    }
      

  5.   

    回答你一些问题是可以的,但是别人又不是你的员工,凭什么要给你调程序?
    如果你是出于学习的目的,那别人把bug找出来,对你未必有什么提高。
      

  6.   

    要是有些人喜欢调试别人的程序,并且把找别人程序的bug当作爱好,那当我没说