jrtplib跨网络通讯NAT穿透问题解决方法

原创 2013年06月20日 01:08:48

前几篇文章讲了使用jrtplib在Android和pc端进行通讯的方法

在实际项目中,手机端和pc端一般不会在同一个子网内,两者之间联络可能要走路由器之类的NAT(网络地址转换 Network Address Translation))设备


假设服务端IP地址为 112.20.30.40,管理多个摄像头

服务端建立一个serversocket绑定固定的端口如8000,用来接收客户端的请求

对于不同的摄像头分别建立不同的rtpsession,用来发送视频流到客户端,比如“camera1”对应的rtp端口为18000

当客户端请求此摄像头数据时,便将客户端的ip和rtp端口加到rtpsession的destination中(观察者模式),然后发送视频数据


客户端(IP假设为192.168.1.100), 建立rtp对象用来接收服务端发送的视频流,端口设置为9000,

客户端连接到的路由器IP地址为192.168.1.1,对应的外网地址为172.20.30.200,


但NAT的行为模式是,只能从内部开门,也就是说,服务端如果想通过18000端口往客户端的9000端口发数据的话

这个数据在路由器上就直接被抛弃掉了,不会转发到客户端,解决方法很简单,客户端在接收数据之前先往服务端的18000端口随便发个数据,

这样门就打开了,服务端的数据就可以进来了(专业一点的术语叫UDP hole punching,黑客搞远程控制必备技能啊)。


具体到代码中的话,如下:

int rtpsock = ((RTPUDPv4TransmissionInfo *)m_pRTPSessionVideo->GetTransmissionInfo())->GetRTPSocket();
		if (rtpsock != -1) {
			sockaddr_in skAddr;
			unsigned long destAddr = inet_addr("112.20.30.40");
			memcpy(&skAddr.sin_addr, &destAddr, sizeof(destAddr));
			skAddr.sin_port = htons(18000);
			skAddr.sin_family = AF_INET;

			status = connect(rtpsock, (sockaddr *)&skAddr, sizeof(skAddr));
			LOGI("status is %d", status);
			int sendcount = send(rtpsock, (void *)"test", sizeof("test"), 0);
			LOGI("rtpsock is %d, send data %d", rtpsock,sendcount);
		}
		m_pRTPSessionVideo->BeginDataAccess();


这个里面没做读写检查,不过无所谓了,已经能用了


参考文档: 

jrtplib-2.9 校园NAT冲突解决

基于jrtplib的NAT穿透

4 基于jrtplib的NAT穿透 4.1 NAT穿透的基础只是 有关于NAT穿透的基础知识4.2 rtp/rtcp传输涉及到的NAT穿透     rtp/rtcp传输数据的时候,需要两个端口支持。即...

利用Jrtplib转发rtp包

最近有接触都GB28181,涉及到ps格式的rtp包转发,就是摄像机推流到流媒体服务器,流媒体服务器再利用jrtplib库将流转发给客户端,下面给出单路转发的代码。 RTPSession ses...

开源RTP/RTCP传输库jrtplib与live555优缺点简单总结笔记

个人学习笔记
  • sl_1987
  • sl_1987
  • 2016年12月13日 10:37
  • 1718

使用jrtplib(RTP)传输H.264视频文件(2)

本文所有内容均为原创,转载请注明出处! 上一篇我们介绍了RTP协议的一些基本知识,下面我们介绍如何使用jrtplib这个库传输H264编码。 JRTP传输: 好了,下面是我写的使用JRTP...

Linux下几种RTP协议实现的比较和JRTPLIB编程讲解

转载http://blog.chinaunix.net/uid-23023613-id-88220.html 流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不...

解决外网与内网或内网之间的通信,NAT穿透

在网络编码中会发现程序在局域网中是可以适用的,但是在外网与内网之间和内网与内网之间就不可行。 问题就在于NAT。首先介绍下NAT。  NAT的作用NAT(Network Address Trans...

jrtplib 开发学习

这是JRTPLIB@Conference系列的第二部《基本例程分析》本系列的主要工作是实现一个基于JRTPLIB的,建立在RTP组播基础上的多媒体视频会议系统。这只是一个实验系统,用于学习JRTPLI...

补充上一篇(JRTPLIB在arm和pc间收不到数据包的问题)

今天花了一天的时间实现了jrtp到pxa270的移植,下面把其中遇到的问题及相应的解决方法说一下。其实jrtp的arm交叉编译很简单,具体步骤可以如下:cd jrtp所在目录 ——> ./config...
  • floatdu
  • floatdu
  • 2008年06月13日 21:45
  • 1196

五大NAT穿透方法,解决内网问题

许多程序在局域网中是可以适用的,但是在外网与内网之间和内网与内网之间就不可行。问题就在于NAT,本文就将介绍下5大NAT穿透方法,解决内外网的互访问题。1.完全锥形(Full Cone)NAT处于不同...
  • oray2013
  • oray2013
  • 2016年07月18日 11:41
  • 12551

网络连接问题解决方法软件

  • 2011年10月11日 07:05
  • 121KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jrtplib跨网络通讯NAT穿透问题解决方法
举报原因:
原因补充:

(最多只允许输入30个字)