如何使用JRtpLib3.5.0库中的函数和类对象和让JRTPLIB 发送/接收数据时使用同一个端口收藏
来源:互联网 发布:mac 目标磁盘模式 编辑:程序博客网 时间:2024/05/22 00:41
本文介绍了如何使用JRtpLib3.5.0库中的函数和类对象。
1、RTP
1.1、初始化
生成RTPSession对象:RTPSessionSession
初始化RTPSessio:Session.Create(RTPSessionParams,RTPUDPv4TransmissionPara
RTPUDPv4TransmissionPara
transparams . SetPortbase ( 8 0 0 0 ) ;
注意:Create一个重载函数,有多种形式。而第二个参数的形式根据传输协议和IP地址版本来定。
Session对象创建示例:
RTPSession session;
IntStatus = session.Create(SessionParams,ransparams);
if(Status < 0)
{
}
Create调用成功后,下面就要增加目的地址,使用RTPSession成员函数AddDestination,如果使用IPV4地址则其参数类型为RTPIPV4Address。程序示例:
u_i n t 8 _t
RTPIPv4Address addr ( l o c a l i p , 9 0 0 0 ) ;
status = session.AddDestination ( addr ) ;
if (status < 0)
{
}
2、数据发送
初始化后,接下来可以调用
int SendPacket(void *data,int len,unsigned char pt,boolmark,unsigned long timestampinc);
其中第一个参数是待发送的数据缓冲区地址,第二个参数是待发送数据的长度,后面依次是
对于同一个
3、数据接收
接收实时流媒体数据,通过调用
sess.BeginDataAccess();
if(sess.GotoFirstSourceWithData())
{
}
sess.EndDataAccess();
RTPTime(10.0);//释放资源最多等待十秒
sess.BYEDestroy(delay, Time' s up,9);//释放占有的
1.开始
1.1
为了使用这个库,你首先需要构建一个session,类型为RTPSession,然后调用create()成员函数创建,它带有一个参数,是端口号,例子:
#i nclude"rtpsession.h"
1.2
#include<stdio.h>
1.3
sess.SetTimestampUnit(1.0/44100.0);
2
2.1
unsigned long addr =ntohl(inet_addr("127.0.0.1"));
既是将包发送到本机的5000端口上。Ntohl是将网络字节序转换为长整形。
2.2
如(其中的一种):
参数1为发送的数据,2为数据长度,3为负载类型,4为标志符,5为时间戳增量。
如果你所要发送的数据的负载类型,标识符和时间戳增量是相同的,你可以使用另一种定义,
但是使用之前你必须为这些参数设置默认得值,课题通过调用成员函数SetDefaultPayloadType,SetDefaultMark
sess.SetDefaultPayloadType(0);
sess.SendPacket("1234567890",10);
2.3
首先你需要调用函数PollData(),这个函数是处理接受到的RTP和RTCP包,他会处理所有到达端口的包,因此你可以重复调用函数GotoFirstSource()和
if(sess.GotoFirstSourceWithData())
2。4
2。5
2。5。1
2。5。2
2。6
3
3。1
通过调用
sess.SetLocalEMail("xiaowp@linuxgam.com",19);
3。2
4
Youcan specify handlers for certain types of events. For example: whena
source joins the session, when a source times out, whenSSRC identifiers
collide, ...
atthe reference manual (manual.txt)
这两周在做MPEG4视频传输时,想借助STUN协议穿透内网实现P2P,但是却发现JRTPLIB在发送数据和接收数据时使用的不是同一个PORT,这就可能导致无法穿透内网,我的想法大致如下:
假设A的RTP使用端口1000,则起对应的RTCP端口必定为1001,在初始化RTP信令后,JRTPLIB会随机使用另外一个端口3333来发送RTP数据,1000端口是用来接收RTP数据的,1001接收RTCP包。
假设B的RTP使用端口2000,则起对应的RTCP端口必定为2001,在初始化RTP信令后,JRTPLIB会随机使用另外一个端口4444来发送RTP数据,2000端口是用来接收RTP数据的,2001接收RTCP包。
又假设A,B均在NAT后,经NAT转换后,利用STUN协议,A开始向B发包,B也向A发包,由于NAT的存在,B发给A的包并不是A发出去的目的地址端口发过来的,目的端口只受数据不发数据(A将数据包发给B的RTP接收端口后,NAT A就只接收B的这个RTP端口发过来的数据,对于B用来发送数据的端口而言,是不请自到的),因此NAT A会丢弃B发过来的包,同理NAT B也会丢弃A发过来的包。
这样一来,为了能UDP PUNCH HOLE,A,B就必须再往对方用来发送数据的端口打一个洞,以便欺骗NAT,但UDP是不可靠的,而NAT影射也有时间限制,要保证NAT的影射关系不变就的定时打洞给对方,个人感觉这种方法不是很好。
经过查看JRTPLIB源码,它的Create()函数里是这么写的
addr.sin_family = AF_INET;
addr.sin_port = htons(0); //就是这里使用随机端口
addr.sin_addr.s_addr = htonl(0);
if (bind(sendsock,(struct sockaddr*)&addr,sizeof(struct sockaddr)) != 0)
{
return ERR_RTP_CANTBINDSOCKET;
}
socklen = sizeof(struct sockaddr_in);
if (getsockname(sendsock,(struct sockaddr*)&addr,&socklen) != 0)
{
return ERR_RTP_CANTGETSOCKETPORT;
}
sendport = ntohs(addr.sin_port);//这里是发送数据的端口
很明显,它用的是随机端口,BIND成功后再查询这个端口的,在RTPSession里用于获取发送端口的函数GetSendPort()直接返回了这个sendport,如下:
int GetSendPort()
{
return sendport;
}
为此,我只好修改JRTPLIB V2.9的源码了,在rtpconnection.cpp里,将发送数据的sendto语句里的socket都换成rtpsocket,让他使用bind在rtp端口的socket即可,同时删除sendsocket,并将GetSendPort()直接返回portbase。经过修改,发送/接收数据时就只有RTP和RTCP端口了,而且收发数据都通过RTP绑定的那个端口进行。
- 如何使用JRtpLib3.5.0库中的函数和类对象和让JRTPLIB 发送/接收数据时使用同一个端口收藏
- 让JRTPLIB 发送/接收数据时使用同一个端口
- 使用Socket类接收和发送数据
- 使用Socket类接收和发送数据
- BizTalk:使用ExplorerOM创建MSMQ发送端口和接收端口
- 使用UDPClient发送和接收数据
- 使用UDP协议发送和接收数据
- 使用UDP协议发送和接收数据
- 使用UDP协议发送和接收数据
- springMVC如何接收和发送json数据对象
- Ajax 使用XMLHttpRequest对象发送数据和接收处理XML源代码
- apache和tomcat同时使用同一个端口
- BizTalk: 使用 WMI 创建WCF-NetMsmq 接收端口和发送端口
- BizTalk:使用 ExplorerOM 创建 FILE 类型的发送端口和接收端口
- C#使用Socket发送和接收TCP数据示例
- C#使用UdpClient发送和接收UDP数据示例
- DBus如何使用原始DBus库传送和接收数据
- DBus如何使用原始DBus库传送和接收数据
- 4Sum
- 递归实现判断数组是否递增
- jquery中prop()方法和attr()方法的区别浅析
- C++primer 5.3位操作符
- curl 使用详解
- 如何使用JRtpLib3.5.0库中的函数和类对象和让JRTPLIB 发送/接收数据时使用同一个端口收藏
- java腾讯地图与百度地图坐标转换
- mySQL数据库Sql语句执行效率检查--Explain命令
- rest基于web服务
- 学习context后自定义虚线圆角按钮,举一反三,其他控件也可修改
- oracle数据泵过程
- 【图像加密】图像处理之Logistic混沌序列加密
- 非线性振子
- 【内网渗透】域渗透技巧 => 第三方工具API