{"id":692,"date":"2025-11-19T12:15:23","date_gmt":"2025-11-19T04:15:23","guid":{"rendered":"https:\/\/help.ipnut.com\/?post_type=docs&#038;p=692"},"modified":"2025-12-03T17:49:37","modified_gmt":"2025-12-03T09:49:37","password":"","slug":"tong-guo-c-c-yu-yan-jie-ru-dai-ma-demo","status":"publish","type":"docs","link":"https:\/\/www.ipnut.com\/cn\/help\/kai-fa-wen-dang\/tong-guo-c-c-yu-yan-jie-ru-dai-ma-demo\/","title":{"rendered":"\u901a\u8fc7C\/C++\u8bed\u8a00\u63a5\u5165\u4ee3\u7801Demo"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"692\" class=\"elementor elementor-692\" data-elementor-post-type=\"docs\">\n\t\t\t\t<div class=\"elementor-element elementor-element-18495ba e-flex e-con-boxed e-con e-parent\" data-id=\"18495ba\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9059347 elementor-widget elementor-widget-text-editor\" data-id=\"9059347\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>\u901a\u8fc7C\/C++\u8bed\u8a00\u914d\u7f6eIPNut \u4ee3\u7406\uff1a<\/p><p>\u8fdb\u5165 <strong><a href=\"https:\/\/www.ipnut.com\/cn\/\" target=\"_blank\" rel=\"noopener nofollow\">IPNut<\/a><\/strong> \u5e73\u53f0\u8d2d\u4e70\u5e76\u83b7\u53d6\u4fe1\u606f\uff0c\u8fd9\u91cc\u4ee5\u9759\u6001IP\u4e3a\u4f8b\uff08\u5047\u5982\u7aef\u53e3\u662f http:\/\/proxy.ipnut.com:28001\uff0c\u8d26\u53f7: ipnut\uff0c\u5bc6\u7801: 123456789\uff09\u3002<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-72ea65f elementor-widget elementor-widget-heading\" data-id=\"72ea65f\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">1. SOCKS5\u4ee3\u7406\u793a\u4f8b\uff1asocks5_proxy_demo.cpp\n<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a7ed448 elementor-widget elementor-widget-code-highlight\" data-id=\"a7ed448\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp \">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>\/**\r\n * SOCKS5\u4ee3\u7406\u6f14\u793a - C++\r\n *\/\r\n\r\n#include <iostream>\r\n#include <string>\r\n#include <cstring>\r\n#include <sys\/socket.h>\r\n#include <netinet\/in.h>\r\n#include <arpa\/inet.h>\r\n#include <unistd.h>\r\n#include <netdb.h>\r\n#include <vector>\r\n#include <sstream>\r\n#include <iomanip>\r\n\r\nclass Socks5ProxyDemo {\r\nprivate:\r\n    std::string proxy_host = \"proxy.ipnut.com\";\r\n    int proxy_port = 28001;\r\n    std::string proxy_username = \"ipnut\";\r\n    std::string proxy_password = \"123456789\";\r\n\r\npublic:\r\n    \/**\r\n     * \u8fde\u63a5\u5230SOCKS5\u4ee3\u7406\u670d\u52a1\u5668\r\n     *\/\r\n    int connectToSocks5Proxy() {\r\n        int sockfd = socket(AF_INET, SOCK_STREAM, 0);\r\n        if (sockfd < 0) {\r\n            std::cerr << \"\u521b\u5efasocket\u5931\u8d25\" << std::endl;\r\n            return -1;\r\n        }\r\n\r\n        \/\/ \u89e3\u6790\u4ee3\u7406\u670d\u52a1\u5668\u5730\u5740\r\n        struct hostent* he = gethostbyname(proxy_host.c_str());\r\n        if (he == nullptr) {\r\n            std::cerr << \"\u89e3\u6790\u4ee3\u7406\u670d\u52a1\u5668\u5730\u5740\u5931\u8d25\" << std::endl;\r\n            close(sockfd);\r\n            return -1;\r\n        }\r\n\r\n        struct sockaddr_in proxy_addr;\r\n        memset(&proxy_addr, 0, sizeof(proxy_addr));\r\n        proxy_addr.sin_family = AF_INET;\r\n        proxy_addr.sin_port = htons(proxy_port);\r\n        memcpy(&proxy_addr.sin_addr, he->h_addr_list[0], he->h_length);\r\n\r\n        \/\/ \u8fde\u63a5\u5230\u4ee3\u7406\u670d\u52a1\u5668\r\n        if (connect(sockfd, (struct sockaddr*)&proxy_addr, sizeof(proxy_addr)) < 0) {\r\n            std::cerr << \"\u8fde\u63a5\u5230\u4ee3\u7406\u670d\u52a1\u5668\u5931\u8d25\" << std::endl;\r\n            close(sockfd);\r\n            return -1;\r\n        }\r\n\r\n        std::cout << \"\u6210\u529f\u8fde\u63a5\u5230SOCKS5\u4ee3\u7406\u670d\u52a1\u5668\" << std::endl;\r\n        return sockfd;\r\n    }\r\n\r\n    \/**\r\n     * SOCKS5\u8ba4\u8bc1\u63e1\u624b\r\n     *\/\r\n    bool socks5Authenticate(int sockfd) {\r\n        \/\/ SOCKS5\u63e1\u624b\u5305\r\n        std::vector<unsigned char> handshake = {\r\n            0x05, \/\/ SOCKS\u7248\u672c5\r\n            0x02, \/\/ \u8ba4\u8bc1\u65b9\u6cd5\u6570\u91cf\r\n            0x00, \/\/ \u65e0\u8ba4\u8bc1\r\n            0x02  \/\/ \u7528\u6237\u540d\u5bc6\u7801\u8ba4\u8bc1\r\n        };\r\n\r\n        if (send(sockfd, handshake.data(), handshake.size(), 0) < 0) {\r\n            std::cerr << \"\u53d1\u9001\u63e1\u624b\u5305\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        \/\/ \u63a5\u6536\u670d\u52a1\u5668\u54cd\u5e94\r\n        unsigned char response[2];\r\n        if (recv(sockfd, response, 2, 0) < 2) {\r\n            std::cerr << \"\u63a5\u6536\u63e1\u624b\u54cd\u5e94\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        if (response[0] != 0x05) {\r\n            std::cerr << \"\u4e0d\u652f\u6301\u7684SOCKS\u7248\u672c\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        \/\/ \u5982\u679c\u9700\u8981\u7528\u6237\u540d\u5bc6\u7801\u8ba4\u8bc1\r\n        if (response[1] == 0x02) {\r\n            return socks5UsernamePasswordAuth(sockfd);\r\n        } else if (response[1] != 0x00) {\r\n            std::cerr << \"\u4e0d\u652f\u6301\u7684\u8ba4\u8bc1\u65b9\u6cd5: \" << (int)response[1] << std::endl;\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * SOCKS5\u7528\u6237\u540d\u5bc6\u7801\u8ba4\u8bc1\r\n     *\/\r\n    bool socks5UsernamePasswordAuth(int sockfd) {\r\n        std::vector<unsigned char> auth_packet;\r\n        auth_packet.push_back(0x01); \/\/ \u8ba4\u8bc1\u7248\u672c\r\n        auth_packet.push_back(proxy_username.length());\r\n        auth_packet.insert(auth_packet.end(), proxy_username.begin(), proxy_username.end());\r\n        auth_packet.push_back(proxy_password.length());\r\n        auth_packet.insert(auth_packet.end(), proxy_password.begin(), proxy_password.end());\r\n\r\n        if (send(sockfd, auth_packet.data(), auth_packet.size(), 0) < 0) {\r\n            std::cerr << \"\u53d1\u9001\u8ba4\u8bc1\u5305\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        unsigned char auth_response[2];\r\n        if (recv(sockfd, auth_response, 2, 0) < 2) {\r\n            std::cerr << \"\u63a5\u6536\u8ba4\u8bc1\u54cd\u5e94\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        if (auth_response[0] != 0x01 || auth_response[1] != 0x00) {\r\n            std::cerr << \"SOCKS5\u8ba4\u8bc1\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        std::cout << \"SOCKS5\u8ba4\u8bc1\u6210\u529f\" << std::endl;\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * \u901a\u8fc7SOCKS5\u4ee3\u7406\u8fde\u63a5\u76ee\u6807\u670d\u52a1\u5668\r\n     *\/\r\n    bool socks5ConnectToTarget(int sockfd, const std::string& target_host, int target_port) {\r\n        std::vector<unsigned char> connect_packet;\r\n        connect_packet.push_back(0x05); \/\/ SOCKS\u7248\u672c\r\n        connect_packet.push_back(0x01); \/\/ CONNECT\u547d\u4ee4\r\n        connect_packet.push_back(0x00); \/\/ \u4fdd\u7559\r\n\r\n        \/\/ \u57df\u540d\u7c7b\u578b\r\n        connect_packet.push_back(0x03); \/\/ \u57df\u540d\r\n        connect_packet.push_back(target_host.length());\r\n        connect_packet.insert(connect_packet.end(), target_host.begin(), target_host.end());\r\n        \r\n        \/\/ \u7aef\u53e3\r\n        connect_packet.push_back((target_port >> 8) & 0xFF);\r\n        connect_packet.push_back(target_port & 0xFF);\r\n\r\n        if (send(sockfd, connect_packet.data(), connect_packet.size(), 0) < 0) {\r\n            std::cerr << \"\u53d1\u9001\u8fde\u63a5\u8bf7\u6c42\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        \/\/ \u63a5\u6536\u8fde\u63a5\u54cd\u5e94\r\n        unsigned char connect_response[10];\r\n        int bytes_received = recv(sockfd, connect_response, 10, 0);\r\n        if (bytes_received < 2) {\r\n            std::cerr << \"\u63a5\u6536\u8fde\u63a5\u54cd\u5e94\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        if (connect_response[0] != 0x05 || connect_response[1] != 0x00) {\r\n            std::cerr << \"SOCKS5\u8fde\u63a5\u5931\u8d25\uff0c\u4ee3\u7801: \" << (int)connect_response[1] << std::endl;\r\n            return false;\r\n        }\r\n\r\n        std::cout << \"\u901a\u8fc7SOCKS5\u4ee3\u7406\u6210\u529f\u8fde\u63a5\u5230\u76ee\u6807\u670d\u52a1\u5668\" << std::endl;\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * \u901a\u8fc7SOCKS5\u4ee3\u7406\u53d1\u9001HTTP\u8bf7\u6c42\r\n     *\/\r\n    void sendHttpRequestViaSocks5(const std::string& target_host, int target_port, const std::string& path = \"\/ip\") {\r\n        std::cout << \"=== \u901a\u8fc7SOCKS5\u4ee3\u7406\u53d1\u9001HTTP\u8bf7\u6c42 ===\" << std::endl;\r\n\r\n        int sockfd = connectToSocks5Proxy();\r\n        if (sockfd < 0) return;\r\n\r\n        if (!socks5Authenticate(sockfd)) {\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        if (!socks5ConnectToTarget(sockfd, target_host, target_port)) {\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        \/\/ \u53d1\u9001HTTP\u8bf7\u6c42\r\n        std::string http_request = \r\n            \"GET \" + path + \" HTTP\/1.1\\r\\n\"\r\n            \"Host: \" + target_host + \"\\r\\n\"\r\n            \"User-Agent: C++-SOCKS5-Proxy\/1.0\\r\\n\"\r\n            \"Connection: close\\r\\n\"\r\n            \"\\r\\n\";\r\n\r\n        if (send(sockfd, http_request.c_str(), http_request.length(), 0) < 0) {\r\n            std::cerr << \"\u53d1\u9001HTTP\u8bf7\u6c42\u5931\u8d25\" << std::endl;\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        \/\/ \u63a5\u6536HTTP\u54cd\u5e94\r\n        std::cout << \"HTTP\u54cd\u5e94:\" << std::endl;\r\n        char buffer[4096];\r\n        int bytes_received;\r\n        while ((bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) > 0) {\r\n            buffer[bytes_received] = '\\0';\r\n            std::cout << buffer;\r\n        }\r\n\r\n        close(sockfd);\r\n        std::cout << std::endl;\r\n    }\r\n\r\n    \/**\r\n     * \u8fd0\u884cSOCKS5\u6f14\u793a\r\n     *\/\r\n    void runDemo() {\r\n        std::cout << \"\u5f00\u59cbSOCKS5\u4ee3\u7406\u6d4b\u8bd5...\" << std::endl;\r\n\r\n        \/\/ \u6d4b\u8bd5\u8fde\u63a5\u5230httpbin.org\r\n        sendHttpRequestViaSocks5(\"httpbin.org\", 80, \"\/ip\");\r\n        \r\n        std::cout << std::endl;\r\n        sendHttpRequestViaSocks5(\"httpbin.org\", 80, \"\/user-agent\");\r\n        \r\n        std::cout << std::endl;\r\n        sendHttpRequestViaSocks5(\"httpbin.org\", 80, \"\/headers\");\r\n\r\n        std::cout << \"SOCKS5\u4ee3\u7406\u6d4b\u8bd5\u5b8c\u6210!\" << std::endl;\r\n    }\r\n};\r\n\r\nint main() {\r\n    Socks5ProxyDemo demo;\r\n    demo.runDemo();\r\n    return 0;\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5aaf799 elementor-widget elementor-widget-heading\" data-id=\"5aaf799\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">2. HTTP\u4ee3\u7406\u793a\u4f8b\uff1ahttp_proxy_demo.cpp<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-39a0f9a elementor-widget elementor-widget-code-highlight\" data-id=\"39a0f9a\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp \">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>\/**\r\n * HTTP\u4ee3\u7406\u6f14\u793a - C++\r\n *\/\r\n\r\n#include <iostream>\r\n#include <string>\r\n#include <cstring>\r\n#include <sys\/socket.h>\r\n#include <netinet\/in.h>\r\n#include <arpa\/inet.h>\r\n#include <unistd.h>\r\n#include <netdb.h>\r\n#include <vector>\r\n#include <sstream>\r\n#include <iomanip>\r\n#include <base64.h>\r\n\r\nclass HttpProxyDemo {\r\nprivate:\r\n    std::string proxy_host = \"proxy.ipnut.com\";\r\n    int proxy_port = 28001;\r\n    std::string proxy_username = \"ipnut\";\r\n    std::string proxy_password = \"123456789\";\r\n\r\n    \/**\r\n     * Base64\u7f16\u7801\r\n     *\/\r\n    std::string base64_encode(const std::string &input) {\r\n        static const std::string base64_chars = \r\n            \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\r\n            \"abcdefghijklmnopqrstuvwxyz\"\r\n            \"0123456789+\/\";\r\n\r\n        std::string encoded;\r\n        int i = 0;\r\n        int j = 0;\r\n        unsigned char char_array_3[3];\r\n        unsigned char char_array_4[4];\r\n\r\n        for (size_t idx = 0; idx < input.size(); idx++) {\r\n            char_array_3[i++] = input[idx];\r\n            if (i == 3) {\r\n                char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;\r\n                char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);\r\n                char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);\r\n                char_array_4[3] = char_array_3[2] & 0x3f;\r\n\r\n                for(i = 0; i < 4; i++)\r\n                    encoded += base64_chars[char_array_4[i]];\r\n                i = 0;\r\n            }\r\n        }\r\n\r\n        if (i) {\r\n            for(j = i; j < 3; j++)\r\n                char_array_3[j] = '\\0';\r\n\r\n            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;\r\n            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);\r\n            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);\r\n            char_array_4[3] = char_array_3[2] & 0x3f;\r\n\r\n            for (j = 0; j < i + 1; j++)\r\n                encoded += base64_chars[char_array_4[j]];\r\n\r\n            while(i++ < 3)\r\n                encoded += '=';\r\n        }\r\n\r\n        return encoded;\r\n    }\r\n\r\npublic:\r\n    \/**\r\n     * \u8fde\u63a5\u5230HTTP\u4ee3\u7406\u670d\u52a1\u5668\r\n     *\/\r\n    int connectToHttpProxy() {\r\n        int sockfd = socket(AF_INET, SOCK_STREAM, 0);\r\n        if (sockfd < 0) {\r\n            std::cerr << \"\u521b\u5efasocket\u5931\u8d25\" << std::endl;\r\n            return -1;\r\n        }\r\n\r\n        \/\/ \u89e3\u6790\u4ee3\u7406\u670d\u52a1\u5668\u5730\u5740\r\n        struct hostent* he = gethostbyname(proxy_host.c_str());\r\n        if (he == nullptr) {\r\n            std::cerr << \"\u89e3\u6790\u4ee3\u7406\u670d\u52a1\u5668\u5730\u5740\u5931\u8d25\" << std::endl;\r\n            close(sockfd);\r\n            return -1;\r\n        }\r\n\r\n        struct sockaddr_in proxy_addr;\r\n        memset(&proxy_addr, 0, sizeof(proxy_addr));\r\n        proxy_addr.sin_family = AF_INET;\r\n        proxy_addr.sin_port = htons(proxy_port);\r\n        memcpy(&proxy_addr.sin_addr, he->h_addr_list[0], he->h_length);\r\n\r\n        \/\/ \u8fde\u63a5\u5230\u4ee3\u7406\u670d\u52a1\u5668\r\n        if (connect(sockfd, (struct sockaddr*)&proxy_addr, sizeof(proxy_addr)) < 0) {\r\n            std::cerr << \"\u8fde\u63a5\u5230\u4ee3\u7406\u670d\u52a1\u5668\u5931\u8d25\" << std::endl;\r\n            close(sockfd);\r\n            return -1;\r\n        }\r\n\r\n        std::cout << \"\u6210\u529f\u8fde\u63a5\u5230HTTP\u4ee3\u7406\u670d\u52a1\u5668\" << std::endl;\r\n        return sockfd;\r\n    }\r\n\r\n    \/**\r\n     * \u901a\u8fc7HTTP\u4ee3\u7406\u53d1\u9001CONNECT\u8bf7\u6c42\r\n     *\/\r\n    bool httpProxyConnect(int sockfd, const std::string& target_host, int target_port) {\r\n        \/\/ \u6784\u5efa\u4ee3\u7406\u8ba4\u8bc1\u5934\r\n        std::string auth = proxy_username + \":\" + proxy_password;\r\n        std::string encoded_auth = base64_encode(auth);\r\n\r\n        \/\/ \u53d1\u9001CONNECT\u8bf7\u6c42\r\n        std::string connect_request = \r\n            \"CONNECT \" + target_host + \":\" + std::to_string(target_port) + \" HTTP\/1.1\\r\\n\"\r\n            \"Host: \" + target_host + \":\" + std::to_string(target_port) + \"\\r\\n\"\r\n            \"Proxy-Authorization: Basic \" + encoded_auth + \"\\r\\n\"\r\n            \"User-Agent: C++-HTTP-Proxy\/1.0\\r\\n\"\r\n            \"Connection: keep-alive\\r\\n\"\r\n            \"\\r\\n\";\r\n\r\n        if (send(sockfd, connect_request.c_str(), connect_request.length(), 0) < 0) {\r\n            std::cerr << \"\u53d1\u9001CONNECT\u8bf7\u6c42\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        \/\/ \u8bfb\u53d6\u4ee3\u7406\u54cd\u5e94\r\n        char buffer[4096];\r\n        int bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0);\r\n        if (bytes_received <= 0) {\r\n            std::cerr << \"\u63a5\u6536\u4ee3\u7406\u54cd\u5e94\u5931\u8d25\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        buffer[bytes_received] = '\\0';\r\n        std::string response(buffer);\r\n\r\n        \/\/ \u68c0\u67e5\u54cd\u5e94\u72b6\u6001\r\n        if (response.find(\"HTTP\/1.1 200\") == std::string::npos && \r\n            response.find(\"HTTP\/1.0 200\") == std::string::npos) {\r\n            std::cerr << \"\u4ee3\u7406\u8fde\u63a5\u5931\u8d25\uff0c\u54cd\u5e94: \" << response << std::endl;\r\n            return false;\r\n        }\r\n\r\n        std::cout << \"\u901a\u8fc7HTTP\u4ee3\u7406\u6210\u529f\u8fde\u63a5\u5230\u76ee\u6807\u670d\u52a1\u5668\" << std::endl;\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * \u901a\u8fc7HTTP\u4ee3\u7406\u53d1\u9001HTTP\u8bf7\u6c42\r\n     *\/\r\n    void sendHttpRequestViaProxy(const std::string& target_host, int target_port, const std::string& path = \"\/ip\") {\r\n        std::cout << \"=== \u901a\u8fc7HTTP\u4ee3\u7406\u53d1\u9001HTTP\u8bf7\u6c42 ===\" << std::endl;\r\n\r\n        int sockfd = connectToHttpProxy();\r\n        if (sockfd < 0) return;\r\n\r\n        if (!httpProxyConnect(sockfd, target_host, target_port)) {\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        \/\/ \u53d1\u9001HTTP\u8bf7\u6c42\r\n        std::string http_request = \r\n            \"GET \" + path + \" HTTP\/1.1\\r\\n\"\r\n            \"Host: \" + target_host + \"\\r\\n\"\r\n            \"User-Agent: C++-HTTP-Proxy\/1.0\\r\\n\"\r\n            \"Accept: application\/json\\r\\n\"\r\n            \"Connection: close\\r\\n\"\r\n            \"\\r\\n\";\r\n\r\n        if (send(sockfd, http_request.c_str(), http_request.length(), 0) < 0) {\r\n            std::cerr << \"\u53d1\u9001HTTP\u8bf7\u6c42\u5931\u8d25\" << std::endl;\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        \/\/ \u63a5\u6536HTTP\u54cd\u5e94\r\n        std::cout << \"HTTP\u54cd\u5e94:\" << std::endl;\r\n        char buffer[4096];\r\n        int bytes_received;\r\n        while ((bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) > 0) {\r\n            buffer[bytes_received] = '\\0';\r\n            std::cout << buffer;\r\n        }\r\n\r\n        close(sockfd);\r\n        std::cout << std::endl;\r\n    }\r\n\r\n    \/**\r\n     * \u4f7f\u7528HTTP\u4ee3\u7406\u53d1\u9001GET\u8bf7\u6c42\uff08\u76f4\u63a5\u65b9\u5f0f\uff09\r\n     *\/\r\n    void sendGetRequestViaProxy(const std::string& target_url) {\r\n        std::cout << \"=== \u4f7f\u7528HTTP\u4ee3\u7406\u53d1\u9001GET\u8bf7\u6c42\uff08\u76f4\u63a5\u65b9\u5f0f\uff09 ===\" << std::endl;\r\n\r\n        int sockfd = connectToHttpProxy();\r\n        if (sockfd < 0) return;\r\n\r\n        \/\/ \u6784\u5efa\u4ee3\u7406\u8ba4\u8bc1\u5934\r\n        std::string auth = proxy_username + \":\" + proxy_password;\r\n        std::string encoded_auth = base64_encode(auth);\r\n\r\n        \/\/ \u53d1\u9001\u5b8c\u6574\u7684HTTP\u8bf7\u6c42\uff08\u4ee3\u7406\u4f1a\u8f6c\u53d1\uff09\r\n        std::string http_request = \r\n            \"GET \" + target_url + \" HTTP\/1.1\\r\\n\"\r\n            \"Host: httpbin.org\\r\\n\"\r\n            \"User-Agent: C++-HTTP-Proxy-Direct\/1.0\\r\\n\"\r\n            \"Proxy-Authorization: Basic \" + encoded_auth + \"\\r\\n\"\r\n            \"Accept: application\/json\\r\\n\"\r\n            \"Connection: close\\r\\n\"\r\n            \"\\r\\n\";\r\n\r\n        if (send(sockfd, http_request.c_str(), http_request.length(), 0) < 0) {\r\n            std::cerr << \"\u53d1\u9001HTTP\u8bf7\u6c42\u5931\u8d25\" << std::endl;\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        \/\/ \u63a5\u6536\u54cd\u5e94\r\n        std::cout << \"HTTP\u54cd\u5e94:\" << std::endl;\r\n        char buffer[4096];\r\n        int bytes_received;\r\n        while ((bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) > 0) {\r\n            buffer[bytes_received] = '\\0';\r\n            std::cout << buffer;\r\n        }\r\n\r\n        close(sockfd);\r\n        std::cout << std::endl;\r\n    }\r\n\r\n    \/**\r\n     * \u8fd0\u884cHTTP\u4ee3\u7406\u6f14\u793a\r\n     *\/\r\n    void runDemo() {\r\n        std::cout << \"\u5f00\u59cbHTTP\u4ee3\u7406\u6d4b\u8bd5...\" << std::endl;\r\n\r\n        \/\/ \u6d4b\u8bd5CONNECT\u65b9\u5f0f\r\n        sendHttpRequestViaProxy(\"httpbin.org\", 80, \"\/ip\");\r\n        \r\n        std::cout << std::endl;\r\n        sendHttpRequestViaProxy(\"httpbin.org\", 80, \"\/user-agent\");\r\n\r\n        \/\/ \u6d4b\u8bd5\u76f4\u63a5\u65b9\u5f0f\r\n        std::cout << std::endl;\r\n        sendGetRequestViaProxy(\"http:\/\/httpbin.org\/headers\");\r\n\r\n        std::cout << \"HTTP\u4ee3\u7406\u6d4b\u8bd5\u5b8c\u6210!\" << std::endl;\r\n    }\r\n};\r\n\r\nint main() {\r\n    HttpProxyDemo demo;\r\n    demo.runDemo();\r\n    return 0;\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-67496ae elementor-widget elementor-widget-heading\" data-id=\"67496ae\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">3. \u4ee3\u7406\u6d4b\u8bd5\u5de5\u5177\uff1aproxy_test_tool.cpp<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1e3d3dc elementor-widget elementor-widget-code-highlight\" data-id=\"1e3d3dc\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp \">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>\/**\r\n * \u4ee3\u7406\u6d4b\u8bd5\u5de5\u5177 - C++\r\n *\/\r\n\r\n#include <iostream>\r\n#include <string>\r\n#include \"socks5_proxy_demo.cpp\"\r\n#include \"http_proxy_demo.cpp\"\r\n\r\nclass ProxyTestTool {\r\npublic:\r\n    \/**\r\n     * \u6d4b\u8bd5SOCKS5\u4ee3\u7406\r\n     *\/\r\n    void testSocks5Proxy() {\r\n        std::cout << \"\u6d4b\u8bd5 SOCKS5 \u4ee3\u7406:\" << std::endl;\r\n        \r\n        Socks5ProxyDemo socks5Demo;\r\n        \r\n        \/\/ \u7b80\u5316\u6d4b\u8bd5 - \u53ea\u6d4b\u8bd5\u8fde\u63a5\u548c\u8ba4\u8bc1\r\n        int sockfd = socks5Demo.connectToSocks5Proxy();\r\n        if (sockfd >= 0) {\r\n            if (socks5Demo.socks5Authenticate(sockfd)) {\r\n                std::cout << \"\u2705 SOCKS5 \u4ee3\u7406\u8fde\u63a5\u6210\u529f\" << std::endl;\r\n            } else {\r\n                std::cout << \"\u274c SOCKS5 \u4ee3\u7406\u8ba4\u8bc1\u5931\u8d25\" << std::endl;\r\n            }\r\n            close(sockfd);\r\n        } else {\r\n            std::cout << \"\u274c SOCKS5 \u4ee3\u7406\u8fde\u63a5\u5931\u8d25\" << std::endl;\r\n        }\r\n    }\r\n\r\n    \/**\r\n     * \u6d4b\u8bd5HTTP\u4ee3\u7406\r\n     *\/\r\n    void testHttpProxy() {\r\n        std::cout << \"\\n\u6d4b\u8bd5 HTTP \u4ee3\u7406:\" << std::endl;\r\n        \r\n        HttpProxyDemo httpDemo;\r\n        \r\n        int sockfd = httpDemo.connectToHttpProxy();\r\n        if (sockfd >= 0) {\r\n            std::cout << \"\u2705 HTTP \u4ee3\u7406\u8fde\u63a5\u6210\u529f\" << std::endl;\r\n            close(sockfd);\r\n        } else {\r\n            std::cout << \"\u274c HTTP \u4ee3\u7406\u8fde\u63a5\u5931\u8d25\" << std::endl;\r\n        }\r\n    }\r\n\r\n    \/**\r\n     * \u8fd0\u884c\u6d4b\u8bd5\r\n     *\/\r\n    void runTests() {\r\n        std::cout << \"=== \u4ee3\u7406\u6d4b\u8bd5\u5de5\u5177 ===\" << std::endl;\r\n        \r\n        testSocks5Proxy();\r\n        testHttpProxy();\r\n        \r\n        std::cout << \"\\n\u4ee3\u7406\u6d4b\u8bd5\u5b8c\u6210!\" << std::endl;\r\n    }\r\n};\r\n\r\nint main() {\r\n    ProxyTestTool tool;\r\n    tool.runTests();\r\n    return 0;\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7fb5e6b elementor-widget elementor-widget-heading\" data-id=\"7fb5e6b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">4. Makefile<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b849db5 elementor-widget elementor-widget-code-highlight\" data-id=\"b849db5\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp \">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp># Makefile for C++ Proxy Demo\r\n\r\nCXX = g++\r\nCXXFLAGS = -std=c++11 -Wall -Wextra -O2\r\nTARGETS = socks5_demo http_demo proxy_test\r\n\r\nall: $(TARGETS)\r\n\r\nsocks5_demo: socks5_proxy_demo.cpp\r\n\t$(CXX) $(CXXFLAGS) -o socks5_demo socks5_proxy_demo.cpp\r\n\r\nhttp_demo: http_proxy_demo.cpp\r\n\t$(CXX) $(CXXFLAGS) -o http_demo http_proxy_demo.cpp\r\n\r\nproxy_test: proxy_test_tool.cpp\r\n\t$(CXX) $(CXXFLAGS) -o proxy_test proxy_test_tool.cpp\r\n\r\nclean:\r\n\trm -f $(TARGETS)\r\n\r\n.PHONY: all clean<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ac7bb8 elementor-widget elementor-widget-heading\" data-id=\"3ac7bb8\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">5. \u7f16\u8bd1\u548c\u8fd0\u884c\u8bf4\u660e\uff1a\u7f16\u8bd1\u547d\u4ee4<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-51dd9e5 elementor-widget elementor-widget-code-highlight\" data-id=\"51dd9e5\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp \">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp># \u7f16\u8bd1\u6240\u6709\u76ee\u6807\r\nmake all\r\n\r\n# \u6216\u5206\u522b\u7f16\u8bd1\r\nmake socks5_demo\r\nmake http_demo\r\nmake proxy_test\r\n\r\n# \u6216\u624b\u52a8\u7f16\u8bd1\r\ng++ -std=c++11 -Wall -Wextra -O2 -o socks5_demo socks5_proxy_demo.cpp\r\ng++ -std=c++11 -Wall -Wextra -O2 -o http_demo http_proxy_demo.cpp\r\ng++ -std=c++11 -Wall -Wextra -O2 -o proxy_test proxy_test_tool.cpp<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0892d45 elementor-widget elementor-widget-heading\" data-id=\"0892d45\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">6. \u8fd0\u884c\u547d\u4ee4\uff1a<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2b26c31 elementor-widget elementor-widget-code-highlight\" data-id=\"2b26c31\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp \">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp># \u8fd0\u884cSOCKS5\u4ee3\u7406\u6f14\u793a\r\n.\/socks5_demo\r\n\r\n# \u8fd0\u884cHTTP\u4ee3\u7406\u6f14\u793a\r\n.\/http_demo\r\n\r\n# \u8fd0\u884c\u4ee3\u7406\u6d4b\u8bd5\u5de5\u5177\r\n.\/proxy_test<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u901a\u8fc7C\/C++\u8bed\u8a00\u914d\u7f6eIPNut \u4ee3\u7406\uff1a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"doc_category":[43],"doc_tag":[112,61,114,77,88],"class_list":["post-692","docs","type-docs","status-publish","hentry","doc_category-kai-fa-wen-dang","doc_tag-ipv4","doc_tag-ip","doc_tag-isp","doc_tag-static-residential-cn","doc_tag-88"],"year_month":"2026-05","word_count":68,"total_views":0,"reactions":{"happy":0,"normal":0,"sad":0},"author_info":{"name":"admin","author_nicename":"admin","author_url":"https:\/\/help.ipnut.com\/author\/admin\/"},"doc_category_info":[{"term_name":"\u5f00\u53d1\u6587\u6863","term_url":"https:\/\/help.ipnut.com\/cn\/docs\/kai-fa-wen-dang\/"}],"doc_tag_info":[{"term_name":"IPv4","term_url":"https:\/\/help.ipnut.com\/cn\/docs-tag\/ipv4\/"},{"term_name":"IP\u4ee3\u7406","term_url":"https:\/\/help.ipnut.com\/cn\/docs-tag\/ip%e4%bb%a3%e7%90%86\/"},{"term_name":"ISP","term_url":"https:\/\/help.ipnut.com\/cn\/docs-tag\/isp\/"},{"term_name":"\u9759\u6001\u4f4f\u5b85","term_url":"https:\/\/help.ipnut.com\/cn\/docs-tag\/static-residential-cn\/"},{"term_name":"\u9759\u6001\u6570\u636e\u4e2d\u5fc3","term_url":"https:\/\/help.ipnut.com\/cn\/docs-tag\/%e9%9d%99%e6%80%81%e6%95%b0%e6%8d%ae%e4%b8%ad%e5%bf%83\/"}],"lang":"cn","translations":{"cn":692,"en":831},"knowledge_base_info":[],"knowledge_base_slug":[],"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/docs\/692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/comments?post=692"}],"version-history":[{"count":10,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/docs\/692\/revisions"}],"predecessor-version":[{"id":713,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/docs\/692\/revisions\/713"}],"wp:attachment":[{"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/media?parent=692"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/doc_category?post=692"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/doc_tag?post=692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}