BOOL CUdpCast::ConnectToGroup(const HP_SOCKADDR& bindAddr) { if(m_enCastMode == CM_MULTICAST) { if(!SetMultiCastSocketOptions(bindAddr)) return FALSE; } else { ASSERT(m_castAddr.IsIPv4()); BOOL bSet = TRUE; VERIFY(::SSO_SetSocketOption(m_soClient, SOL_SOCKET, SO_BROADCAST, &bSet, sizeof(BOOL)) != SOCKET_ERROR); } BOOL isOK = FALSE; if(::WSAEventSelect(m_soClient, m_evSocket, FD_READ | FD_WRITE | FD_CLOSE) != SOCKET_ERROR) { if(FireConnect() != HR_ERROR) { m_enState = SS_STARTED; isOK = TRUE; } } return isOK; }
BOOL CUdpClient::HandleConnect(WSANETWORKEVENTS& events) { BOOL bContinue = TRUE; int iCode = events.iErrorCode[FD_CONNECT_BIT]; if(iCode == 0) { if(::WSAEventSelect(m_soClient, m_evSocket, FD_READ | FD_WRITE | FD_CLOSE) != SOCKET_ERROR) { if(FireConnect(this) != HR_ERROR) { VERIFY(NeedDetectorThread() || DetectConnection() == NO_ERROR); m_enState = SS_STARTED; } else iCode = ERROR_CANCELLED; } else iCode = ::WSAGetLastError(); } if(iCode != 0) { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(this, SO_CONNECT, iCode); bContinue = FALSE; } return bContinue; }
BOOL CTcpClient::HandleConnect(SHORT events) { ASSERT(events & POLLOUT); int code = ::SSO_GetError(m_soClient); if(!IS_NO_ERROR(code) || (events & _POLL_ERROR_EVENTS)) { m_ccContext.Reset(TRUE, SO_CONNECT, code); return FALSE; } if(events & _POLL_HUNGUP_EVENTS) { m_ccContext.Reset(TRUE, SO_CONNECT, NO_ERROR); return FALSE; } SetConnected(); if(TRIGGER(FireConnect()) == HR_ERROR) { m_ccContext.Reset(FALSE); return FALSE; } return TRUE; }
BOOL CUdpCast::ConnectToGroup(LPCTSTR lpszRemoteAddress, USHORT usPort, in_addr sinAddr) { if(m_enCastMode == CM_MULTICAST) { TCHAR szAddress[40]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); if(!::GetIPAddress(lpszRemoteAddress, szAddress, iAddressLen)) { ::WSASetLastError(WSAEADDRNOTAVAIL); return FALSE; } if(!::sockaddr_A_2_IN(AF_INET, szAddress, usPort, m_castAddr)) { ::WSASetLastError(WSAEADDRNOTAVAIL); return FALSE; } VERIFY(::SSO_SetSocketOption(m_soClient, IPPROTO_IP, IP_MULTICAST_TTL, &m_iMCTtl, sizeof(int)) != SOCKET_ERROR); VERIFY(::SSO_SetSocketOption(m_soClient, IPPROTO_IP, IP_MULTICAST_LOOP, &m_bMCLoop, sizeof(BOOL)) != SOCKET_ERROR); } else { m_castAddr.sin_family = AF_INET; m_castAddr.sin_addr.s_addr = INADDR_BROADCAST; m_castAddr.sin_port = htons(usPort); BOOL bSet = TRUE; VERIFY(::SSO_SetSocketOption(m_soClient, SOL_SOCKET, SO_BROADCAST, &bSet, sizeof(BOOL)) != SOCKET_ERROR); } if(m_enCastMode == CM_MULTICAST) { ip_mreq mcast; ::ZeroMemory(&mcast, sizeof(ip_mreq)); mcast.imr_multiaddr = m_castAddr.sin_addr; mcast.imr_interface = sinAddr; if(::SSO_SetSocketOption(m_soClient, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(ip_mreq)) == SOCKET_ERROR) return FALSE; } SetRemoteHost(lpszRemoteAddress, usPort); BOOL isOK = FALSE; if(::WSAEventSelect(m_soClient, m_evSocket, FD_READ | FD_WRITE | FD_CLOSE) != SOCKET_ERROR) { if(FireConnect() != HR_ERROR) { m_enState = SS_STARTED; isOK = TRUE; } } return isOK; }
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 CTcpAgent::HandleConnect(CONNID dwConnID, TSocketObj* pSocketObj, TBufferObj* pBufferObj) { VERIFY(::SSO_UpdateConnectContext(pSocketObj->socket, 0) == NO_ERROR); 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) DoReceive(dwConnID, pSocketObj, pBufferObj); else { AddFreeSocketObj(dwConnID, SCF_NONE); AddFreeBufferObj(pBufferObj); } }
BOOL CTcpClient::ConnectToServer(LPCTSTR pszRemoteAddress, USHORT usPort) { TCHAR szAddress[40]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); if(!::GetIPAddress(pszRemoteAddress, szAddress, iAddressLen)) { ::WSASetLastError(WSAEADDRNOTAVAIL); return FALSE; } SOCKADDR_IN addr; if(!::sockaddr_A_2_IN(AF_INET, szAddress, usPort, addr)) { ::WSASetLastError(WSAEADDRNOTAVAIL); return FALSE; } BOOL isOK = FALSE; if(m_bAsyncConnect) { if(::WSAEventSelect(m_soClient, m_evSocket, FD_CONNECT | FD_CLOSE) != SOCKET_ERROR) { int rc = ::connect(m_soClient, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); isOK = (rc == NO_ERROR || (rc == SOCKET_ERROR && ::WSAGetLastError() == WSAEWOULDBLOCK)); } } else { if(::connect(m_soClient, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)) != SOCKET_ERROR) { if(::WSAEventSelect(m_soClient, m_evSocket, FD_READ | FD_WRITE | FD_CLOSE) != SOCKET_ERROR) { if(FireConnect(this) != HR_ERROR) { m_enState = SS_STARTED; isOK = TRUE; } } } } return isOK; }
BOOL CClientSocket::ConnectToServer(LPCTSTR pszRemoteAddress, USHORT usPort) { CString strAddress; if(!::GetIPAddress(pszRemoteAddress, strAddress)) return FALSE; SOCKADDR_IN addr; if(!::sockaddr_A_2_IN(AF_INET, strAddress, usPort, addr)) return FALSE; BOOL isOK = FALSE; if(m_bAsyncConnect) { if(::WSAEventSelect(m_soClient, m_evSocket, FD_CONNECT | FD_CLOSE) != SOCKET_ERROR) { int rc = connect(m_soClient, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); isOK = (rc == NO_ERROR || (rc == SOCKET_ERROR && ::WSAGetLastError() == WSAEWOULDBLOCK)); } } else { if(connect(m_soClient, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)) != SOCKET_ERROR) { if(::WSAEventSelect(m_soClient, m_evSocket, FD_READ | FD_WRITE | FD_CLOSE) != SOCKET_ERROR) { if(FireConnect(m_dwConnID) != ISocketListener::HR_ERROR) { m_enState = SS_STARTED; isOK = TRUE; } } } } return isOK; }
BOOL CTcpClient::ConnectToServer(const HP_SOCKADDR& addrRemote, BOOL bAsyncConnect) { BOOL isOK = FALSE; if(bAsyncConnect) { VERIFY(::fcntl_SETFL(m_soClient, O_NOATIME | O_NONBLOCK | O_CLOEXEC)); int rc = ::connect(m_soClient, addrRemote.Addr(), addrRemote.AddrSize()); if(IS_NO_ERROR(rc) || IS_IO_PENDING_ERROR()) { m_nEvents = POLLOUT; isOK = TRUE; } } else { if(::connect(m_soClient, addrRemote.Addr(), addrRemote.AddrSize()) != SOCKET_ERROR) { VERIFY(::fcntl_SETFL(m_soClient, O_NOATIME | O_NONBLOCK | O_CLOEXEC)); SetConnected(); if(TRIGGER(FireConnect()) == HR_ERROR) ::WSASetLastError(ENSURE_ERROR_CANCELLED); else { m_nEvents = (SHORT)((m_lsSend.IsEmpty() ? 0 : POLLOUT) | (m_bPaused ? 0 : POLLIN) | POLLRDHUP); isOK = TRUE; } } } return isOK; }
BOOL CTcpClient::ProcessNetworkEvent() { BOOL bContinue = TRUE; WSANETWORKEVENTS events; int rc = ::WSAEnumNetworkEvents(m_soClient, m_evSocket, &events); if(rc == SOCKET_ERROR) { int code = ::WSAGetLastError(); SetLastError(SE_NETWORK, __FUNCTION__, code); VERIFY(::WSAResetEvent(m_evSocket)); FireError(m_dwConnID, SO_UNKNOWN, code); bContinue = FALSE; } if(bContinue && events.lNetworkEvents & FD_READ) { int iCode = events.iErrorCode[FD_READ_BIT]; if(iCode == 0) bContinue = ReadData(); else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(m_dwConnID, SO_RECEIVE, iCode); bContinue = FALSE; } } if(bContinue && events.lNetworkEvents & FD_WRITE) { int iCode = events.iErrorCode[FD_WRITE_BIT]; if(iCode == 0) bContinue = SendData(); else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(m_dwConnID, SO_SEND, iCode); bContinue = FALSE; } } if(m_bAsyncConnect && bContinue && events.lNetworkEvents & FD_CONNECT) { int iCode = events.iErrorCode[FD_CONNECT_BIT]; if(iCode == 0) { if(::WSAEventSelect(m_soClient, m_evSocket, FD_READ | FD_WRITE | FD_CLOSE) != SOCKET_ERROR) { if(FireConnect(m_dwConnID) != HR_ERROR) m_enState = SS_STARTED; else iCode = ERROR_FUNCTION_FAILED; } else iCode = ::WSAGetLastError(); } if(iCode != 0) { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(m_dwConnID, SO_CONNECT, iCode); bContinue = FALSE; } } if(bContinue && events.lNetworkEvents & FD_CLOSE) { int iCode = events.iErrorCode[FD_CLOSE_BIT]; if(iCode == 0) FireClose(m_dwConnID); else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(m_dwConnID, SO_UNKNOWN, iCode); } bContinue = FALSE; } return bContinue; }
EnHandleResult CTcpAgent::TriggerFireConnect(TSocketObj* pSocketObj) { CReentrantSpinLock locallock(pSocketObj->csRecv); return FireConnect(pSocketObj); }