peerconnection_server简单分析

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之间的数据转发功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值