http 基本代理 C++实现(极简)


  1 // ProxySvr.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2 //
  3 #define _WINSOCK_DEPRECATED_NO_WARNINGS 1
  4 #include <string>
  5 #include <iostream>
  6 #include <winsock2.h>
  7 #include <process.h>
  8 
  9 #pragma comment(lib, "ws2_32.lib")
 10 
 11 unsigned __stdcall http_thread_proc(void* param);
 12 std::string get_host(std::string http_req);
 13 
 14 std::string get_host(std::string http_req)
 15 {
 16     std::string host_data;
 17     if (http_req.size() <= 0)
 18     {
 19         return host_data;
 20     }
 21     const char* delim = "
";
 22     char *p;
 23     char *ptr;
 24 
 25     p = strtok_s((char*)http_req.c_str(), delim, &ptr);
 26     if (!p) {
 27         return host_data;
 28     }
 29 
 30     //if (p[0] == 'G') {
 31     //    host_data.append(&p[4], strlen(p) - 13);
 32     //}
 33     //else if (p[0] == 'P') {
 34     //    host_data.append(&p[5], strlen(p) - 14);
 35     //}
 36 
 37     p = strtok_s(NULL, delim, &ptr);
 38     while (p) {
 39         switch (p[0])
 40         {
 41         case 'H':
 42             host_data.append(&p[6], strlen(p) - 6);
 43             break;
 44         default:
 45             break;
 46         }
 47         p = strtok_s(NULL, delim, &ptr);
 48     }
 49     return host_data;
 50 }
 51 
 52 int main()
 53 {
 54     WSADATA wsa;
 55     WSAStartup(MAKEWORD(2, 2), &wsa);
 56     SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 57     sockaddr_in server_addr;
 58     server_addr.sin_family = AF_INET;
 59     server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
 60     server_addr.sin_port = htons(10240);
 61     bind(listen_socket, (sockaddr*)&server_addr, sizeof(sockaddr_in));
 62     listen(listen_socket, SOMAXCONN);
 63 
 64     while (true) {
 65         sockaddr_in client_addr;
 66         int len = sizeof(sockaddr_in);
 67         SOCKET client_socket = accept(listen_socket, (sockaddr*)&client_addr, &len);
 68 
 69         _beginthreadex(0, 0, http_thread_proc, (void*)client_socket, 0, 0);
 70 
 71     }
 72 
 73 
 74     WSACleanup();
 75     return 0;
 76 }
 77 
 78 unsigned __stdcall http_thread_proc(void* param)
 79 {
 80     char buf[4096] = { 0 };
 81     SOCKET client_socket = (SOCKET)param;
 82 
 83     int len = ::recv(client_socket, buf, 4096, 0);
 84     std::string data = buf;
 85     if (data.find("activity.windows.com:443") == std::string::npos) {
 86         printf("client connect socket=%d
", client_socket);
 87         printf("%s
", buf);
 88         std::string host = get_host(data);
 89         printf("
%s
", host.c_str());
 90 
 91         hostent* host_ent = gethostbyname(host.c_str());
 92         if (host_ent) {
 93             sockaddr_in server_addr;
 94             server_addr.sin_family = AF_INET;
 95             server_addr.sin_port = htons(80);
 96             IN_ADDR addr = *(IN_ADDR*)*host_ent->h_addr_list;
 97             server_addr.sin_addr.S_un.S_addr = inet_addr(inet_ntoa(addr));
 98             SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 99             if (server_socket != INVALID_SOCKET) {
100                 if ( SOCKET_ERROR != connect(server_socket, (sockaddr*)&server_addr, sizeof(sockaddr_in))) {
101                     printf("代理主机:%s 连接成功
", host.c_str());
102                     ::send(server_socket, buf, data.size(), 0);
103                     ZeroMemory(buf, 4096,  0);
104                     ::recv(server_socket, buf, 4096, 0);
105                     printf("flow recv:
%s
", buf);
106                     ::send(client_socket, buf, 4096, 0);
107                     closesocket(server_socket);
108                 }
109             }
110         }
111     }
112 
113     closesocket(client_socket);
114     return 0;
115 }
116 
117 
PS:会笑的人,运气通常都会比别人好。
原文地址:https://www.cnblogs.com/thinkinc999/p/13559548.html