www.pudn.com > jrtplibex1.rar > example1.cpp


/* 
   Here's a small IPv4 example: it asks for a portbase and a destination and  
   starts sending packets to that destination. 
   这个IPv4版的例子:它要求portbase(本地端口)与destination (目的端口)然后发送消息 
   同时还监听消息。 
  
   例子测试一: 
   启动一个运行实例,本地地址与目标地址用同一个端口8888 
   例子测试二: 
   启动两个运行实例,本地地址与目标地址用不同的端口(它要求是偶数端口号) 
   两个实例互发 
   例子的中文解释都由hanyuejun添加,有任何疑问请发hanyuejun2006@163.com 
*/ 
 
#include "rtpsession.h" 
#include "rtppacket.h" 
#include "rtpudpv4transmitter.h" 
#include "rtpipv4address.h" 
#include "rtpsessionparams.h" 
#include "rtperrors.h" 
#ifndef WIN32 
	#include  
	#include  
#else 
	#include  
#endif // WIN32 
#include  
#include  
#include  
#include  
 
// 
// This function checks if there was a RTP error. If so, it displays an error 
// message and exists. 
// 
 
void checkerror(int rtperr) 
{ 
	if (rtperr < 0) 
	{ 
		std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl; 
		exit(-1); 
	} 
} 
 
// 
// The main routine 
// 
 
int main(void) 
{ 
#ifdef WIN32 
	WSADATA dat; 
	WSAStartup(MAKEWORD(2,2),&dat); 
#endif // WIN32 
	 
	RTPSession sess; 
	uint16_t portbase,destport;//portbase本地端口 destport目标端口 
	uint32_t destip;//目标地址的ip地址 
	std::string ipstr; 
	int status,i,num; 
	 
 
        // First, we'll ask for the necessary information 
	std::cout << "Example1" << std::endl;	 
	std::cout << "Enter local portbase:" << std::endl; 
	std::cin >> portbase; 
	std::cout << std::endl; 
	 
	std::cout << "Enter the destination IP address" << std::endl; 
	std::cin >> ipstr; 
	destip = inet_addr(ipstr.c_str()); 
	if (destip == INADDR_NONE) 
	{ 
		std::cerr << "Bad IP address specified" << std::endl; 
		return -1; 
	} 
	 
	// The inet_addr function returns a value in network byte order, but 
	// we need the IP address in host byte order, so we use a call to 
	// ntohl 
	//转换 
	destip = ntohl(destip); 
	 
	std::cout << "Enter the destination port" << std::endl; 
	std::cin >> destport; 
	 
	std::cout << std::endl; 
	std::cout << "Number of packets you wish to be sent:" << std::endl; 
	std::cin >> num; 
	 
	// Now, we'll create a RTP session, set the destination, send some 
	// packets and poll for incoming data. 
	 
	RTPUDPv4TransmissionParams transparams; 
	RTPSessionParams sessparams; 
	 
	// IMPORTANT: The local timestamp unit MUST be set, otherwise 
	//            RTCP Sender Report info will be calculated wrong 
	// In this case, we'll be sending 10 samples each second, so we'll 
	// put the timestamp unit to (1.0/10.0) 
	sessparams.SetOwnTimestampUnit(1.0/10.0);		 
	 
	sessparams.SetAcceptOwnPackets(true); 
	transparams.SetPortbase(portbase); 
	//创建一个session 
	status = sess.Create(sessparams,&transparams);	 
	checkerror(status); 
	//目标地址 
	RTPIPv4Address addr(destip,destport); 
	//添加地址 
	status = sess.AddDestination(addr); 
	checkerror(status); 
	//char tmp[11] = {0}; 
		  
	for (i = 1 ; i <= num ; i++) 
	{ 
		printf("\nSending packet %d/%d\n",i,num); 
		 
		// send the packet 
		status = sess.SendPacket((void *)"1234567890",10,0,false,10); 
		checkerror(status); 
		//加锁 
		sess.BeginDataAccess(); 
		 
		// check incoming packets2 
		if (sess.GotoFirstSourceWithData()) 
		{ 
			do 
			{ 
				RTPPacket *pack; 
				 
				while ((pack = sess.GetNextPacket()) != NULL) 
				{ 
					// You can examine the data here 
					printf("Got packet !\n"); 
					std::cout << pack<GetPacketData()<GetPacketLength()<GetPayloadData()<GetPayloadLength()<