CONNID CUdpServer::HandleAccept(TUdpBufferObj* pBufferObj) { CONNID dwConnID = 0; { CCriSecLock locallock(m_csAccept); dwConnID = FindConnectionID(&pBufferObj->clientAddr); if(dwConnID == 0) { dwConnID = ::GenerateConnectionID(m_dwConnID); TUdpSocketObj* pSocketObj = GetFreeSocketObj(dwConnID); memcpy(&pSocketObj->clientAddr, &pBufferObj->clientAddr, pBufferObj->addrLen); AddClientSocketObj(dwConnID, pSocketObj); } else return dwConnID; } if(FireAccept(dwConnID, &pBufferObj->clientAddr) == ISocketListener::HR_ERROR) { AddFreeSocketObj(dwConnID); dwConnID = 0; } return dwConnID; }
CONNID CUdpServer::HandleAccept(TUdpBufferObj* pBufferObj) { CONNID dwConnID = FindConnectionID(&pBufferObj->remoteAddr); if(dwConnID == 0) { CCriSecLock locallock(m_csAccept); dwConnID = FindConnectionID(&pBufferObj->remoteAddr); if(dwConnID != 0) return dwConnID; else { dwConnID = ::GenerateConnectionID(); TUdpSocketObj* pSocketObj = GetFreeSocketObj(dwConnID); memcpy(&pSocketObj->remoteAddr, &pBufferObj->remoteAddr, sizeof(SOCKADDR_IN)); AddClientSocketObj(dwConnID, pSocketObj); } } if(FireAccept(dwConnID, &pBufferObj->remoteAddr) == HR_ERROR) { AddFreeSocketObj(dwConnID); dwConnID = 0; } return dwConnID; }
DWORD CTcpAgent::ConnectToServer(CONNID dwConnID, SOCKET& soClient, LPCTSTR pszRemoteAddress, USHORT usPort) { TCHAR szAddress[40]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); if(!::GetIPAddress(pszRemoteAddress, szAddress, iAddressLen)) return ERROR_INVALID_ADDRESS; SOCKADDR_IN addr; if(!::sockaddr_A_2_IN(AF_INET, szAddress, usPort, addr)) return ERROR_INVALID_ADDRESS; TBufferObj* pBufferObj = GetFreeBufferObj(); TSocketObj* pSocketObj = GetFreeSocketObj(dwConnID, soClient); memcpy(&pSocketObj->remoteAddr, &addr, sizeof(SOCKADDR_IN)); AddClientSocketObj(dwConnID, pSocketObj); DWORD result = NO_ERROR; if(m_bAsyncConnect) { if(::CreateIoCompletionPort((HANDLE)soClient, m_hCompletePort, (ULONG_PTR)pSocketObj, 0)) result = ::PostConnect(m_pfnConnectEx, soClient, addr, pBufferObj); else result = ::GetLastError(); } else { if(::connect(soClient, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)) != SOCKET_ERROR) { if(::CreateIoCompletionPort((HANDLE)soClient, m_hCompletePort, (ULONG_PTR)pSocketObj, 0)) { BOOL bOnOff = (m_dwKeepAliveTime > 0 && m_dwKeepAliveInterval > 0); VERIFY(::SSO_KeepAliveVals(pSocketObj->socket, bOnOff, m_dwKeepAliveTime, m_dwKeepAliveInterval) == NO_ERROR); if(FireConnect(dwConnID) != HR_ERROR) result = DoReceive(dwConnID, pSocketObj, pBufferObj); else result = ERROR_FUNCTION_FAILED; } else result = ::GetLastError(); } else result = ::WSAGetLastError(); } if(result != NO_ERROR) { AddFreeSocketObj(dwConnID, SCF_NONE); AddFreeBufferObj(pBufferObj); soClient = INVALID_SOCKET; } return result; }
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 CIocpServer::HandleAccept(SOCKET soListen, TBufferObj* pBufferObj) { DeleteAcceptSocket(pBufferObj->client); int iLocalSockaddrLen; int iRemoteSockaddrLen; SOCKADDR* pLocalSockAddr; SOCKADDR* pRemoteSockAddr; //将AcceptEx接受的第一块数据中的本地和远程机器的地址返回给用户 m_pfnGetAcceptExSockaddrs ( pBufferObj->buff.buf, 0, sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, (SOCKADDR **)&pLocalSockAddr, &iLocalSockaddrLen, (SOCKADDR **)&pRemoteSockAddr, &iRemoteSockaddrLen ); TSocketObj* pSocketObj = GetFreeSocketObj(); pSocketObj->socket = pBufferObj->client; pSocketObj->connID = ::InterlockedIncrement((LONG*)&m_dwConnID); //InterlockedIncrement 对m_dwConnID加1 在对m_dwConnID访问的时候其他线程不能访问这个变量 memcpy(&pSocketObj->clientAddr, pRemoteSockAddr, sizeof(SOCKADDR_IN)); //远程机器的地址 AddClientSocketObj(pSocketObj->connID, pSocketObj); int result = 0; result = ::SSO_UpdateAcceptContext(pSocketObj->socket, soListen); ASSERT(result == 0); if(m_dwKeepAliveTimes > 0 && m_dwKeepAliveInterval > 0) { result = ::SSO_KeepAliveVals(pSocketObj->socket, TRUE, m_dwKeepAliveTimes, m_dwKeepAliveInterval); ASSERT(result == 0); } //result = ::SSO_NoDelay(pSocketObj->socket, TRUE); //ASSERT(result == 0); VERIFY(::CreateIoCompletionPort((HANDLE)pSocketObj->socket, m_hCompletePort, (ULONG_PTR)pSocketObj, 0)); FireAccept(pSocketObj->connID); //打印连接 //接受连接成功后 投递一个接收 DoReceive(pSocketObj, pBufferObj); }
void CTcpServer::HandleAccept(SOCKET soListen, TBufferObj* pBufferObj) { ::PostQueuedCompletionStatus(m_hCompletePort, IOCP_SI_ACCEPT, 0, nullptr); 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(m_dwConnID); TSocketObj* pSocketObj = GetFreeSocketObj(dwConnID, socket); memcpy(&pSocketObj->clientAddr, pRemoteSockAddr, sizeof(SOCKADDR_IN)); AddClientSocketObj(dwConnID, pSocketObj); VERIFY(::SSO_UpdateAcceptContext(socket, soListen) == NO_ERROR); BOOL bOnOff = (m_dwKeepAliveTime > 0 && m_dwKeepAliveInterval > 0); VERIFY(::SSO_KeepAliveVals(socket, bOnOff, m_dwKeepAliveTime, m_dwKeepAliveInterval) == NO_ERROR); if(FireAccept(dwConnID, socket) != ISocketListener::HR_ERROR) { VERIFY(::CreateIoCompletionPort((HANDLE)socket, m_hCompletePort, (ULONG_PTR)pSocketObj, 0)); DoReceive(dwConnID, pSocketObj, pBufferObj); } else { AddFreeSocketObj(dwConnID, 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); } }
DWORD CTcpAgent::ConnectToServer(CONNID dwConnID, SOCKET& soClient, LPCTSTR lpszRemoteAddress, USHORT usPort) { TCHAR szAddress[40]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); if(!::GetIPAddress(lpszRemoteAddress, szAddress, iAddressLen)) return WSAEADDRNOTAVAIL; SOCKADDR_IN addr; if(!::sockaddr_A_2_IN(AF_INET, szAddress, usPort, addr)) return WSAEADDRNOTAVAIL; TBufferObj* pBufferObj = GetFreeBufferObj(); TSocketObj* pSocketObj = GetFreeSocketObj(dwConnID, soClient); memcpy(&pSocketObj->remoteAddr, &addr, sizeof(SOCKADDR_IN)); AddClientSocketObj(dwConnID, pSocketObj); DWORD result = NO_ERROR; BOOL bNeedFree = TRUE; if(m_bAsyncConnect) { if(::CreateIoCompletionPort((HANDLE)soClient, m_hCompletePort, (ULONG_PTR)pSocketObj, 0)) { result = DoConnect(dwConnID, pSocketObj, pBufferObj); bNeedFree = FALSE; } else result = ::GetLastError(); } else { if(::connect(soClient, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)) != SOCKET_ERROR) { if(::CreateIoCompletionPort((HANDLE)soClient, m_hCompletePort, (ULONG_PTR)pSocketObj, 0)) { if(TriggerFireConnect(pSocketObj) != HR_ERROR) { result = DoReceive(dwConnID, pSocketObj, pBufferObj); bNeedFree = FALSE; } else result = ERROR_CANCELLED; } else result = ::GetLastError(); } else result = ::WSAGetLastError(); } if(result != NO_ERROR) { if(bNeedFree) { AddFreeSocketObj(pSocketObj, SCF_NONE); AddFreeBufferObj(pBufferObj); } soClient = INVALID_SOCKET; } return result; }