bool CTransferSocket::SetupPassiveTransfer(wxString host, int port) { ResetSocket(); m_pSocket = new CSocket(this); if (m_pControlSocket->m_pProxyBackend) { m_pProxyBackend = new CProxySocket(this, m_pSocket, m_pControlSocket); int res = m_pProxyBackend->Handshake(m_pControlSocket->m_pProxyBackend->GetProxyType(), host, port, m_pControlSocket->m_pProxyBackend->GetUser(), m_pControlSocket->m_pProxyBackend->GetPass()); if (res != EINPROGRESS) { ResetSocket(); return false; } int error; host = m_pControlSocket->m_pSocket->GetPeerIP(); port = m_pControlSocket->m_pSocket->GetRemotePort(error); if( host.empty() || port < 1 ) { m_pControlSocket->LogMessage(MessageType::Debug_Warning, _T("Could not get peer address of control connection.")); ResetSocket(); return false; } } SetSocketBufferSizes(m_pSocket); int res = m_pSocket->Connect(host, port); if (res && res != EINPROGRESS) { ResetSocket(); return false; } return true; }
bool CTransferSocket::SetupPassiveTransfer(std::wstring const& host, int port) { std::string ip; ResetSocket(); m_pSocket = new CSocket(engine_.GetThreadPool(), this); if (controlSocket_.m_pProxyBackend) { m_pProxyBackend = new CProxySocket(this, m_pSocket, &controlSocket_); int res = m_pProxyBackend->Handshake(controlSocket_.m_pProxyBackend->GetProxyType(), host, port, controlSocket_.m_pProxyBackend->GetUser(), controlSocket_.m_pProxyBackend->GetPass()); if (res != EINPROGRESS) { ResetSocket(); return false; } int error; ip = controlSocket_.m_pSocket->GetPeerIP(); port = controlSocket_.m_pSocket->GetRemotePort(error); if (ip.empty() || port < 1) { controlSocket_.LogMessage(MessageType::Debug_Warning, _T("Could not get peer address of control connection.")); ResetSocket(); return false; } } else { ip = fz::to_utf8(host); } SetSocketBufferSizes(m_pSocket); // Try to bind the source IP of the data connection to the same IP as the control connection. // We can do so either if // 1) the destination IP of the data connection matches peer IP of the control connection or // 2) we are using a proxy. // // In case destination IPs of control and data connection are different, do not bind to the // same source. std::string bindAddress; if (m_pProxyBackend) { bindAddress = controlSocket_.m_pSocket->GetLocalIP(); controlSocket_.LogMessage(MessageType::Debug_Info, _T("Binding data connection source IP to control connection source IP %s"), bindAddress); } else { if (controlSocket_.m_pSocket->GetPeerIP(true) == ip || controlSocket_.m_pSocket->GetPeerIP(false) == ip) { bindAddress = controlSocket_.m_pSocket->GetLocalIP(); controlSocket_.LogMessage(MessageType::Debug_Info, _T("Binding data connection source IP to control connection source IP %s"), bindAddress); } else { controlSocket_.LogMessage(MessageType::Debug_Warning, _T("Destination IP of data connection does not match peer IP of control connection. Not binding source address of data connection.")); } } int res = m_pSocket->Connect(fz::to_native(ip), port, CSocket::unspec, bindAddress); if (res && res != EINPROGRESS) { ResetSocket(); return false; } return true; }