📄 main.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 + -