本文共 2316 字,大约阅读时间需要 7 分钟。
ListeningSocket listener; //ListeningSocket继承了SocketBase基类 listener.Create() socket(() listener.Listen(FLAG_port) setsockopt() bind() listen() PeerChannel clients; //typedef std::vectorMembers; //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 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之间的数据转发功能。
转载地址:http://pinub.baihongyu.com/