Qt实现coturn穿透客户端,coturn服务器搭建

2023-10-26

coturn简介

Coturn集成了stun+turn协议,实现NAT检测,穿透就需要通过stun协议, NAT检测无法进行穿越时就需要通过turn服务进行流媒体的转发了,而coturn就是将两者协议进行整合并进行择优优化。

STUN 协议(Simple Traversal of UDP Through NATs) 即用 UDP简单的穿透 NAT 作为一个完整的 NAT 穿透解决 方案。

网络穿透,即 NAT 穿透, 能够让公网机器找到私网机器,并提高下载速度。穿透的本质是给一个 NAT 路由器的公网 IP 地址与端口发送报文数据,对应私网机器能够收到报文数据。

TURN,英文全称是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中继穿透NAT:STUN的中继扩展。
在这里插入图片描述

coturn服务器搭建

coturn服务通常搭建在公网环境,拥有可访问的公网IP,穿透成功可以获取客户端的公网IP和端口。
局域网也可以搭建coturn服务,但只能获取局域网的IP和端口,意义不大。
本章使用阿里云实验室搭建coturn,每次可用2个小时,做个demo实验足够了:阿里云实验室

sudo apt-get install openssl#安装Openssl
sudo apt-get install libssl-dev
openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes#生成cert和pkey证书
cd /root && openssl rand -writerand .rnd#Can't load /root/.rnd into RNG报错解决

git clone https://github.com/coturn/coturn.git#克隆源码
cd coturn
#安装依赖
sudo apt install pkg-config#ERROR: pkg-config
sudo apt install libssl-dev#ERROR: OpenSSL Crypto development libraries are not installed properly in required location
sudo apt install libevent-dev#ERROR: Libevent2 development libraries are not installed properly in required location
#编译
./configure
make 
sudo make install
which turnserver#查看是否安装成功

#配置环境
#turnadmin -a -u 用户名 -p 密码 -r 域名(给自己的域名)
#turnadmin -a -u test -p 123456 -r chuwei
/usr/local/bin#turnserver安装目录
cd /usr/local/etc#配置文件所在目录
sudo cp turnserver.conf.default turnserver.conf
sudo vim turnserver.conf
#添加如下内容
#网卡名
relay-device=eth0
#内网IP
listening-ip=172.16.1.193
listening-port=3478
#内网IP
relay-ip=172.16.1.193
tls-listening-port=5349
# 外网IP
external-ip=101.132.26.227
relay-threads=500
# 打开密码验证
lt-cred-mech
cert=/etc/turn_server_cert.pem
pkey=/etc/turn_server_pkey.pem
min-port=40000
max-port=65535
# 设置用户名和密码,创建IceServer时使用
user=admin:123456
# 外网IP绑定的域名
realm=101.132.26.227
# 服务器名称,用于OAuth认证,默认和realm相同,部分浏览器本段不设可能会引发cors错误。
#server-name=www.codeting.top
# 认证密码,和前面设置的密码保持一致
cli-password=123456

#turnserver -o -a -f -v -r chuwei#启动turnserver
turnserver -o -a -f#启动turnserver
netstat -ntpl#查看活跃端口,能看到启动的turnserver
lsof -i:3478#验证是否在监听

coturn服务验证

访问https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
输入coturn服务器IP和端口,用户名和密码,点击Add Server,再点击Gather candidatesm,可以看到已经获取了udp公网IP和端口。
使用的火狐浏览器,谷歌浏览器报701错误。
在这里插入图片描述
大致包含的内容:
本机 IP 地址
本机用于WebRTC通信的端口号
候选者类型,包括 host、srflx 和 relay
优先级
传输协议

candidate事件type字段取值分别为host、srflx、relay:
host(Host candidate):从本地网卡上获取的地址
srflx(Server reflexive candidate):STUN 返回的该客户端的地址
relay(Relay reflexive candidate)::TURN 服务器为该客户端分配的中继地址
本地的candidate与远端candidate构成的每一对都有一定的优先级,按优先级排序进行连通性检查。最后从有效的candidate组合中选择优先级最高的作为传输地址,用于建立P2P连接。

qt实现coturn穿透

qt实现coturn客户端,穿透成功返回公网IP和端口

#include "ccmainwindow.h"
#include "ui_ccmainwindow.h"

ccMainWindow::ccMainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::ccMainWindow)
{
    ui->setupUi(this);

    pUdp = new QUdpSocket(this);

    session = (chwRtcSession*)calloc(sizeof(chwRtcSession),1);
    session->context.avinfo = (chwAVInfo*)calloc(sizeof(chwAVInfo),1);
    session->context.streamConfig = (chwStreamConfig*)calloc(sizeof(chwStreamConfig),1);
    strcpy(session->context.avinfo->rtc.iceServerIP,"101.133.145.11");
    session->context.avinfo->rtc.iceStunPort=3478;
    strcpy(session->ice.server.serverIp , "101.133.145.11");//穿透服务器IP
    session->ice.server.serverPort = 3478;//穿透服务器端口
    session->context.avinfo->rtc.hasIceServer=1;
    session->context.streamConfig->localPort = 9099;

    int err = 0;
    if(session->context.avinfo->rtc.hasIceServer&&session->ice.server.stunPort==0)
    {
        err=chw_ice_request(&session->ice.server,session->context.streamConfig->localPort);
        if(err != 0)
            printf("stun request fail!");
    }
}

ccMainWindow::~ccMainWindow()
{
    delete ui;
}


void ccMainWindow::on_pushButton_initudp_clicked()
{
    pUdp->bind(QHostAddress::Any,ui->lineEdit_localport->text().toUInt());
    connect(pUdp, SIGNAL(readyRead()),this, SLOT(readPendingDatagrams()));
}

void ccMainWindow::on_pushButton_initudp_send_clicked()
{
    pUdp->writeDatagram(ui->lineEdit_sendMsg->text().toLatin1().data(),ui->lineEdit_sendMsg->text().size(),
                        QHostAddress(ui->lineEdit_remoteIP->text()),ui->lineEdit_remotePort->text().toUInt());
    pUdp->waitForBytesWritten();
}

void ccMainWindow::readPendingDatagrams()
{
    QByteArray datagram;
    while (pUdp->hasPendingDatagrams()) {

        datagram.resize(pUdp->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;

        pUdp->readDatagram(datagram.data(), datagram.size(),&sender, &senderPort);
        ui->textBrowser->append(datagram.data());
    }
}

打印输出

remoteIp=101.133.145.11,port=3478
udp server is starting,localPort=9099
stun ip=180.111.104.1,stunport=7343

NAT类型是否可以穿透

(Network Address Translation 网络 地址映射)是将 公 网地址映射为私网 地址。而能够进行映射的网络装置被称为 NAT 路由器。当我们检测到一端是端口受限锥型一端是对称型或者两端都是对称型,那肯定是无法穿越的。推荐一个NAT检测工具:NatTypeTester。
NAT类型一般分为以下4种:

  1. Full Cone NAT1 (完全圆锥型):这是最宽松的网络环境,IP和端口通常都不会受限。
  2. Address Restricted Cone NAT2 (地址限制圆锥型):相比NAT1 IP会受限,而端口不受限。
  3. Port Restricted Cone NAT3 (端口限制圆锥型):相比NAT2,NAT3 又增加了端口限制,也就是说IP、端口都会受限。
  4. Symmetric NAT4 (对称型):具有端口受限锥型的受限特性,内部地址每一次请求一个特定的外部地址,都可能会绑定到一个新的端口号。也就是请求不同的外部地址映射的端口号是可能不同的。这种类型基本上就告别 P2P 了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt实现coturn穿透客户端,coturn服务器搭建 的相关文章

随机推荐

  • 获取shell返回值

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 使用command 二 使用function 总结 前言 shell获取返回值的方法有多种 这里介绍两种 第一种是直接执行command然后获取返回值 第
  • js歌词滚动效果

    目录 效果图展示 一 素材准备 1 歌词数据data js 借鉴了网上copy下来的歌词模板 2 图片准备 设置title效果 3 音频文件准备 二 html块 拓展 标签属性 三 设置scss样式 四 逻辑js块 拓展 使用到的audio
  • 史蒂夫科恩_科特琳·科恩范围

    史蒂夫科恩 学习Android开发 Learning Android Development If you are familiar with Dagger 2 you probably know that Scope an importa
  • STM32-I2C --- 通过IO口模拟

    I2C 通过IO口模拟 1 I2C介绍 I2C两根线 一根时钟线 SCL 一根信号线 SDA 数据传输时 时钟线信号为低电平时 数据线电平才允许变化 起始和停止位控制时 时钟线信号为高电平 数据线由高向低变化为起始信号 数据线由低向高变化为
  • NOT 函数

    前言 NOT 函数是用于对参数值求反的一种 Excel 函数 当要确保一个值不等于某一特定值时 可以使用 NOT 函数 简言之 就是当参数值为 TRUE 时 NOT 函数返回的结果恰与之相反 结果为 FALSE 比如 NOT 2 2 4 由
  • stm32-看门狗(独立看门狗,窗口看门狗)

    基于野火教程的看门狗 实验器材 stm32c8t6 LED灯 按键一个 实验一 独立看门狗 1 实验原理 2 实验代码讲解 3 实验现象 实验二 窗口看门狗 1 实验原理 2 实验代码讲解 3 实验现象 在进入正题之前 我们先了解一下什么是
  • Flutter组件 - Expanded

    Row Column Flex会被Expanded撑开 充满主轴可用空间 使用方式 Row children
  • C# 获得配置文件存储目录

    在C 中 不同工程为了读取自己的配置文件 由于系统当前目录的问题 往往在不同情况下 使用不同的方法 下面对在什么时候 使用什么方法 做一个整理 一下方法很多是引用别人信息 情况1 如果是一个标准的Win独立应用 或者一个标准的WEB独立应用
  • [Ubuntu]深度学习环境安装NVIDIA-1080+CUDA9.0+cuDnn+Tensorflow-gpu-1.6.0+conda

    1 安装Miniconda wget https mirrors tuna tsinghua edu cn anaconda miniconda Miniconda 1 6 0 Linux x86 64 sh bash Miniconda
  • AngularJS2.0 开发指南

    经过前面的学习 基本了解了Angular2 0的使用 所有的Module都是一个Component 甚至一个事件响应也是一个Component 或者表单验证也可以是一个Component Angular的运作机制图 Angular2 0 A
  • 面向对象高级3-内部类&枚举&泛型

    1 内部类 回顾 之前学了类的四个成员 分别是成员变量 成员方法 代码块 构造器 现在这是第五个成员 内部类 前三个作了解 第四个重点学习 内部类的应用场景 场景 当一个类的内部 包含了一个完整的事物 且这个事物没有必要单独设计时 就可以把
  • 路由中的mata

    一 定义 meta简单来说就是路由元信息 也就是每个路由身上携带的信息 二 使用 1 面包屑 path index name index meta keepAlive true 需要缓存 title 首页 components gt imp
  • linux 一个用户进入另外一个用户的家目录

    a userb use b 用户 cd home a 只有查看权限chmod 755 home a 转载于 https blog 51cto com wsxxsl 2096507
  • Python之区块链简单记账本实现

    在上一篇 Python之区块链入门 中讲述了区块链的基础知识 并用Python实现了区块和区块链的结构 在本篇中 将基于上面的内容实现一个简单的记账本功能 记账本的功能如下 实现基本的收支记录 计算当前余额 对收支情况做简单统计分析 账单记
  • android studio 导入module作为lib使用

    android studio 导入module作为lib使用 1 将 android module导入 android project 中 2 在要作为lib导入的module 的build gradle文件中添加一行 apply plug
  • 若依前后端分离版3、用户角色权限和动态菜单

    文章目录 一 用户角色和权限 1 前端 2 后端 一 用户角色和权限 1 前端 我们通过登陆 F12进行查看发现还有getinfo和getRouters方法 我们发现若依在页面跳转的时候都会出现这两个方法 这其实就是我们在路由里边配置的东西
  • 汽车智能座椅系统

    概述 自动驾驶领域日渐成熟 将催生一些新应用场景 如休闲 娱乐 社交和健康等 传统的座椅控制系统无法满足人们新的需求 更安全 更舒适 智能化及健康化体验将成为未来智能座椅的方向 恒润凭借汽车电子技术的积累 能够提供智能汽车座椅的解决方案 为
  • 笔记

    零散个人笔记 书籍已出版 完整版 淘宝 京东 当当有售 1 tensorflow源码完整下载方法 git clone recurse submodules https github com tensorflow tensorflow git
  • 作业 从外到内:一次完整的渗透测试!作业

    9th 一 环境准备 Windows10 1709地址 WindowsServer2016 x64 修改了密码 原密码 lonelyor org UbuntuServer2004 x64 UbuntuServer1604 x64 pfsen
  • Qt实现coturn穿透客户端,coturn服务器搭建

    目录 coturn简介 coturn服务器搭建 coturn服务验证 qt实现coturn穿透 NAT类型是否可以穿透 coturn简介 Coturn集成了stun turn协议 实现NAT检测 穿透就需要通过stun协议 NAT检测无法进