zoukankan      html  css  js  c++  java
  • 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:会笑的人,运气通常都会比别人好。
  • 相关阅读:
    01_Struts2概述及环境搭建
    CSRF跨站请求伪造
    XSS跨站脚本攻击
    文件包含漏洞
    文件上传漏洞
    PHP常见代码执行后门函数
    SQL注入总结
    [转]Android PopupWindow的使用和分析
    [转] 基于XMPP协议的Android即时通信系
    [转]Android推送方案分析(MQTT/XMPP/GCM)
  • 原文地址:https://www.cnblogs.com/thinkinc999/p/13559548.html
Copyright © 2011-2022 走看看