前言
承接上一节<4-11 client的信令逻辑>
从PeerConnectionClient::DoConnect开始。
PeerConnectionClient::DoConnect
该函数
void PeerConnectionClient::DoConnect() {// 创建控制control_socket,用于和服务器连接control_socket_.reset(CreateClientSocket(server_address_.ipaddr().family()));// 创建hanging socket,用于hanging_get_.reset(CreateClientSocket(server_address_.ipaddr().family()));// 初始化socket信号,里面是信号与槽函数的绑定InitSocketSignals();char buffer[1024];snprintf(buffer, sizeof(buffer), "GET /sign_in?%s HTTP/1.0\r\n\r\n",client_name_.c_str());onconnect_data_ = buffer;bool ret = ConnectControlSocket();if (ret)state_ = SIGNING_IN;if (!ret) {callback_->OnServerConnectionFailure();}}
在此打断点,单击连接的时候,的堆栈如下
发送消息流程


当另一个client连接后,单击该client进行通信。就会调用MainWnd::QueueUIThreadCallback,发送消息到主线程去处理。
主线程接收后,是Conductor::UIThreadCallback处理。
void Conductor::UIThreadCallback(int msg_id, void* data) {switch (msg_id) {case PEER_CONNECTION_CLOSED: //对端关闭了RTC_LOG(INFO) << "PEER_CONNECTION_CLOSED";DeletePeerConnection();if (main_wnd_->IsWindow()) {if (client_->is_connected()) {main_wnd_->SwitchToPeerList(client_->peers());} else {main_wnd_->SwitchToConnectUI();}} else {DisconnectFromServer();}break;case SEND_MESSAGE_TO_PEER: { //发送消息到对端RTC_LOG(INFO) << "SEND_MESSAGE_TO_PEER";std::string* msg = reinterpret_cast<std::string*>(data);if (msg) {// For convenience, we always run the message through the queue.// This way we can be sure that messages are sent to the server// in the same order they were signaled without much hassle.pending_messages_.push_back(msg);}if (!pending_messages_.empty() && !client_->IsSendingMessage()) {msg = pending_messages_.front();pending_messages_.pop_front();if (!client_->SendToPeer(peer_id_, *msg) && peer_id_ != -1) {RTC_LOG(LS_ERROR) << "SendToPeer failed";DisconnectFromServer();}delete msg;}if (!peer_connection_.get())peer_id_ = -1;break;}case NEW_TRACK_ADDED: { // 新的视频通道auto* track = reinterpret_cast<webrtc::MediaStreamTrackInterface*>(data);if (track->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) {auto* video_track = static_cast<webrtc::VideoTrackInterface*>(track);main_wnd_->StartRemoteRenderer(video_track);}track->Release();break;}case TRACK_REMOVED: { // 对端停止发送了一个track// Remote peer stopped sending a track.auto* track = reinterpret_cast<webrtc::MediaStreamTrackInterface*>(data);track->Release();break;}default:RTC_NOTREACHED();break;}}
