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 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 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; }
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; }