void CTcpServer::HandleAccept(SOCKET soListen, TBufferObj* pBufferObj) { VERIFY(::PostIocpAccept(m_hCompletePort)); int iLocalSockaddrLen; int iRemoteSockaddrLen; HP_PSOCKADDR pLocalSockAddr; HP_PSOCKADDR pRemoteSockAddr; int iAddrLen = HP_SOCKADDR::AddrSize(m_usFamily) + 16; m_pfnGetAcceptExSockaddrs ( pBufferObj->buff.buf, 0, iAddrLen, iAddrLen, (SOCKADDR**)&pLocalSockAddr, &iLocalSockaddrLen, (SOCKADDR**)&pRemoteSockAddr, &iRemoteSockaddrLen ); CONNID dwConnID = 0; SOCKET socket = pBufferObj->client; if(!HasStarted() || !m_bfActiveSockets.AcquireLock(dwConnID)) { ::ManualCloseSocket(socket, SD_BOTH); AddFreeBufferObj(pBufferObj); return; } TSocketObj* pSocketObj = GetFreeSocketObj(dwConnID, socket); pRemoteSockAddr->Copy(pSocketObj->remoteAddr); AddClientSocketObj(dwConnID, pSocketObj); ::SSO_UpdateAcceptContext(socket, soListen); ::CreateIoCompletionPort((HANDLE)socket, m_hCompletePort, (ULONG_PTR)pSocketObj, 0); if(TriggerFireAccept(pSocketObj) != HR_ERROR) DoReceive(pSocketObj, pBufferObj); else { AddFreeSocketObj(pSocketObj, SCF_NONE); AddFreeBufferObj(pBufferObj); } }
void CTcpServer::HandleAccept(SOCKET soListen, TBufferObj* pBufferObj) { VERIFY(::PostIocpAccept(m_hCompletePort)); int iLocalSockaddrLen; int iRemoteSockaddrLen; SOCKADDR* pLocalSockAddr; SOCKADDR* pRemoteSockAddr; m_pfnGetAcceptExSockaddrs ( pBufferObj->buff.buf, 0, sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, (SOCKADDR **)&pLocalSockAddr, &iLocalSockaddrLen, (SOCKADDR **)&pRemoteSockAddr, &iRemoteSockaddrLen ); SOCKET socket = pBufferObj->client; CONNID dwConnID = ::GenerateConnectionID(); TSocketObj* pSocketObj = GetFreeSocketObj(dwConnID, socket); memcpy(&pSocketObj->remoteAddr, pRemoteSockAddr, sizeof(SOCKADDR_IN)); AddClientSocketObj(dwConnID, pSocketObj); ::SSO_UpdateAcceptContext(socket, soListen); if(TriggerFireAccept(pSocketObj) != HR_ERROR) { ::CreateIoCompletionPort((HANDLE)socket, m_hCompletePort, (ULONG_PTR)pSocketObj, 0); DoReceive(dwConnID, pSocketObj, pBufferObj); } else { AddFreeSocketObj(pSocketObj, SCF_NONE); AddFreeBufferObj(pBufferObj); } }