开发者社区> double2li> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 前几篇文章讲了使用jrtplib在Android和pc端进行通讯的方法 在实际项目中,手机端和pc端一般不会在同一个子网内,两者之间联络可能要走路由器之类的NAT(网络地址转换 Network Address Translation))设备   假设服务端IP地址为 112.
+关注继续查看

前几篇文章讲了使用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,黑客搞远程控制必备技能啊)。

 

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

 

[cpp] view plaincopy
 
  1. int rtpsock = ((RTPUDPv4TransmissionInfo *)m_pRTPSessionVideo->GetTransmissionInfo())->GetRTPSocket();  
  2.         if (rtpsock != -1) {  
  3.             sockaddr_in skAddr;  
  4.             unsigned long destAddr = inet_addr("112.20.30.40");  
  5.             memcpy(&skAddr.sin_addr, &destAddr, sizeof(destAddr));  
  6.             skAddr.sin_port = htons(18000);  
  7.             skAddr.sin_family = AF_INET;  
  8.   
  9.             status = connect(rtpsock, (sockaddr *)&skAddr, sizeof(skAddr));  
  10.             LOGI("status is %d", status);  
  11.             int sendcount = send(rtpsock, (void *)"test", sizeof("test"), 0);  
  12.             LOGI("rtpsock is %d, send data %d", rtpsock,sendcount);  
  13.         }  
  14.         m_pRTPSessionVideo->BeginDataAccess();  



 

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

 

参考文档: 

jrtplib-2.9 校园NAT冲突解决

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用sls logtail的netping功能探测网络质量
随着多云,多region业务部署越来越普遍,对于复杂的网络链路而言,延迟/丢包成为客户关注的一个重点。 sls的logtail作为可观测性的组件,目前集成了icmping和tcping的功能,帮助业务快速发现网络侧的延迟和丢包问题,提升网络可观察性。
46 0
python-matplotlib库绘制饼形图专题(从一般饼状图到内嵌环形图)
python-matplotlib库绘制饼形图专题(从一般饼状图到内嵌环形图)
54 0
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
126 0
greenplum 4.1 版本及老版本如何使用读写外部表+管道实现gptransfer同步功能
greenplum 4.1 版本及老版本如何使用读写外部表+管道实现gptransfer同步功能
693 0
java spring cloud版b2b2c社交电商--服务网关 Spring Cloud GateWay 入门
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
1197 0
最大限度地降低多线程 C# 代码的复杂性
最大限度地降低多线程 C# 代码的复杂性分支或多线程编程是编程时最难最对的事情之一。这是由于它们的并行性质所致,即要求采用与使用单线程的线性编程完全不同的思维模式。对于这个问题,恰当类比就是抛接杂耍表演者,必须在空中抛接多个球,而不要让它们相互干扰。
1455 0
网络流问题,及其代码
之前的一个学习一直在看图像分割的部分内容,基于交互的图像分割基本都是用图割的算法,全自动的图割算法也有最小生成树的改进算法。 现在想写点东西,从算法 的最本质问题,图论中的网络流问题开始,做个总结,也算是对知识的一个回顾。
882 0
virtualbox 3.0.6安装时/etc/init.d/vboxdrv 错误的解决方法
在CentOS5下,首先下载virtualBox3.0.6,这是稳定版:http://www.virtualbox.org/wiki/Downloads下,选择For Linux Host,下载的文件名为:VirtualBox-3.0.6_52128_rhel5-1.i386.rpm然后安装->无论如何都安装。
886 0
+关注
double2li
一个在IT行业摸爬滚打的老司机
2869
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载