⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 findcp.cpp

📁 mysee网络直播源代码Mysee Lite是Mysee独立研发的网络视频流媒体播放系统。在应有了P2P技术和一系列先进流媒体技术之后
💻 CPP
字号:
/*
 *  Openmysee
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
				 
#include "findcp.h"


list<IPInfo> ipinfo_list;
list<struct MySession> sessioninfo_list;

#ifdef __cplusplus
extern "C"{
#endif

int init()
{
	int ret = readconfig("ip.list");			
	return ret;
}

int readconfig(char * _filename)
{
	if(_filename == NULL)
		return -1;

	string filename = string(_filename);

	ifstream file(filename.c_str());

	string line;

	while(1)
	{
		getline(file, line, '\n');

		if(strlen(line.c_str()) == 0 || strcmp(line.c_str(), "\r") == 0)
		{
			break;
		}

		IPInfo ipinfo;
		
		int pos = line.find("/", 0);
		int blank = line.find(" ", 0);

		ipinfo.mask = atoi(line.substr(pos+1, blank).c_str());

		ipinfo.ipaddr = ntohl(inet_addr(line.substr(0, pos).c_str())) >> ipinfo.mask;

		ipinfo.nettype = line.substr(blank+1, strlen(line.c_str())-blank-1);

		if(ipinfo_list.size() == 0)
		{
			ipinfo_list.push_back(ipinfo);
			continue;
		}
		
		list<IPInfo>::iterator iter = ipinfo_list.begin();

		for(; iter != ipinfo_list.end(); iter ++)
		{
			if(ipinfo.ipaddr < (*iter).ipaddr)
			{
				ipinfo_list.insert(iter, ipinfo);
				break;
			}
		}

		if(iter == ipinfo_list.end())
			ipinfo_list.push_back(ipinfo);

	}

	if(ipinfo_list.size() == 0)
		return -1;

	return 0;
}
const char* find_cp_service_type(unsigned long ip)
{
	const char * retchar = find_ip_from_list(ip);
	if(retchar == NULL)
	{
		PDEBUG("find_cp_service_type: Cant find cp service type. ip=%ld ret=%s\n",ip,retchar);
		return NULL;
	}

	string servicetype = string(retchar);
	int pos = servicetype.rfind(".");
	if(pos != -1)
		servicetype = servicetype.substr(pos+1, servicetype.length()-pos-1);

	PDEBUG("find_cp_service_type: return %s\n", servicetype.c_str());
	
	return servicetype.c_str();
}

const char* find_ip_from_list(unsigned long ip)
{
//	PDEBUG("in find_ip_from_list\n");
	unsigned long ipaddr = ip;
//	unsigned long ipaddr = htonl(inet_addr(ip.c_str()));

	for(list<IPInfo>::iterator iter = ipinfo_list.begin(); iter != ipinfo_list.end(); iter ++)
	{
		unsigned long ipcode = ipaddr >> (*iter).mask;
//		PDEBUG("ip: %ld mask: %d result: %ld\n", ip, (*iter).mask, ipcode);
		if(ipcode == (*iter).ipaddr)
		{
			return (*iter).nettype.c_str();
		}
	}

	return NULL;
}

int findcppeers(unsigned long ip, void * _p)
{
	MySession *p = (MySession*)_p;

	const char * retchar = find_ip_from_list(ip);
	if(retchar == NULL)
	{
		PDEBUG("findcppeers: Cant find cp service type. ip=%ld ret=%s\n", ip, retchar);
		return -1;
	}
	else
	{
		PDEBUG("findcppeers: found %s\n", retchar);
	}
	
	string nettype = string(retchar);
	
	int pos = 0;
	bool bfound = 0;

	if(strlen(p->u.cp.servicetype) == 0)
		return -1;

	return findnettype(nettype.c_str(), p);
}

int findnettype(const char* _nettype, void *_p)
{
	MySession *p = (MySession*)_p;

	if(_nettype == NULL)
		return -1;

	string nettype = string(_nettype);
	int minpriority = 100;
	//check if the cp serves the given nettype
	string servicetype = string(p->u.cp.servicetype);
	int pos = servicetype.find(nettype);

	if(pos == -1)
		return -1;
    
    if(p->u.cp.maxConn == 1 || p->socket == 0)//无效的CP
		return -1;

	int priority = 0;
	pos = 0;

		//deal with priority
	while(pos != -1)
	{
		priority ++;//sequence in servicetype string
		int dotpos = servicetype.find(".", pos);
		string temp = servicetype.substr(pos, dotpos - pos);
		if(strcmp(temp.c_str(), nettype.c_str()) == 0)
			break;

		pos = servicetype.find(nettype, dotpos);
	}

	return priority;
}

void add_cp_to_list(void *_p)
{
	MySession *p = (MySession *)_p;
	sessioninfo_list.push_back(*p);
}

void remove_cp_from_list(void *_p)
{
	MySession *p = (MySession*)_p;
	list<MySession>::iterator iter = sessioninfo_list.begin();
	for(; iter != sessioninfo_list.end(); iter++)
	{
		if(static_cast<MySession>(*iter).host == p->host)
		{
			sessioninfo_list.erase(iter);
			//sessioninfo_list.remove(static_cast<CPInfo>(*iter));
			break;
		}
	}
}

#ifdef __cplusplus
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -