#include #include #include #include "Socket.h" DWORD WINAPI Thread( LPVOID _param ) { Socket * client = (Socket*)_param; Socket Proxy; std::string result; int SizeRequest = 65535; std::string domain; int first = 0,second = 0 ; bool Connect = 0; char * RecvData = 0; RecvData = (char*)malloc(SizeRequest); if(!RecvData){ return 0; } while(true){ if(client->Select(0,1) == 0){ break; } ZeroMemory(RecvData,SizeRequest); if(!client->RecvData(RecvData,SizeRequest-1)){ return 0; } if( client->GetRecvSize() == 0 || client->GetRecvSize() == SOCKET_ERROR){ break; } if(!Connect){ /* Если соединение не установлено, то записываем заголовки в строку и ищем в ней заголовок Host: после парсим домен, конектимся, посылаем нашу строку серверу, а далее в обчном режиме пересылаем данные отбраузера к серверу */ result += RecvData; first = result.find("Host: "); if( first != -1 ){ first += 6; second = result.find("\r\n",first); domain = result.substr(first,second-first); if(!Proxy.CreateSocket()){ return 0; } if(!Proxy.Connect(domain.c_str(),80)){ return 0; } Proxy.SendDataAll(result); result.clear(); Connect = 1; } }else{ Proxy.SendData(RecvData,client->GetRecvSize()); } } Proxy.Select(0,2); while(true){ if(Proxy.Select(0,1) == 0){ break; } ZeroMemory(RecvData,SizeRequest); if(!Proxy.RecvData(RecvData,SizeRequest-1)){ return 0; } if( Proxy.GetRecvSize() == 0 || Proxy.GetRecvSize() == SOCKET_ERROR){ break; } client->SendData(RecvData,Proxy.GetRecvSize()); } free(RecvData); client->CloseSocket(); delete client; Proxy.CloseSocket(); return 0; } int _tmain(int argc, _TCHAR* argv[]) { WSADATA ws; Socket::LoadWSA(ws); Socket Server; Socket * Client; Client = new Socket; Server.CreateSocket(); Client->CreateSocket(); Server.Bind("127.0.0.1",2222,45); Server.Listen(); while(true){ if(Server.Accept(*Client) == true){ HANDLE Th = CreateThread( NULL,NULL,Thread,(LPVOID)Client,NULL,NULL ); CloseHandle( Th ); Client = new Socket; Client->CreateSocket(); } } Server.CloseSocket(); return 1; }