不同平台处理事件有不同的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”, 如果要等一段时长后没有事件过来就结束等待,参数需设置为以毫秒为单位的时长.
-
返回值:
-
WAIT_OBJECT_0: 事件已经收到
-
WAIT_TIMEOUT : 等待超时
-
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读写事件
- 普通事件 :
- Windows平台下的WSAEvent类型的事件
- POSIX平台下的pipe管道传递事件,主要用于线程同步