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_name
if (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=2
ChannelMember* 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());
else
peer->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", "", "");
else
s->Send("500 Error", true, "text/plain", "", "Peer most likely gone.");
else
HandleBrowserRequest(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之间的数据转发功能。
peerconnection_server简单分析
最新推荐文章于 2022-11-30 10:16:56 发布