// C Socket.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "C Socket.h" #include "afxsock.h" #include "string" #ifdef _DEBUG #define new DEBUG_NEW #endif #define MSIZE 10240 #define HTTP "http://" // The one and only application object CWinApp theApp; using namespace std; DWORD WINAPI ClientToProxy(LPVOID arg) { SOCKET* hConnected = (SOCKET*)arg; CSocket chrome; //Chuyen ve lai CSocket chrome.Attach(*hConnected); char *IP, *url; int port; char buffer[MSIZE], buffer1[MSIZE]; int b_length; b_length = chrome.Receive(&buffer, MSIZE, 0); // nhận gói tin từ web browser //cắt thông tin bị dư từ gói tin if (b_length >= MSIZE) buffer[b_length - 1] = 0; else { if (b_length > 0) buffer[b_length] = 0; else buffer[0] = 0; } cout << "Recevie " << b_length << " Data: " << endl << buffer << endl << endl; Get_URL_Port(buffer, url, port); IP = Get_ip(url); cout << "URL: " << url << endl; cout << "Connecting to: " << IP << endl; CSocket proxy_server; proxy_server.Create(); if (proxy_server.Connect(convertCharArrayToLPCWSTR(IP), port) == true) { cout << "Ket noi toi Server thanh cong !!!" << endl << endl; int check; check = proxy_server.Send(buffer, strlen(buffer), 0); if (check == SOCKET_ERROR) { cout << "Khong the gui goi tin len sever" << endl; proxy_server.Close(); return 0; } else { b_length = proxy_server.Receive(&buffer1, MSIZE, 0); chrome.Send(buffer1, b_length, 0); if (b_length >= MSIZE) buffer1[b_length - 1] = 0; else { if (b_length > 0) buffer1[b_length] = 0; else buffer1[0] = 0; } cout << "Web Sever Send Header " << b_length << " Data: " << endl << buffer1 << endl << endl; int cont_length = Get_Content_Length(buffer1); cout << "Content - Length: " << cont_length << endl; int s_bytes = 0; s_bytes += b_length; while (cont_length > s_bytes) { b_length = proxy_server.Receive(&buffer1, MSIZE, 0); chrome.Send(buffer1, b_length, 0); //cout << buffer1 << endl; ZeroMemory(buffer1, b_length); s_bytes += b_length; }; proxy_server.Close(); } } } int main() { int nRetCode = 0; HMODULE hModule = ::GetModuleHandle(nullptr); if (hModule != nullptr) { // initialize MFC and print and error on failure if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs wprintf(L"Fatal Error: MFC initialization failed\n"); nRetCode = 1; } else { AfxSocketInit(NULL); // TODO: code your application's behavior here. if (AfxSocketInit() == FALSE) { cout << "Khong the khoi tao Socket Libraray"; return FALSE; } CSocket chrome_proxy; CSocket chrome; DWORD threadID; HANDLE threadStatus; if (chrome_proxy.Create(8888, SOCK_STREAM, NULL) != 0) { cout << "Server khoi tao thanh cong !!!" << endl; } else { cout << "Khong the tao server!!!"; chrome_proxy.Close(); return FALSE; } do { if (chrome_proxy.Listen(5) == FALSE) { cout << "Khong the lang nghe tren port nay !!!" << endl; chrome_proxy.Close(); return FALSE; } else { cout << "Lang nghe thanh cong !!!" << endl; } if (chrome_proxy.Accept(chrome) == true) { cout << "Da co client ket noi" << endl; SOCKET* hConnected = new SOCKET(); //Chuyển đỏi CSocket thanh Socket *hConnected = chrome.Detach(); threadStatus = CreateThread(NULL, 0, ClientToProxy, hConnected, 0, &threadID); } } while (true); } } else { // TODO: change error code to suit your needs wprintf(L"Fatal Error: GetModuleHandle failed\n"); nRetCode = 1; } return nRetCode; } wchar_t *convertCharArrayToLPCWSTR(const char* charArray) { wchar_t* wString = new wchar_t[4096]; MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096); return wString; } char *Get_ip(char *host) { struct hostent *hstnm; hstnm = gethostbyname(host); if (hstnm == NULL) { cout << "Can't get IP address" << endl; } else { char *IP = new char[15]; if (inet_ntop(AF_INET, (void *)hstnm->h_addr_list[0], IP, 15) == NULL) cout << "Can't resolve host" << endl; return IP; } } void Get_URL_Port(char* pac, char* &url, int &port) { string arr(pac), result, temp; int pos1, pos2, dot_pos; pos1 = arr.find_first_of(HTTP) + 7; // 7 là độ dài chuỗi http:// temp = arr.substr(pos1); pos2 = temp.find_first_of("/"); result = temp.substr(0, pos2); dot_pos = result.find_first_of(":"); if (dot_pos != -1) { string host, p; host = result.substr(0, dot_pos); p = result.substr(dot_pos + 1, result.length() - dot_pos); url = new char[host.length()]; for (int i = 0;i < host.length();i++) { url[i] = host[i]; } url[host.length()] = '\0'; port = stoi(p); } else { url = new char[result.length()]; for (int i = 0;i < result.length();i++) { url[i] = result[i]; } url[result.length()] = '\0'; port = 80; // port mặc định của http } } bool Check_HTTP(char * pac) { if ((pac[0]=='G' && pac[1]=='E' && pac[2] == 'T')|| pac[0]=='P' && pac[1]=='O' && pac[2]=='S' && pac[3]=='T') return true; return false; } int Get_Content_Length(char * pac) { string arr(pac); string ct = "Content-Length: "; string temp; int pos = arr.find(ct); if (pos == -1) return 0; else { pos += ct.length(); while (arr[pos] >= '0' && arr[pos] <= '9') { temp.push_back(arr[pos]); pos += 1; } } return stoi(temp); }