📄 rtpudpv6transmitter.cpp
字号:
tv.tv_usec = delay.GetMicroSeconds(); waitingfordata = true; WAITMUTEX_LOCK MAINMUTEX_UNLOCK if (select(FD_SETSIZE,&fdset,0,0,&tv) < 0) { MAINMUTEX_LOCK waitingfordata = false; MAINMUTEX_UNLOCK WAITMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_ERRORINSELECT; } MAINMUTEX_LOCK waitingfordata = false; if (!created) // destroy called { MAINMUTEX_UNLOCK; WAITMUTEX_UNLOCK return 0; } // if aborted, read from abort buffer if (FD_ISSET(abortdesc[0],&fdset)) {#if (defined(WIN32) || defined(_WIN32_WCE)) char buf[1]; recv(abortdesc[0],buf,1,0);#else unsigned char buf[1]; read(abortdesc[0],buf,1);#endif // WIN32 } if (dataavailable != 0) { if (FD_ISSET(rtpsock,&fdset) || FD_ISSET(rtcpsock,&fdset)) *dataavailable = true; else *dataavailable = false; } MAINMUTEX_UNLOCK WAITMUTEX_UNLOCK return 0;}int RTPUDPv6Transmitter::AbortWait(){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (!waitingfordata) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTWAITING; } AbortWaitInternal(); MAINMUTEX_UNLOCK return 0;}int RTPUDPv6Transmitter::SendRTPData(const void *data,size_t len) { if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (len > maxpacksize) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_SPECIFIEDSIZETOOBIG; } destinations.GotoFirstElement(); while (destinations.HasCurrentElement()) { sendto(rtpsock,(const char *)data,len,0,(const struct sockaddr *)destinations.GetCurrentElement().GetRTPSockAddr(),sizeof(struct sockaddr_in6)); destinations.GotoNextElement(); } MAINMUTEX_UNLOCK return 0;}int RTPUDPv6Transmitter::SendRTCPData(const void *data,size_t len){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (len > maxpacksize) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_SPECIFIEDSIZETOOBIG; } destinations.GotoFirstElement(); while (destinations.HasCurrentElement()) { sendto(rtcpsock,(const char *)data,len,0,(const struct sockaddr *)destinations.GetCurrentElement().GetRTCPSockAddr(),sizeof(struct sockaddr_in6)); destinations.GotoNextElement(); } MAINMUTEX_UNLOCK return 0;}int RTPUDPv6Transmitter::AddDestination(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv6Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE; } RTPIPv6Address &address = (RTPIPv6Address &)addr; RTPIPv6Destination dest(address.GetIP(),address.GetPort()); int status = destinations.AddElement(dest); MAINMUTEX_UNLOCK return status;}int RTPUDPv6Transmitter::DeleteDestination(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv6Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE; } RTPIPv6Address &address = (RTPIPv6Address &)addr; RTPIPv6Destination dest(address.GetIP(),address.GetPort()); int status = destinations.DeleteElement(dest); MAINMUTEX_UNLOCK return status;}void RTPUDPv6Transmitter::ClearDestinations(){ if (!init) return; MAINMUTEX_LOCK if (created) destinations.Clear(); MAINMUTEX_UNLOCK}bool RTPUDPv6Transmitter::SupportsMulticasting(){ if (!init) return false; MAINMUTEX_LOCK bool v; if (!created) v = false; else v = supportsmulticasting; MAINMUTEX_UNLOCK return v;}#ifdef RTP_SUPPORT_IPV6MULTICASTint RTPUDPv6Transmitter::JoinMulticastGroup(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv6Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE; } const RTPIPv6Address &address = (const RTPIPv6Address &)addr; in6_addr mcastIP = address.GetIP(); if (!RTPUDPV6TRANS_IS_MCASTADDR(mcastIP)) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTAMULTICASTADDRESS; } status = multicastgroups.AddElement(mcastIP); if (status >= 0) { RTPUDPV6TRANS_MCASTMEMBERSHIP(rtpsock,IPV6_JOIN_GROUP,mcastIP,status); if (status != 0) { multicastgroups.DeleteElement(mcastIP); MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_COULDNTJOINMULTICASTGROUP; } RTPUDPV6TRANS_MCASTMEMBERSHIP(rtcpsock,IPV6_JOIN_GROUP,mcastIP,status); if (status != 0) { RTPUDPV6TRANS_MCASTMEMBERSHIP(rtpsock,IPV6_LEAVE_GROUP,mcastIP,status); multicastgroups.DeleteElement(mcastIP); MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_COULDNTJOINMULTICASTGROUP; } } MAINMUTEX_UNLOCK return status;}int RTPUDPv6Transmitter::LeaveMulticastGroup(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv6Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE; } const RTPIPv6Address &address = (const RTPIPv6Address &)addr; in6_addr mcastIP = address.GetIP(); if (!RTPUDPV6TRANS_IS_MCASTADDR(mcastIP)) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTAMULTICASTADDRESS; } status = multicastgroups.DeleteElement(mcastIP); if (status >= 0) { RTPUDPV6TRANS_MCASTMEMBERSHIP(rtpsock,IPV6_LEAVE_GROUP,mcastIP,status); RTPUDPV6TRANS_MCASTMEMBERSHIP(rtcpsock,IPV6_LEAVE_GROUP,mcastIP,status); status = 0; } MAINMUTEX_UNLOCK return status;}void RTPUDPv6Transmitter::LeaveAllMulticastGroups(){ if (!init) return; MAINMUTEX_LOCK if (created) { multicastgroups.GotoFirstElement(); while (multicastgroups.HasCurrentElement()) { in6_addr mcastIP; int status = 0; mcastIP = multicastgroups.GetCurrentElement(); RTPUDPV6TRANS_MCASTMEMBERSHIP(rtpsock,IPV6_LEAVE_GROUP,mcastIP,status); RTPUDPV6TRANS_MCASTMEMBERSHIP(rtcpsock,IPV6_LEAVE_GROUP,mcastIP,status); multicastgroups.GotoNextElement(); } multicastgroups.Clear(); } MAINMUTEX_UNLOCK}#else // no multicast supportint RTPUDPv6Transmitter::JoinMulticastGroup(const RTPAddress &addr){ return ERR_RTP_UDPV6TRANS_NOMULTICASTSUPPORT;}int RTPUDPv6Transmitter::LeaveMulticastGroup(const RTPAddress &addr){ return ERR_RTP_UDPV6TRANS_NOMULTICASTSUPPORT;}void RTPUDPv6Transmitter::LeaveAllMulticastGroups(){}#endif // RTP_SUPPORT_IPV6MULTICASTint RTPUDPv6Transmitter::SetReceiveMode(RTPTransmitter::ReceiveMode m){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (m != receivemode) { receivemode = m; acceptignoreinfo.Clear(); } MAINMUTEX_UNLOCK return 0;}int RTPUDPv6Transmitter::AddToIgnoreList(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv6Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::IgnoreSome) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_DIFFERENTRECEIVEMODE; } const RTPIPv6Address &address = (const RTPIPv6Address &)addr; status = ProcessAddAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}int RTPUDPv6Transmitter::DeleteFromIgnoreList(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv6Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::IgnoreSome) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_DIFFERENTRECEIVEMODE; } const RTPIPv6Address &address = (const RTPIPv6Address &)addr; status = ProcessDeleteAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}void RTPUDPv6Transmitter::ClearIgnoreList(){ if (!init) return; MAINMUTEX_LOCK if (created && receivemode == RTPTransmitter::IgnoreSome) ClearAcceptIgnoreInfo(); MAINMUTEX_UNLOCK}int RTPUDPv6Transmitter::AddToAcceptList(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv6Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::AcceptSome) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_DIFFERENTRECEIVEMODE; } const RTPIPv6Address &address = (const RTPIPv6Address &)addr; status = ProcessAddAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}int RTPUDPv6Transmitter::DeleteFromAcceptList(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv6Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::AcceptSome) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_DIFFERENTRECEIVEMODE; } const RTPIPv6Address &address = (const RTPIPv6Address &)addr; status = ProcessDeleteAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}void RTPUDPv6Transmitter::ClearAcceptList(){ if (!init) return; MAINMUTEX_LOCK if (created && receivemode == RTPTransmitter::AcceptSome) ClearAcceptIgnoreInfo(); MAINMUTEX_UNLOCK}int RTPUDPv6Transmitter::SetMaximumPacketSize(size_t s) { if (!init) return ERR_RTP_UDPV6TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_NOTCREATED; } if (s > RTPUDPV6TRANS_MAXPACKSIZE) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV6TRANS_SPECIFIEDSIZETOOBIG; } maxpacksize = s; MAINMUTEX_UNLOCK return 0;}bool RTPUDPv6Transmitter::NewDataAvailable(){ if (!init) return false; MAINMUTEX_LOCK bool v; if (!created) v = false; else { if (rawpacketlist.empty()) v = false; else v = true; } MAINMUTEX_UNLOCK return v;}RTPRawPacket *RTPUDPv6Transmitter::GetNextPacket(){ if (!init) return 0; MAINMUTEX_LOCK RTPRawPacket *p; if (!created) { MAINMUTEX_UNLOCK return 0; } if (rawpacketlist.empty()) { MAINMUTEX_UNLOCK return 0; } p = *(rawpacketlist.begin()); rawpacketlist.pop_front(); MAINMUTEX_UNLOCK return p;}// Here the private functions start...#ifdef RTP_SUPPORT_IPV6MULTICASTbool RTPUDPv6Transmitter::SetMulticastTTL(uint8_t ttl){ int ttl2,status; ttl2 = (int)ttl; status = setsockopt(rtpsock,IPPROTO_IPV6,IPV6_MULTICAST_HOPS,(const char *)&ttl2,sizeof(int)); if (status != 0) return false; status = setsockopt(rtcpsock,IPPROTO_IPV6,IPV6_MULTICAST_HOPS,(const char *)&ttl2,sizeof(int)); if (status != 0) return false; return true;}#endif // RTP_SUPPORT_IPV6MULTICASTvoid RTPUDPv6Transmitter::FlushPackets(){ std::list<RTPRawPacket*>::const_iterator it; for (it = rawpacketlist.begin() ; it != rawpacketlist.end() ; ++it) RTPDelete(*it,GetMemoryManager()); rawpacketlist.clear();}int RTPUDPv6Transmitter::PollSocket(bool rtp){ RTPSOCKLENTYPE fromlen; int recvlen; char packetbuffer[RTPUDPV6TRANS_MAXPACKSIZE];#if (defined(WIN32) || defined(_WIN32_WCE)) SOCKET sock; unsigned long len;#else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -