5.8.webrtc事件处理基础知识
在之前的课程中呢,我向你介绍了大量web rtc线程相关内容,今天呢,我们来看一下线程事件处理的基本知识。首先,我们要清楚啊,不同的平台处理事件的API是不一样的,这就如同我们当时创建线程是类似的,对吧?那对于Windows系统来说呢,它提供了wsa even的select以及完全端口处理事件。
当然,完全端口的方式会更高效一些,但对于web rtc来说呢,它选择的是wsa even的select,所以对于这节课来说呢,我会向你介绍大量ws a开头的。相关API那了解了这些API之后呢,我们再来看相关代码的时候就会游刃有余了,
Linux系统下呢,它采用的是一炮儿。或者是select对吧?如果有一泡儿就使用一泡儿,没有一泡儿就选用select。mac也是类似的。mac是kk没有kk的时候呢,就使用select,因为select呢是跨平台的。
那下面呢,我们再来看一下web rtc下的事件处理类,对于web rtc来说呢,包括了两个事件处理类,第一个呢是non socket server。所谓non socket server就是。处理无socket事件的事件处理类。与之对应的呢,是physical socket server就是处理有socket事件的事件处理类。那我们在使用这两个类的时候啊,一个区分点就是是否处理socket事件。那根据这个呢,我们来选择是non socket server还是physical socket server,
实际我们去看peer connection clan的相关代码的时候,你会发现。那对于网络线程来说,它是通过physical socket server来创建的,而对于。这个工作线程来说,它由于不需要处理socket事件,所以它选择的是non socket server,对吧?
那对于WINDOWS下呢,实际也有两种不同的事件,那第一种呢,我称为普通事件,就是通过create event来创建的事件,那通过这个API呢,我们可以创建出一个句柄。那拿到这个句柄之后,我们就可以做事件处理了。
还有一种呢,是异步IO事件。那这种呢,是通过wsa create event来创建的,对于这种事件,我们是可以与socket进行绑定的。而对于普通事件来说呢,它是无法与socket进行绑定的。
这是它们之间的一个最主要的区别。所以对于y八七c来说,它在实现physical socket server的时候呢,就使用的wsa create event这种类型的事件。
而non socket server使用的是create event这个API来创建的事件,这个我们要清楚。(webrtc调用windows的接口)
好,那下面呢?我们就来看看non socket server,它是如何使用事件的?首先呢,我们在使用事件之前。都要通过create event来创建一个事件句柄,那这个事件句柄之后呢?我们可以调用wait for single object。来等待事件。那这时候呢,这个线程就处于睡眠状态了,
对吧?直到有事件触发的时候,它才会继续执行。好,对于其他线程来说呢,它就可以调用来触发事件,当事件触发之后,等待线程会被唤醒。这是它的一个基本的逻辑,就是创建事件,等待事件,发送事件。OK,那我们来对create event这个API做一下详细介绍。对于这个API来说呢,
它返回值是一个句柄,它有四个参数,
第一个参数呢是事件属性。一般我们设成down就OK了,也就是采用默认的事件属性好,
第二个比较重要啊,就是是否?手工复位,如果我们这个参数设置成true呢,就是每次我们触发完事件之后呢,都要重新给它调一下reset event进行复位。通常情况下,我们这块儿都设成force,让它自动复位,也就是说我们事件触发完了之后,
这个event呢,可以重新再开始触发信号,这就是第二个参数,它的含义。
那第三个参数呢,就是初始状态,当它为处的时候就说明事件正在触发中,在一般情况下,我们不使的时候,都给它生成false
这样我们才可以使用set event来触发事件,把等待线程唤起,所以force才是我们经常使用的这个参数。
好,最后一个呢,就是我们创建event的时候,这个event是匿名的还是有名的?通常情况下,我们都创建匿名事件,就能满足我们的需求了。OK好,
第二个API呢是wait for single object,这个API也非常关键,它有两个参数。第一个参数呢,就是我们前面通过create event创建的handle。那第二个参数呢?就是我们等待的时间,如果我们的等待线程想一直等待,直到事件发生为止。
那你需要把这个参数设成infinite,如果你想等待一段时间,如果没有收到信号。我就结束这个等待。那你就可以在这儿设一个毫秒时间,对吧?比如20毫秒,我就等待结束,这是它第二个参数。
那对于这个函数的返回值呢,它主要有三个,第一个呢就是事件已经到达,会返回wait object 0。如果超时了,是wait time out,
如果失败了,是wait field,那当出现失败的情况下呢?我们可以通过get last error来获取错误的信息,到底是什么导致了这个函数失败了,对吧?好,这是non socket server使用的API,
接下来呢,我们再来看看physical socket server使用了哪些API?那它使用的API就稍微多一些。
第一个呢是wsa create event。同理,它也是创建事件可以处理的事件好。
第二个呢是wsa wait for multiple event。那这个事件呢?与wait single object是类似的,只不过它是可以等待多个事件的发生。而对于wait single object呢,它只能等待一个事件的发生。这是它们之间的一个主要区别,
第三个是wsa set event触发事件,这很好理解。第四个是wsa reset event,对于ws a相关的事件来说呢,它必须使用reset来重置事件。这是与我们前面介绍的通过create event创建的事件的最大不同,因为对于create event创建的事件来说呢。它既可以手动复位,也可以自动复位。
而对于wsa create event创建的事件呢?必须通过手工复位,也就主动调用reset even的这个函数来进行复位。好以上呢是。非常重要的四个API对吧?
那接下来呢?我们再看看与socket相关的这个API。那第一个与socket相关的API呢,是wsa even的select。那它的作用呢?是将socket与某个事件进行绑定。那我们需要注意啊,这里进行绑定的时候是可以多个socket绑定到同一个事件里,也就是说当这个事件发生的时候。我们要枚举每一个socket,
看到底是哪个socket发生的事件,因此呢,它提供了第二个就是ws a。enumerate network events,那这个API呢就是当事件发生的时候要判断具体是哪个socket产生的。那这两个API非常关键。
对于我们处理socket事件,那下面呢,我们就来看看几个重要API的参数。第一个呢是wsa wait for multiple events,对于这个API来说呢,
它包含的参数稍微多一些,我们一项一项来看啊。第一个呢c疑问词,它代表的是我目前要监听的事件的个数是多少?
那这个数从哪来的呢?实际就从第二个参数那第二个参数呢?是监听事件的数组。这数组中有几个事件,这儿呢就填几,比如数组中有两个,这儿就填二有三个,这儿就填三。
对吧,所以这两个参数呢,关系非常密切,好第三个参数是vito什么意思呢?就是当它为真的时候。代表的是等待所有事件都发生的时候。才会唤醒线程,
那如果为FALSE呢?是只要这些事件中有一个事件触发了。那就会将这个线程换起。对,这是它们的一个主要区别。一般情况下呢,我们都会将这个参数设成,也就是说,当有一个事件触发之后。我们就将这个线程换起好,
再接下来呢,是time out,如果time out设置成负一,就永远等待,直到有事件发生,
对吧?如果是一个具体值呢,就等待具体的时间,如果在这期间没有事件发生,它就超时了,超时退出这个等待唤起线程。那最后一个参数呢?我们设成就OK了,这个意义不大。
那第二个PR是wsa events elect对于这个API来说呢,它就是将socket与事件做一个绑定,对吧?所以第一个参数是我们要监听的socket,那第二个参数呢?就是要绑定的事件,
也就是socket要与哪个事件进行绑定?所以这块呢,我们添一个wsa event类型的事件。最后一个参数是我们对哪些事件感兴趣?你是对socket的读事件感兴趣还是写事件感兴趣?还是连接事件感兴趣?等等。一系列的。那一般情况下,我们会将socket它相关的事件都进行置位,也就是读写连接。都进行监听,每个来了之后,我们进行相应的处理。好再下来是wsa enumerate network events。
这个API与刚才我们介绍的是类似的。它也有三个参数,第一个参数呢是socket,第二个参数呢是事件,也就是说当我们调这个函数之后。它就会把触发这个事件的所有的socket进行一次遍历。那遍历之后呢,就会拿到一个结果,也就是network events,这个结果在这个结果中。会输出到底是否有事件触发?如果有的话,说明这个socket触发了事件,如果没有的话,说明不是这个socket触发的事件。
这也非常好理解好,那除了我们刚才介绍这些内容之外呢,对于physical socket server来说。它有两种事件源,那第一种事件源呢,就是我们刚才介绍的socket的事件源,当socket读写或者连接的时候呢,都会触发事件。那第二种事件源呢,就是普通事件。那这种实验就是wsa event这种类型的,或者是对于posix平台来说,它使用pap也就是管道。来触发普通事件,那这种普通事件呢?
主要用于我们线程的同步,那后边呢?我们在看代码的时候,你就会对于这一块知识呢?有一个更深的了解。现在我们只要知道,对于physical socket server来说,它不仅仅可以处理socket事件,还可以处理普通事件。
好,现在呢?我们来对这节课做一下小结,首先呢,我们要知道web rtc下有两个事件处理类,一个是physical socket server,一个是non socket server。它们的最大区别就是一个处理socket事件,一个是不处理socket事件,对吧?
那另外呢,我们要知道对于Windows系统下它的事件呢,包括两种,一种是wsa even的事件,一种是普通的even的事件。对于now socket server来说,它使用的就是普通的event,而对于physical socket server,它使用的是ws a开头的event。
好,第三点就是我们介绍了几个重要的API。像wait single object wait multiple event event select等等这些API我们今天都做了详细介绍对吧?
实际通过我的介绍呢,你应该也了解这些API,其实都不复杂,但如果你对它不了解的话,我们直接看web rtc代码。就很容易让你晕头转向。因为它的参数比较多,如果你还不知道每个参数的含义是什么,那读这个代码就非常费劲了。
通过这次介绍的基础知识之后呢,我们再看web rtc相关代码的时候,你会觉得非常清晰了,那我们今天的课呢,就到这里有任何的问题,
你可以到讨论区或者是QQ群里去给我留言。我在那里呢,给你做相应解答好,谢谢。
相关文章:

5.8.webrtc事件处理基础知识
在之前的课程中呢,我向你介绍了大量web rtc线程相关内容,今天呢,我们来看一下线程事件处理的基本知识。首先,我们要清楚啊,不同的平台处理事件的API是不一样的,这就如同我们当时创建线程是类似的࿰…...

无人机甚高频无线电中继通讯U-ATC118
简介 甚高频无线电中继通讯系统使用经过适航认证的机载电台连接数字网络传输模块,通过网络远程控制无缝实现无人机操作员与塔台直接语音通话。无人机操作员可以从地面控制站远程操作机载电台进行频率切换、静噪开关、PTT按钮,电台虚拟面板与真实面板布局…...

基于5G边缘网关的储能在线监测方案
近年以来,光伏、风力、水力发电等产业发展迅速,新能源在电力市场的占比持续增加,已经成为电力系统的重要组成部分。但由于光伏、风力、水力等发电方式存在天然的波动性,因此也需要配套储能、蓄能系统,保障新能源运行和…...
软件机器人助力基层网点实现存款数据自动化处理
银行基层网点需要及时了解存款变动情况,以便能够做出相应的安排和决策。过去,各级机构经办人员需要多次登录员工渠道系统,在不同的时间点查询并下载本级及下属机构的实时科目余额表,然后通过人工加工,才能得到存款新增…...

Win10怎么关闭自动更新?简单4招为你解决烦恼!
“买了一部win10的电脑,每次电脑自动更新都会导致我一些文件丢失或者系统错误。怎么才能关闭win10自动更新的功能呢?” Win10自动更新有时候会很影响我们使用电脑。在目前电脑用户中,使用win10系统的用户占大多数。因此很多朋友都会反映win10…...

【AWS】安装配置适用于 Eclipse 的 AWS 工具包
目录 0.环境 1.步骤 1)安装Eclipse 2)安装AWS工具包 ① 在这个路径下点开安装软件的界面 ② 点击【Add】打开添加窗口 ③ 输入aws的工具包地址 ④ 勾选需要的工具,点击【Next】 ⑤ 将要安装的工具,点击【Next】 ⑥ 选择接受…...
vue页面在table字段后加单位
<el-table-column label"售价" align"center" width"120"><template slot-scope"scope">{{ ${scope.row.price.toFixed(2)} 元 }}</template> </el-table-column><el-table-column label"金重" …...

RK3588平台开发系列讲解(AI 篇)RKNN-Toolkit2 模型的加载
文章目录 一、Caffe模型加载接口二、TensorFlow模型加载接口三、TensorFlowLite模型加载接口四、ONNX模型加载五、ONNX模型加载六、PyTorch模型加载接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 RKNN-Toolkit2 目前支持 Caffe、TensorFlow、TensorFlowLite、ONN…...

Nexus2迁移升级到Nexus3
与 Nexus 2.x 相比,Nexus 3.x 为我们提供了更多实用的新特性。SonaType 官方建议我们,使用最新版本 Nexus 2.x 升级到最新版本 Nexus 3.x,并在 Nexus 升级兼容性 一文中为我们提供了各个版本 Nexus 升级到最新版本 Nexus 3.x 的流程ÿ…...

在线OJ平台项目
一、项目源码 Online_Judge yblhlk/Linux课程 - 码云 - 开源中国 (gitee.com) 二、所用技术与开发环境 1.所用技术: MVC架构模式 (模型-视图-控制器) 负载均衡系统设计 多进程、多线程编程 C面向对象编程 & C 11 & STL 标准库 C Boost 准标…...

go语言kafka入门
消息队列:一种基于异步通信的解耦机制,用于在应用程序或系统组件之间传递消息和数据 消息队列相关概念: 生产者(Producer):生成并发送消息到消息队列中的应用程序或系统组件。 消费者(Consumer&…...

自定义拖拽功能,上下拖拽改变盒子高度
核心在于监听鼠标的move来改变div的高度,抽成了组件 <template><div ref"container" class"drag"><z-tooltip v-if"isShowIcon" effect"dark" content"格式化" placement"top-start"&…...
JavaScript Es6_4笔记
JavaScript 进阶 文章目录 JavaScript 进阶深浅拷贝浅拷贝深拷贝递归实现深拷贝js库lodash里面cloneDeep内部实现了深拷贝JSON序列化 异常处理throwtry ... catchdebugger 处理this普通函数箭头函数改变this指向callapplybind 防抖节流 深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只…...

Python“牵手”易贝(Ebay)商品列表数据,关键词搜索ebayAPI接口数据,ebayAPI接口申请指南
Ebay平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范, EbayAPI接口是指通过编程的方式,让开发者能够通过HTTP协议直接访问Ebay平台的数据,包括商品信息、店铺信息、物流信息等,从而实现Ebay平…...

C语言:选择+编程(每日一练Day8)
目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:字符个数统计 思路一: 题二:多数元素 思路一: 本人实力有限可能对一些…...

使用 uniapp 适用于wx小程序 - 实现移动端头部的封装和调用
图例:红框区域,使其标题区与胶囊对齐 一、组件 navigation.vue <template><view class"nav_name"><view class"nav-title" :style"{color : props.color, padding-top : toprpx,background : props.bgColor,he…...
ARM Linux 系统稳定性分析入门及渐进 13 -- gdb 反汇编 disassemble 命令详细介绍及举例】
文章目录 1.1 gdb 调试回顾1.1.1 gdb list 命令介绍 1.2 反汇编命令 dis 介绍1.2.1 如何设置 gdb 汇编代码的格式 1.1 gdb 调试回顾 在GNU调试器(GDB)中,有许多命令可以帮助我们调试应用程序。 gdb: 这是一个强大的Unix下的程序调试工具。以…...

python连接Microsoft SQL Server 数据库
python代码 Author: tkhywang 2810248865qq.com Date: 2023-08-21 11:22:24 LastEditors: tkhywang 2810248865qq.com LastEditTime: 2023-08-21 11:29:30 FilePath: \PythonProject02\Microsoft SQL Server 数据库.py Description: 这是默认设置,请设置customMade, 打开koroFi…...

docker可视化工具
安装Portainer 官方安装说明:https://www.portainer.io/installation/ [rootubuntu1804 ~]#docker pull portainer/portainer[rootubuntu1804 ~]#docker volume create portainer_data portainer_data [rootubuntu1804 ~]#docker run -d -p 8000:8000 -p 9000:90…...

MySQL 用户管理操作
目录 一、用户管理概述 二、用户管理 1、创建用户 2、删除用户 三、账户密码管理 1、root用户修改自己的密码 2、ROOT用户修改其他普通用户密码 3、普通用户修改自己的密码 4、ROOT用户密码忘记解决办法 1)Linux系统 2)windows系统 四、用户权…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...