int INetObject::Accept()
{
if( false==m_bListen )
{
if( false==InitSocketTCPS(m_nSocket, m_nIP, m_nPort) )
{
prints("Err,");
return -1;
} m_bListen = true;
} InitAccpetExlpfn(); m_IOCPAcceptData.nSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_IOCPAcceptData.nSocket) 
{
prints("Err,INVALID_SOCKET \n");
return -1;    
} m_IOCPAcceptData.nEvent = IOCP_EVENT_ACCEPT;
/*m_lpfnAcceptEx*/ AcceptEx(m_nSocket, 
m_IOCPAcceptData.nSocket,
m_IOCPAcceptData.BufferRecv, 
/*m_IOCPAcceptData.m_nOutBuffLen - */((sizeof(sockaddr_in) + 16) * 2),
sizeof(sockaddr_in) + 16, 
sizeof(sockaddr_in) + 16, 
&m_IOCPAcceptData.nRecvBytes, 
&m_IOCPAcceptData.OverlappedRecv); return 0;
}
void CNetDriver::AddLocalObject(INetObject* pLocalObject)
{
/*
如果是连接类型的,则先进行初始化,然后则绑定到完成端口
*/
m_LocalObject.push_back( pLocalObject );
if( true==pLocalObject->IsAcceptIdenti() )
{
m_IOCP.AssociateSocket(pLocalObject->m_nSocket, (ULONG_PTR)&pLocalObject->m_IOCPAcceptData);
MTVERIFY(-1!=nResult);
}
}
完成端口API没有问题,connect进来的都能接到事件,但是GetQueuedCompletionStatus这条语句根本就没有返回。。不解了,,求教。。

解决方案 »

  1.   

    绑定到完成端口之后,还要用重叠结构WSARecv
      

  2.   


    可能没表达清楚:我是说无法监听到Accept,不关WSARecv的事吧
      

  3.   

    在你的AcceptEx语句后,用::WSAGetLastError()查看一下返回码
      

  4.   

    客户端需要send一次数据才有通知。
      

  5.   

    问题找到,范了两个错误一个是4楼的,我的本意是有连接直接返回,但是长度上却写了  /*m_IOCPAcceptData.m_nOutBuffLen - */((sizeof(sockaddr_in) + 16) * 2),二个是3楼的,你的方法提醒了我。OverlappedRecv居然没清零。。
    我是笨蛋谢谢大家,揭贴了。