enum Event_Type
{
 WSA_UnKnow,
 WSA_Accpte,
 WSA_Recv,
 WSA_Send
};
//这个是我定义的一个结构体,保存GetQueuedCompletionStatus后会返回的一些类型,
采用AcceptEX的方式一下子投递多个IO请求,使用测试客户端是会出现如下问题;
客户端连接时,返回正常WSA_Accpte;
客户端连接后,Send数据到服务端,GetQueuedCompletionStatus还是还回WSA_Accpte类型;
这就蛋疼了;
新手,对完成端口和网络方面的东东不甚了解,求大侠解惑;
如果需要具体的测试代码,请留言;

解决方案 »

  1.   

    你要在WSARecv 前设置下 值为 WSA_Recv
      

  2.   

    Send数据到服务端,GetQueuedCompletionStatus还是还回WSA_Accpte类型;
    这就蛋疼了;
    --------------
    你自己在PER_IO_DTATA结构体中有修改标记吗?你不会一直都没有修改吧
      

  3.   


    //感觉关键的地方就在这里了;投递肯定出了问题;
    SOCK_DATA 这个是单句柄
    IO_DATA 这个是单IOvoid CIOCPServer::OnAccept(IO_DATA * pIOContext,SOCK_DATA *pSockContext)
    {
    //获取地址信息
    //GetAcceptExSockaddrs()....
    //将接收到的Socket与完成端口绑定
    SOCK_DATA * pSockIO = new SOCK_DATA();
    pSockIO->m_Socket = pIOContext->m_AcceptSock;
    HANDLE hIOPort = CreateIoCompletionPort((HANDLE)pSockIO->m_Socket,m_hCompletionPort,(ULONG_PTR)pSockIO,0);

    //在接收到客户端连接后投递一个WSARecv请求
    IO_DATA * pIOData = new IO_DATA();
    pIOData->EvenType = WSA_Recv;  
    pIOData->m_AcceptSock = pIOContext->m_AcceptSock;
    PostRecv(pIOData);//投递WsaRecv  ....函数内容在下面        //将GetQueuedCompletionStatus返回的IO_DATA缓冲区置空,并投递AcceptEx请求
    ZeroMemory(pIOContext->sBuffer,BUFFERSIZE);
    PostAccept(pIOData);//投递WsaAccepte ,...函数内容在下面
    }
    bool CIOCPServer::PostAccept(IO_DATA* pIOData)
    {
    memset(&pIOData->m_overLapped,0,sizeof(pIOData->m_overLapped));
    pIOData->EvenType= WSA_Accpte;
    pIOData->m_AcceptSock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED); DWORD dwByte;
    bool bRet = AcceptEx(m_sListenSock,pIOData->m_AcceptSock,pIOData->sBuffer,BUFFERSIZE-((sizeof(SOCKADDR_IN)+16)*2),
    sizeof(sockaddr_in)+16,sizeof(sockaddr_in)+16,&dwByte,&pIOData->m_overLapped);
    if(!bRet)
    {
    if(WSAGetLastError() != WSA_IO_PENDING)
    {
    return false;
    }
    }
    return true;
    }bool CIOCPServer::PostRecv(IO_DATA * pIOContex)
    { DWORD dwRecvBytes = 0;
    DWORD dwFlag = 0;
    WSABUF wsaBuf;
    pIOContex->EvenType = WSA_Recv;
    ZeroMemory(pIOContex->sBuffer,BUFFERSIZE);
    wsaBuf.buf = pIOContex->sBuffer;
    wsaBuf.len = BUFFERSIZE;
    int nBytesRecv = WSARecv(pIOContex->m_AcceptSock,&wsaBuf,1,&dwRecvBytes,&dwFlag,&pIOContex->m_overLapped,0); // 如果返回值错误,并且错误的代码并非是Pending的话,那就说明这个重叠请求失败了
    if ((SOCKET_ERROR == nBytesRecv) && (WSA_IO_PENDING != WSAGetLastError()))
    {
    return false;
    }
    return true;
    }
      

  4.   


    <?php
    echo "hello csdn,please Don't abandon me"
    ?>