⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtpudpv6transmitter.cpp

📁 最新的jrtplib
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -