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

📄 main.cpp

📁 主要用于http://www.doctorcom.com/开发的dr.com宽带记费系统
💻 CPP
字号:
#include"SocketObject.h"
#include"Thread.h"
#include<iostream>
#include<cstdio>
#include<fstream>
#include<vector>
#include<list>
#include<boost\regex.hpp>
using namespace std;
using namespace boost;

#pragma comment(lib,"ws2_32.lib")

#define SENDTOWEB 0

#define SENDTOCLIENT 1

#define BUFSIZE 10

typedef pair<string,void*> Pair;

typedef unsigned (*COMMAND)(string& command);



char fuckDRCOM[17]={'D','r','c','o',0xD2,0x20,0x70,0x01,0xE6,0x00,0xAC,0x1A,0x53,0x01,0xC2,0x0D,0x0D};

//ofstream out("ip.txt",ios_base::trunc);



unsigned __stdcall serverFunc(void* param);


unsigned __stdcall sourceCleanFunc(void* param);

unsigned __stdcall controlFunc(void* param);



unsigned listUsers(string& param);

unsigned exitProcess(string& param);

unsigned setPort(string& param);

unsigned setCapacity(string& param);

//unsigned kickUser(string& param);

unsigned help(string& param);

unsigned operateCom(string& com);

string getFuncName(string& com);

void initCom();

vector<string> getFuncParam(string& com);

map<string,void*> users;

map<string,void*> coms;

int serverPort=7000;

int capacity=10;



void main()
{
	cout<<"Fuck Dr.Com for freedom!"<<endl;
	
	initCom();
	SocketObject serverSock;
	serverSock.Create(AF::af_inet,SOCKTYPE::sock_stream,PROTOCAL::ipproto_ip);
flag:
	cout<<"请输入服务端口:"<<endl;
	cin>>serverPort;
	fflush(stdin); //重要,刷新输入流缓冲区
    if(!serverSock.Bind(serverPort))
	{
		cout<<"端口绑定失败!"<<endl;
		goto flag;
	}
	Thread controlThread(controlFunc,NULL);
	controlThread.ThreadStart();
	serverSock.Listen(100);
	while(true)
	{
		SocketObject* clientSock=new SocketObject();
	    if(serverSock.Accept(*clientSock))
		{
			/*
			map<string,void*>::const_iterator iter;
			iter=users.find(clientSock->GetIP());
			if(users.size()<capacity && iter==users.end())
			{
				list<SocketObject*>* sklist=new list<SocketObject*>();
				sklist->push_back(clientSock);
				users.insert(Pair(clientSock->GetIP(),(void*)sklist));
				
			}
			else if(users.size()>=capacity)
			{
				delete clientSock;
			}
			else
				((list<SocketObject*>*)((*iter).second))->push_back(clientSock);
				*/

			Thread serverThread(serverFunc,(void*)clientSock);
			serverThread.ThreadStart();
			
		}
		
	}
	controlThread.Join();
	
}

unsigned __stdcall serverFunc(void* param)
{
	char buf[65535];
	int flag=0;
	regex expression("host: (.*?)\r\n",regbase::icase);  //网页代理 falg=0
	regex expression1("connect (.*?):(.*?) HTTP",regbase::icase);  //qq等其他flag=1;
	SocketObject* clientSock=(SocketObject*)param;
	
	//cout<<"3"<<endl;
	int len=0;
	
	len=clientSock->Recv(buf,sizeof(buf));
	if(len<=0)
	{
		delete clientSock;
		return 0;
	}
	//cout<<buf<<endl;
	len=clientSock->Recv(buf,sizeof(buf));
	if(len<=0)
	{
		delete clientSock;
		return 0;
	}
	//cout<<buf<<endl;
	//cout<<(char*)&fuckedMessage<<endl;
	string request;
	int port=80;
	request.assign(buf,len);
	//out<<request<<endl;
	cout<<request<<endl;
	smatch matchStr;
	string::const_iterator beg=request.begin();
	string::const_iterator end=request.end();
	if(!regex_search(beg,end,matchStr,expression))
	{
		flag=1;
		regex_search(beg,end,matchStr,expression1);
		port=atoi(matchStr[2].str().c_str());
	}
	//cout<<matchStr[1].str()<<endl;
	SocketObject netSock;
	netSock.Create(AF::af_inet,SOCKTYPE::sock_stream,PROTOCAL::ipproto_ip);
	if(netSock.Connect((char*)matchStr[1].str().c_str(),port))
	{
		//cout<<"连接成功"<<endl;
		switch (flag)
		{
		case 0:
			{
				if(netSock.Send((char*)request.c_str(),request.size())<=0)
				{
					delete clientSock;
					return 0;
				}
			}break;
		case 1:
			{
				string re="HTTP/1.1 200 Connection Established\r\n";
				if(clientSock->Send((char*)re.c_str(),re.size())<=0)
				{
					delete clientSock;
					return 0;
				}

			}break;
		}
	}
	else
	{
		delete clientSock;
		return 0;
	}
	
	fd_set readSet;
	while(true)
	{
		
		FD_ZERO(&readSet);
		FD_SET(clientSock->skSocket,&readSet);
		FD_SET(netSock.skSocket,&readSet);
		if(select(0,&readSet,NULL,NULL,NULL))
		{
			if(FD_ISSET(netSock.skSocket,&readSet))
			{
				int len=0;
				if(len=netSock.Recv(buf,sizeof(buf)))
				{
					if(clientSock->Send(buf,len)<=0)
						break;
					//cout<<"发送net有用消息成功"<<endl;
				}
				else
					break;
				//cout<<"接收数据成功"<<endl;
				
			}
			if(FD_ISSET(clientSock->skSocket,&readSet))
			{
				int len=0;
				if(len=clientSock->Recv(buf,sizeof(buf)))
				{
					
						if(netSock.Send(buf,len)<=0)
							break;
					
				}
				else
					break;
			}
		}
	}
	delete clientSock;
	clientSock=NULL;
	return 0;
}

u

unsigned __stdcall controlFunc(void* param)
{
	while(true)
	{
		string com;
		cout<<">";
		getline(cin,com);
		operateCom(com);
	}
	return 0;
}


unsigned listUsers(string& param)
{
	cout<<"用户IP表:"<<endl;
	map<string,void*>::const_iterator iter;
	for(iter=users.begin();iter!=users.end();++iter)
	{
		cout<<(*iter).first<<endl;
	}

	return 0;
}

unsigned exitProcess(string& param)
{
	exit(0);
	return 0;
}

unsigned setPort(string& param)
{
	vector<string> params=getFuncParam(param);
	serverPort=atoi(params[0].c_str());
	
	return 0;
}

unsigned setCapacity(string& param)
{
	vector<string> params=getFuncParam(param);
	capacity=atoi(params[0].c_str());
	return 0;
}

unsigned help(string& param)
{
	cout<<"如发现问题请截图并描述一下发到xuhui122000@yahoo.con.cn"<<endl;
	cout<<"                                               by 徐晖"<<endl;
	return 0;
}

string getFuncName(string& com)
{
	regex expression("([^ ]+) *",regbase::icase);
	smatch matchStr;
	string::const_iterator beg=com.begin();
	string::const_iterator end=com.end();
	regex_search(beg,end,matchStr,expression);
	return matchStr[1].str();
}

vector<string> getFuncParam(string& com)
{
	vector<string> params;
	regex expression("[^ ]+ ([^ ]+) *",regbase::icase);
	//regex expression1("setPort ([~ ]*?) *",regbase::icase);
	smatch matchStr;
	string::const_iterator beg=com.begin();
	string::const_iterator end=com.end();
	regex_search(beg,end,matchStr,expression);
	params.push_back(matchStr[1].str());
	
	return params;

}

void initCom()
{
	//coms.insert(Pair("list",(void*)listUsers));
	//coms.insert(Pair("setPort",(void*)setPort));
	//coms.insert(Pair("setCapacity",(void*)setCapacity));
	coms.insert(Pair("help",(void*)help));
}

unsigned operateCom(string& com)
{
	map<string,void*>::const_iterator iter;
	//cout<<getFuncName(com)<<endl;
	iter=coms.find(getFuncName(com));
	if(iter==coms.end())
	{
		cout<<"错误的命令,请输入help查询帮助!"<<endl;
	}
	else
		((COMMAND)((*iter).second))(com);
	return 0;
}

⌨️ 快捷键说明

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