前言
承接上一节<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;
}
}