BOOL CTcpServer::CreateListenSocket(LPCTSTR lpszBindAddress, USHORT usPort) { BOOL isOK = FALSE; if(!lpszBindAddress || lpszBindAddress[0] == 0) lpszBindAddress = DEFAULT_IPV4_BIND_ADDRESS; HP_SOCKADDR addr; if(::sockaddr_A_2_IN(lpszBindAddress, usPort, addr)) { m_usFamily = addr.family; m_soListen = socket(m_usFamily, SOCK_STREAM, IPPROTO_TCP); if(m_soListen != INVALID_SOCKET) { BOOL bOnOff = (m_dwKeepAliveTime > 0 && m_dwKeepAliveInterval > 0); ENSURE(::SSO_KeepAliveVals(m_soListen, bOnOff, m_dwKeepAliveTime, m_dwKeepAliveInterval) == NO_ERROR); ENSURE(::SSO_ExclusiveAddressUse(m_soListen, TRUE) == NO_ERROR); ENSURE(::SSO_NoBlock(m_soListen) == NO_ERROR); if(::bind(m_soListen, addr.Addr(), addr.AddrSize()) != SOCKET_ERROR) { if(TRIGGER(FirePrepareListen(m_soListen)) != HR_ERROR) { if(::listen(m_soListen, m_dwSocketListenQueue) != SOCKET_ERROR) { m_pfnAcceptEx = ::Get_AcceptEx_FuncPtr(m_soListen); m_pfnGetAcceptExSockaddrs = ::Get_GetAcceptExSockaddrs_FuncPtr(m_soListen); m_pfnDisconnectEx = ::Get_DisconnectEx_FuncPtr(m_soListen); ASSERT(m_pfnAcceptEx); ASSERT(m_pfnGetAcceptExSockaddrs); ASSERT(m_pfnDisconnectEx); isOK = TRUE; } else SetLastError(SE_SOCKET_LISTEN, __FUNCTION__, ::WSAGetLastError()); } else SetLastError(SE_SOCKET_PREPARE, __FUNCTION__, ENSURE_ERROR_CANCELLED); } else SetLastError(SE_SOCKET_BIND, __FUNCTION__, ::WSAGetLastError()); } else SetLastError(SE_SOCKET_CREATE, __FUNCTION__, ::WSAGetLastError()); } else SetLastError(SE_SOCKET_CREATE, __FUNCTION__, ::WSAGetLastError()); return isOK; }
BOOL CUdpCast::BindClientSocket(HP_SOCKADDR& bindAddr) { if(::bind(m_soClient, bindAddr.Addr(), bindAddr.AddrSize()) == SOCKET_ERROR) return FALSE; int addr_len = bindAddr.AddrSize(); VERIFY(::getsockname(m_soClient, bindAddr.Addr(), &addr_len) == NO_ERROR); m_dwConnID = ::GenerateConnectionID(); return TRUE; }
BOOL CUdpCast::CreateClientSocket(LPCTSTR lpszRemoteAddress, USHORT usPort, LPCTSTR lpszBindAddress, HP_SOCKADDR& bindAddr) { if(m_enCastMode == CM_MULTICAST) { if(!::GetSockAddrByHostName(lpszRemoteAddress, usPort, m_castAddr)) return FALSE; } else { m_castAddr.family = AF_INET; m_castAddr.addr4.sin_addr.s_addr = INADDR_BROADCAST; m_castAddr.SetPort(usPort); } if(!lpszBindAddress || lpszBindAddress[0] == 0) { bindAddr.family = m_castAddr.family; bindAddr.SetPort(usPort); } else { if(!::sockaddr_A_2_IN(lpszBindAddress, usPort, bindAddr)) return FALSE; if(m_enCastMode == CM_BROADCAST && bindAddr.IsIPv6()) { ::WSASetLastError(WSAEPROTONOSUPPORT); return FALSE; } if(m_castAddr.family != bindAddr.family) { ::WSASetLastError(WSAEAFNOSUPPORT); return FALSE; } } m_soClient = socket(m_castAddr.family, SOCK_DGRAM, IPPROTO_UDP); if(m_soClient == INVALID_SOCKET) return FALSE; VERIFY(::SSO_UDP_ConnReset(m_soClient, FALSE) == NO_ERROR); VERIFY(::SSO_ReuseAddress(m_soClient, m_bReuseAddress) != SOCKET_ERROR); m_evSocket = ::WSACreateEvent(); ASSERT(m_evSocket != WSA_INVALID_EVENT); SetRemoteHost(lpszRemoteAddress, usPort); return TRUE; }
void CTcpServer::AddClientSocketObj(CONNID dwConnID, TSocketObj* pSocketObj, const HP_SOCKADDR& remoteAddr) { ASSERT(FindSocketObj(dwConnID) == nullptr); pSocketObj->connTime = ::TimeGetTime(); pSocketObj->activeTime = pSocketObj->connTime; remoteAddr.Copy(pSocketObj->remoteAddr); pSocketObj->SetConnected(); ENSURE(m_bfActiveSockets.ReleaseLock(dwConnID, pSocketObj)); }
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::BindClientSocket(const HP_SOCKADDR& addrBind, const HP_SOCKADDR& addrRemote, USHORT usLocalPort) { if(addrBind.IsSpecified() && usLocalPort == 0) { if(::bind(m_soClient, addrBind.Addr(), addrBind.AddrSize()) == SOCKET_ERROR) return FALSE; } else if(usLocalPort != 0) { HP_SOCKADDR realBindAddr = addrBind.IsSpecified() ? addrBind : HP_SOCKADDR::AnyAddr(addrRemote.family); realBindAddr.SetPort(usLocalPort); if(::bind(m_soClient, realBindAddr.Addr(), realBindAddr.AddrSize()) == SOCKET_ERROR) return FALSE; } m_dwConnID = ::GenerateConnectionID(); return TRUE; }