系列文章目录
Webrtc从理论到实践一:初识
Webrtc从理论到实践二: 架构
Webrtc从理论到实践三: 角色
Webrtc从理论到实践四: 通信
Webrtc从理论到实践五: 编译webrtc源码
Webrtc从理论到实践六: Webrtc官方demo运行
文章目录
前言
本文源码基于webrtc m89版本,先从peerconnection_server开始分析
一、peerconnection_server 目录结构
从图上我们可以看出peerconnection_server的源文件仅有七个:其中main文件主要用于主流程的控制以及网络事件的分发,data_socket文件用于socket的创建与数据的读取和发
送,peer_channel文件用于信令的处理以及socket的管理,utils文件里存放了两个常用的字符串处理函数。
二、类图
简单介绍一下上面几个类的作用:首先,SocketBase类是对win32 socket api的封装,包含了创建和关闭两个接口。然后,ListeningSocket和DataSocket类都继承了SocketBase类,从他们的命名我们就可以得知,DataSocket的主要职责是用于从socket接收/发送数据,对应的接口是OnDataAvailable()和send()方法。ListeningSocket是用于接收连接和创建DataSocket实例的,Listen()接口用于监听端口,当接收到一个新的连接时就会通过Accept()创建一个新的DataSocket实例。ChannelMember用于处理从DataSocket 接收到的信令,并且与DataSocket是一 一对应的,每个ChannelMember都会保存一个从0开始递增的id_用于标识。PeerChannel类是ChannelMember的管理类,内部创建了一个_members数组用于保存建立连接的ChannelMember,并且可以通过Lookup()接口查找ChannelMember对象,还可以通过AddMember()将ChannelMember对象保存起来。
三、工作流程
首先说一下整个server的模型是事件驱动模型,采用select()接口实现,以下代码片段已做删减
1. 监听socket端口
监听socket端口主要分为两步:第一个解析命令行参数,从命令行参数中获取指定端口。第二个创建socket 并且监听端口。
// InitFieldTrialsFromString stores the char*, so the char array //must outlive the application.
const std::string force_field_trials = absl::GetFlag(FLAGS_force_fieldtrials);
webrtc::field_trial::InitFieldTrialsFromString(force_field_trials.c_str());
int port = absl::GetFlag(FLAGS_port);
// Abort if the user specifies a port that is outside the allowed
// range [1, 65535].
if ((port < 1) || (port > 65535)) {
printf("Error: %i is not a valid port.\n", port);
return -1;
}
ListeningSocket listener;
if (!listener.Create()) {
printf("Failed to create server socket\n");
return -1;
} else if (!listener.Listen(port)) {
printf("Failed to listen on server socket\n"