peerconnection_server简单分析

来源:互联网 发布:linux跳板机搭建 编辑:程序博客网 时间:2024/05/16 15:59
ListeningSocket listener; //ListeningSocket继承了SocketBase基类listener.Create()socket(()listener.Listen(FLAG_port)setsockopt()bind()listen()PeerChannel clients;//typedef std::vector<ChannelMember*> Members;//connected()//id()//set_disconnected()//is_wait_request()//name()//TimedOut()//GetPeerIdHeader()//NotifyOfOtherMember()//GetEntry()//ForwardRequestToPeer()//OnClosing()//QueueResponse()//SetWaitingSocket()/*struct QueuedResponse {std::string status, content_type, extra_headers, data;};*///members()//IsPeerConnection()//Lookup()//IsTargetedRequest()//AddMember()//CloseAll()//OnClosing()//CheckForTimeout()//DeleteAll()//BroadcastChangedState()//HandleDeliveryFailures()//BuildResponseForNewMember()typedef std::vector<DataSocket*> SocketArray;SocketArray sockets;while (!quit) select()if(FD_ISSET(s->socket(), &socket_set))OnDataAvailable() //接收到有效数据recv()headers_received()ParseHeaders()ChannelMember* member = clients.Lookup(s); //查找client是否存在,返回查找结果。if (member || PeerChannel::IsPeerConnection(s))if (!member)//如:http://192.168.1.123:8888/sign_in?id_nameif (s->PathEquals("/sign_in"))clients.AddMember(s);else if (member->is_wait_request(s))socket_done = false;else//如:http://192.168.1.123:8888/message?peer_id=1&to=2ChannelMember* target = clients.IsTargetedRequest(s);if (target) member->ForwardRequestToPeer(s, target);//peer数据的转发请求std::string extra_headers(GetPeerIdHeader());if (peer == this)ds->Send("200 OK", true, ds->content_type(), extra_headers, ds->data());elsepeer->QueueResponse("200 OK", ds->content_type(), extra_headers, ds->data());ds->Send("200 OK", true, "text/plain", "", "");else if (s->PathEquals("/sign_out"))s->Send("200 OK", true, "text/plain", "", "");elses->Send("500 Error", true, "text/plain", "", "Peer most likely gone.");elseHandleBrowserRequest(s, &quit);//浏览器请求视频这部分代码并没有实现的......clients.CheckForTimeout();if (FD_ISSET(listener.socket(), &socket_set))DataSocket* s = listener.Accept();accept()sockets.push_back(s);总结:对应peerconnection_server而言,整个框架可以看出其实就是一个简单的tcp_server;它实现了部分http协议,tcp_client管理,tcp_client之间的数据转发功能。

0 0
原创粉丝点击