bool RTPTransport::localAddr(SocketAddr& addr, bool rtcp) { // check if sockets are already created and bound if (m_rtpSock.valid()) return false; int p = addr.port(); // for RTCP make sure we don't have a port or it's an even one if (rtcp && (p & 1)) return false; m_warnSendErrorRtp = true; m_warnSendErrorRtcp = true; if (m_rtpSock.create(addr.family(),SOCK_DGRAM) && m_rtpSock.bind(addr)) { m_rtpSock.setBlocking(false); if (!rtcp) { // RTCP not requested - we are done m_rtpSock.getSockName(addr); m_localAddr = addr; setScopeId(m_localAddr,m_remoteAddr,m_remotePref); return true; } if (!p) { m_rtpSock.getSockName(addr); p = addr.port(); if (p & 1) { // allocated odd port - have to swap sockets m_rtcpSock.attach(m_rtpSock.detach()); addr.port(p-1); if (m_rtpSock.create(addr.family(),SOCK_DGRAM) && m_rtpSock.bind(addr)) { m_rtpSock.setBlocking(false); m_localAddr = addr; setScopeId(m_localAddr,m_remoteAddr,m_remoteRTCP,&m_remotePref); return true; } DDebug(DebugMild,"RTP Socket failed with code %d",m_rtpSock.error()); m_rtpSock.terminate(); m_rtcpSock.terminate(); return false; } } addr.port(p+1); if (m_rtcpSock.create(addr.family(),SOCK_DGRAM) && m_rtcpSock.bind(addr)) { m_rtcpSock.setBlocking(false); addr.port(p); m_localAddr = addr; setScopeId(m_localAddr,m_remoteAddr,m_remoteRTCP,&m_remotePref); return true; } #ifdef DEBUG else Debug(DebugMild,"RTCP Socket failed with code %d",m_rtcpSock.error()); #endif } #ifdef DEBUG else Debug(DebugMild,"RTP Socket failed with code %d",m_rtpSock.error()); #endif m_rtpSock.terminate(); m_rtcpSock.terminate(); return false; }
bool RTPTransport::remoteAddr(SocketAddr& addr, bool sniff) { Lock lock(group()); m_autoRemote = sniff; int p = addr.port(); // make sure we have a valid address and a port // we do not check that it's even numbered as many NAPTs will break that if (p && addr.valid()) { m_warnSendErrorRtp = true; m_warnSendErrorRtcp = true; m_remoteAddr = addr; m_remoteRTCP = addr; m_remoteRTCP.port(addr.port()+1); // if sniffing packets from other sources remember preferred address if (sniff) m_remotePref = addr; setScopeId(m_localAddr,m_remoteAddr,m_remoteRTCP,sniff ? &m_remotePref : 0); return true; } return false; }