void CTcpAgent::CheckError(TSocketObj* pSocketObj, EnSocketOperation enOperation, int iErrorCode) { if(iErrorCode != WSAENOTSOCK && iErrorCode != ERROR_OPERATION_ABORTED) AddFreeSocketObj(pSocketObj, SCF_ERROR, enOperation, iErrorCode); }
void CTcpServer::ForceDisconnect(CONNID dwConnID) { AddFreeSocketObj(FindSocketObj(dwConnID), SCF_CLOSE); }
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 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; }
void CTcpServer::CheckError(CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) { if(iErrorCode != WSAENOTSOCK) AddFreeSocketObj(dwConnID, SCF_ERROR, enOperation, iErrorCode); }