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穿透问题解决方法

前几篇文章讲了使用jrtplib在Android和pc端进行通讯的方法 在实际项目中,手机端和pc端一般不会在同一个子网内,两者之间联络可能要走路由器之类的NAT(网络地址转换 Network ...
  • chinabinlang
  • chinabinlang
  • 2014年10月24日 09:13
  • 633

基于jrtplib的NAT穿透

4 基于jrtplib的NAT穿透 4.1 NAT穿透的基础只是 有关于NAT穿透的基础知识4.2 rtp/rtcp传输涉及到的NAT穿透     rtp/rtcp传输数据的时候,需要两个端口支持。即...
  • yanbdsky
  • yanbdsky
  • 2010年08月06日 10:56
  • 3505

windows 7上使用android-ndk-r8e 编译jrtplib 3.9.1

在查了很多资料后, 发现windows 平台上用ndk编译jrtplib的资料真是不好找 github上的一个哥们做的很有参考价值:https://github.com/jimjh/JRTPLib...
  • NickWar
  • NickWar
  • 2013年05月22日 21:52
  • 7063

基于jrtplib的NAT穿透

4 基于jrtplib的NAT穿透   4.1 NAT穿透的基础只是   有关于NAT穿透的基础知识 4.2 rtp/rtcp传输涉及到的NAT穿透  ...
  • htjx99
  • htjx99
  • 2013年10月31日 12:16
  • 979

jrtplib中组播代码发送端和接收端的实现

文章里面主要是把发送端课接收端代码的实现提了出来,和重要函数里的源码贴出来辅助学习,看到网上有人说好久做不出来,建议看看对应加入组播的源码,注意细节,话不多说,代码直接贴出来,各位朋友有意见多多交流。...
  • u010289908
  • u010289908
  • 2016年05月10日 10:22
  • 1730

Android调用Jlibrtp库实现RTP发送数据

如果你也在Android端做RTP发送数据的话,通过网上查找资料,相信你不难发现,在使用RTP/RTCP协议发送数据是有现成的库进行调用的,Jlibrtp这个库就是Java实现的,但是这个库是没有说明...
  • EricFantastic
  • EricFantastic
  • 2015年10月23日 14:31
  • 5758

Jthread1.3.1 Jrtplib3.9.1跨平台交叉编译之Android(一)

折腾two days终于编译OK,主要参考http://blog.csdn.net/nickwar/article/details/9133399
  • macandroid
  • macandroid
  • 2014年07月19日 23:44
  • 2412

android建立NDK项目调用jrtplib与pc机进行通讯

按上两次的文章,编译好windows 平台(http://blog.csdn.net/nickwar/article/details/8962344)和android平台上使用的jrtplib库(ht...
  • NickWar
  • NickWar
  • 2013年06月10日 01:22
  • 7351

Android下编译jrtplib

  • 2013年03月20日 23:56
  • 345KB
  • 下载

jrtplib移植到安卓

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

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