WebRTC事件处理-基础知识

706 阅读3分钟

不同平台处理事件有不同的API

Win平台下提供了 WSAEventSelect和完全端口两种接口处理事件, 完全端口处理事件会更高效,但是webrtc选择的是WSAEventSelect.

Linux平台提供了 epoll 和select进行事件的处理.

Mac平台提供了kqueue, 也可以使用select, 因为select是跨平台的.

WebRTC下的事件处理类

  • NullSocketServer(处理无socket的事件), 对应以下的普通事件.
  • PhysicalSocketServer(处理有socket的事件), 对应以下的一步IO事件.

windows下两种不同的事件

  • 普通事件: 通过CreateEvent API 创建句柄, 获取到句柄后即可处理事件, 普通事件无法与socket进行绑定.

  • 异步IO事件, 通过WSACreateEvent创建, 这种事件是可以与socket进行绑定的, 

NullSocketServer中的事件

  • 通过CreateEvent创建事件句柄

  • WaitForSingleObject等待事件(等待一个事件发生)

  • 其他线程SetEvent发送事件, 唤醒等待线程

CreateEvent

  • 返回值是一个句柄

  • 参数一: 事件属性, NULL表示默认的事件属性

  • 参数二: 是否手动复位, true的话,需要手动调用reset, 一般设置false,自动复位.

  • 参数三: 初始状态,true表示事件正在触发中, 一般设置false, 这样才能使用setEvent触发事件, 唤醒等待线程.

  • 参数四: 是否匿名事件, 一般false即可满足需求

WaitForSingleObject

  • 参数一 : CreateEvent返回的句柄

  • 参数二 : 等待时长, 如果要一直等待事件发生,参数需设置为“INFINITE”, 如果要等一段时长后没有事件过来就结束等待,参数需设置为以毫秒为单位的时长.

  • 返回值:

  1. WAIT_OBJECT_0: 事件已经收到

  2. WAIT_TIMEOUT : 等待超时

  3. WAIT_FAILED : 失败, 通过GetLastError获取错误信息.

PhysicalSocketServer中的事件

  • 通过WSACreateEvent创建事件

  • WSAWaitForMultipleEvents等待事件(等待多个事件发生)

  • WSASetEvent发送事件, 唤醒等待线程

  • WSAResetEvent, 重置事件(WSACreateEvent创建的事件必须手动复位)

Socket与事件的绑定

  • WSAEventSelect : 将socket与事件绑定, 多个socket可以绑定到同一个事件上, 处理的时候需要枚举出事件上的每个socket.

  • WSAEnumNetworkEvents : 枚举发生事件的socket, 用于判断是哪个socket触发的该事件.

WSAWaitForMultipleEvents

  • 参数一 : 监听的事件个数, 与参数二相对应.

  • 参数二 : 监听事件的数组.

  • 参数三 : 是否等待全部事件触发后再唤醒线程, True表示所有事件都发生时才唤醒处理线程, false : 表示有一个事件发生就唤醒线程, 一般设置false.

  • 参数四 : 等待超时时长, -1: 表示永远等待知道事件发生, 否则设置等待毫秒数.

  • 参数五 : 设置false即可

WSAEventSelect

  • 参数一 : 监听的需要与事件绑定的socket

  • 参数二 : 需要与socket绑定的事件.

  • 参数三 : 监听事件的状态: 读、写、连接, 一般都监听.

WSAEnumNetworkEvents 

WSAEnumNetworkEvents与WSAEventSelect类似, 当WSAEnumNetworkEvents执行的时候, 会把与事件绑定的socket遍历一遍, 之后会有一个结果 也就是参数三 表示是否有事件触发, 如果没有则说明事件不是改绑定的socket触发的.

PhysicalSocketServer中的事件源

PhysicalSocketServer不仅可以处理普通事件也可以处理socket IO事件.

  • socket读写事件
  • 普通事件 : 
  1. Windows平台下的WSAEvent类型的事件
  2. POSIX平台下的pipe管道传递事件,主要用于线程同步