bool PeerConnector::ConnectTCP(const PEER_ADDRESS& addr, UINT16 realPort, const PeerConnectParam& param) { if (m_LiveInfo.TransferMethod == TRANSFER_UDP) { return ConnectUDP(addr, param); // 用于测试纯tcp的情况 } if (realPort == 0) realPort = addr.TcpPort; if ( realPort == 0 ) return false; if (CheckConnected(addr, param.IsVIP)) { VIEW_INFO("CPeerManager::ConnectToRemote CheckConnected " << addr << " failed"); return false; } const PEER_ADDRESS& localAddr = m_NetInfo->Address; if (addr.IP == localAddr.IP && addr.TcpPort == localAddr.TcpPort) { //LIVE_ASSERT(false); VIEW_ERROR("ConnectTCP ignore myself " << addr); return false; } return m_TCPConnector->Connect(addr, realPort, param); }
//------------------------------------------------------------------------------ // // Open() - Create a connection to a specified address on a specified port // //------------------------------------------------------------------------------ bool CActiveSocket::Open(const char *pAddr, uint16 nPort) { bool bRetVal = false; if (IsSocketValid() == false) { SetSocketError(CSimpleSocket::SocketInvalidSocket); return bRetVal; } if (pAddr == NULL) { SetSocketError(CSimpleSocket::SocketInvalidAddress); return bRetVal; } if (nPort == 0) { SetSocketError(CSimpleSocket::SocketInvalidPort); return bRetVal; } switch (m_nSocketType) { case CSimpleSocket::SocketTypeTcp : { bRetVal = ConnectTCP(pAddr, nPort); break; } case CSimpleSocket::SocketTypeUdp : { bRetVal = ConnectUDP(pAddr, nPort); break; } case CSimpleSocket::SocketTypeRaw : break; default: break; } //-------------------------------------------------------------------------- // If successful then create a local copy of the address and port //-------------------------------------------------------------------------- if (bRetVal) { socklen_t nSockLen = sizeof(struct sockaddr); memset(&m_stServerSockaddr, 0, nSockLen); getpeername(m_socket, (struct sockaddr *)&m_stServerSockaddr, &nSockLen); nSockLen = sizeof(struct sockaddr); memset(&m_stClientSockaddr, 0, nSockLen); getsockname(m_socket, (struct sockaddr *)&m_stClientSockaddr, &nSockLen); SetSocketError(SocketSuccess); } return bRetVal; }
static int OpenSender( void ) { l.pcCommand = ConnectUDP( NULL, 3007, WIDE("255.255.255.255"), 3006, NULL, NULL ); if( !l.pcCommand ) l.pcCommand = ConnectUDP( NULL, 3008, WIDE("255.255.255.255"), 3006, NULL, NULL ); if( !l.pcCommand ) l.pcCommand = ConnectUDP( NULL, 3009, WIDE("255.255.255.255"), 3006, NULL, NULL ); if( !l.pcCommand ) l.pcCommand = ConnectUDP( NULL, 3010, WIDE("255.255.255.255"), 3006, NULL, NULL ); if( !l.pcCommand ) l.pcCommand = ConnectUDP( NULL, 3011, WIDE("255.255.255.255"), 3006, NULL, NULL ); if( !l.pcCommand ) l.pcCommand = ConnectUDP( NULL, 3012, WIDE("255.255.255.255"), 3006, NULL, NULL ); if( !l.pcCommand ) { srand( GetTickCount() ); l.pcCommand = ConnectUDP( NULL, (uint16_t)(3000 + rand() % 10000), WIDE("255.255.255.255"), 3006, NULL, NULL ); } if( !l.pcCommand ) { printf( WIDE("Failed to bind to any port!\n") ); return 0; } return 1; }
bool PeerConnector::Connect(const PEER_ADDRESS& addr, const PeerConnectParam& param) { if (param.ConnectFlags == IPPOOL_CONNECT_NORMAL) { return ConnectTCP(addr, 0, param); } else if (param.ConnectFlags == IPPOOL_CONNECT_80) { return ConnectTCP(addr, 80, param); } else if (param.ConnectFlags == IPPOOL_CONNECT_UDPT) { return ConnectUDP(addr, param); } else { // 如果默认的话,就直接转向 IPPOOL_CONNECT_ LIVE_ASSERT(param.ConnectFlags == IPPOOL_CONNECT_NONE); return ConnectUDP(addr, param); } }