{"id":831,"date":"2025-11-19T12:15:23","date_gmt":"2025-11-19T04:15:23","guid":{"rendered":"https:\/\/help.ipnut.com\/?post_type=docs&#038;p=831"},"modified":"2025-11-23T18:27:55","modified_gmt":"2025-11-23T10:27:55","password":"","slug":"c-c-integration-demo-ipnut-proxy-configuration-via-c-c","status":"publish","type":"docs","link":"https:\/\/www.ipnut.com\/help\/development-documentation\/c-c-integration-demo-ipnut-proxy-configuration-via-c-c\/","title":{"rendered":"C\/C++ Integration Demo IPNut Proxy Configuration via C\/C++"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"831\" class=\"elementor elementor-831\" 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 class=\"ds-markdown-paragraph\">After purchasing static IP services from IPNut platform, use the following C++ code samples for integration.<\/p><hr \/>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-113c7db elementor-widget elementor-widget-heading\" data-id=\"113c7db\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">1. <span style=\"font-size: 16px\">Project Structure &amp; Build System<\/span><\/h6>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-91f3b1b elementor-widget elementor-widget-code-highlight\" data-id=\"91f3b1b\" 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>\/* Directory Structure:\r\ncpp-proxy-demo\/\r\n\u251c\u2500\u2500 include\/\r\n\u2502   \u251c\u2500\u2500 base64.h\r\n\u2502   \u2514\u2500\u2500 proxy_common.h\r\n\u251c\u2500\u2500 src\/\r\n\u2502   \u251c\u2500\u2500 socks5_proxy_demo.cpp\r\n\u2502   \u251c\u2500\u2500 http_proxy_demo.cpp\r\n\u2502   \u251c\u2500\u2500 proxy_test_tool.cpp\r\n\u2502   \u2514\u2500\u2500 main.cpp\r\n\u251c\u2500\u2500 Makefile\r\n\u2514\u2500\u2500 README.md *\/\r\n\r\n\/\/ Makefile\r\n\/\/ Makefile for IPNut C++ Proxy Demo\r\n\r\nCXX = g++\r\nCXXFLAGS = -std=c++11 -Wall -Wextra -O2 -I.\/include\r\nTARGETS = socks5_demo http_demo proxy_test main_demo\r\n\r\nall: $(TARGETS)\r\n\r\nsocks5_demo: src\/socks5_proxy_demo.cpp\r\n\t$(CXX) $(CXXFLAGS) -o bin\/socks5_demo src\/socks5_proxy_demo.cpp\r\n\r\nhttp_demo: src\/http_proxy_demo.cpp\r\n\t$(CXX) $(CXXFLAGS) -o bin\/http_demo src\/http_proxy_demo.cpp\r\n\r\nproxy_test: src\/proxy_test_tool.cpp\r\n\t$(CXX) $(CXXFLAGS) -o bin\/proxy_test src\/proxy_test_tool.cpp\r\n\r\nmain_demo: src\/main.cpp src\/socks5_proxy_demo.cpp src\/http_proxy_demo.cpp src\/proxy_test_tool.cpp\r\n\t$(CXX) $(CXXFLAGS) -o bin\/main_demo src\/main.cpp src\/socks5_proxy_demo.cpp src\/http_proxy_demo.cpp src\/proxy_test_tool.cpp\r\n\r\nclean:\r\n\trm -rf bin\/*\r\n\r\ninstall:\r\n\tmkdir -p bin\r\n\r\n.PHONY: all clean install<\/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-f2cd8df elementor-widget elementor-widget-heading\" data-id=\"f2cd8df\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">2. Common Headers &amp; Utilities<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-864949d elementor-widget elementor-widget-code-highlight\" data-id=\"864949d\" 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>\/\/ include\/base64.h\r\n\/**\r\n * Base64 Encoding Utility for IPNut Proxy Authentication\r\n *\/\r\n\r\n#ifndef BASE64_H\r\n#define BASE64_H\r\n\r\n#include <string>\r\n#include <vector>\r\n\r\nclass Base64 {\r\npublic:\r\n    static std::string 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\n\r\n#endif<\/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-004b673 elementor-widget elementor-widget-code-highlight\" data-id=\"004b673\" 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>\/\/ include\/proxy_common.h\r\n\/**\r\n * Common definitions for IPNut Proxy Integration\r\n *\/\r\n\r\n#ifndef PROXY_COMMON_H\r\n#define PROXY_COMMON_H\r\n\r\n#include <iostream>\r\n#include <string>\r\n#include <vector>\r\n\r\n\/\/ Proxy Configuration\r\nstruct ProxyConfig {\r\n    std::string host = \"proxy.ipnut.com\";\r\n    int port = 28001;\r\n    std::string username = \"ipnut\";\r\n    std::string password = \"123456789\";\r\n    int timeout_seconds = 30;\r\n};\r\n\r\n\/\/ Network utilities\r\nclass NetworkUtils {\r\npublic:\r\n    static bool resolveHostname(const std::string& hostname, std::string& ip_address) {\r\n        struct hostent* he = gethostbyname(hostname.c_str());\r\n        if (he == nullptr) return false;\r\n        \r\n        ip_address = inet_ntoa(*(struct in_addr*)he->h_addr);\r\n        return true;\r\n    }\r\n    \r\n    static void printHex(const std::vector<unsigned char>& data, const std::string& label = \"\") {\r\n        if (!label.empty()) {\r\n            std::cout << label << \": \";\r\n        }\r\n        for (unsigned char byte : data) {\r\n            std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)byte << \" \";\r\n        }\r\n        std::cout << std::dec << std::endl;\r\n    }\r\n};\r\n\r\n#endif<\/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-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\">3. SOCKS5 Proxy Implementation\nsrc\/socks5_proxy_demo.cpp<\/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 * IPNut SOCKS5 Proxy Integration - 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 \"..\/include\/proxy_common.h\"\r\n\r\nclass Socks5ProxyDemo {\r\nprivate:\r\n    ProxyConfig config;\r\n\r\npublic:\r\n    Socks5ProxyDemo() = default;\r\n    \r\n    explicit Socks5ProxyDemo(const ProxyConfig& cfg) : config(cfg) {}\r\n\r\n    \/**\r\n     * Connect to SOCKS5 proxy server\r\n     *\/\r\n    int connectToProxy() {\r\n        int sockfd = socket(AF_INET, SOCK_STREAM, 0);\r\n        if (sockfd < 0) {\r\n            std::cerr << \"\u274c Failed to create socket\" << std::endl;\r\n            return -1;\r\n        }\r\n\r\n        \/\/ Set socket timeout\r\n        struct timeval timeout;\r\n        timeout.tv_sec = config.timeout_seconds;\r\n        timeout.tv_usec = 0;\r\n        setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));\r\n        setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));\r\n\r\n        \/\/ Resolve proxy server address\r\n        struct hostent* he = gethostbyname(config.host.c_str());\r\n        if (he == nullptr) {\r\n            std::cerr << \"\u274c Failed to resolve proxy host: \" << config.host << 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(config.port);\r\n        memcpy(&proxy_addr.sin_addr, he->h_addr_list[0], he->h_length);\r\n\r\n        std::cout << \"\ud83d\udd17 Connecting to SOCKS5 proxy: \" << config.host << \":\" << config.port << std::endl;\r\n\r\n        \/\/ Connect to proxy server\r\n        if (connect(sockfd, (struct sockaddr*)&proxy_addr, sizeof(proxy_addr)) < 0) {\r\n            std::cerr << \"\u274c Failed to connect to SOCKS5 proxy\" << std::endl;\r\n            close(sockfd);\r\n            return -1;\r\n        }\r\n\r\n        std::cout << \"\u2705 Successfully connected to SOCKS5 proxy server\" << std::endl;\r\n        return sockfd;\r\n    }\r\n\r\n    \/**\r\n     * SOCKS5 authentication handshake\r\n     *\/\r\n    bool authenticate(int sockfd) {\r\n        std::cout << \"\ud83d\udd10 Starting SOCKS5 authentication...\" << std::endl;\r\n\r\n        \/\/ SOCKS5 handshake packet\r\n        std::vector<unsigned char> handshake = {\r\n            0x05, \/\/ SOCKS version 5\r\n            0x02, \/\/ Number of authentication methods\r\n            0x00, \/\/ No authentication\r\n            0x02  \/\/ Username\/password authentication\r\n        };\r\n\r\n        NetworkUtils::printHex(handshake, \"Sending handshake\");\r\n\r\n        if (send(sockfd, handshake.data(), handshake.size(), 0) < 0) {\r\n            std::cerr << \"\u274c Failed to send handshake packet\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        \/\/ Receive server response\r\n        unsigned char response[2];\r\n        if (recv(sockfd, response, 2, 0) < 2) {\r\n            std::cerr << \"\u274c Failed to receive handshake response\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        NetworkUtils::printHex(std::vector<unsigned char>(response, response + 2), \"Handshake response\");\r\n\r\n        if (response[0] != 0x05) {\r\n            std::cerr << \"\u274c Unsupported SOCKS version: \" << (int)response[0] << std::endl;\r\n            return false;\r\n        }\r\n\r\n        \/\/ Handle authentication method\r\n        if (response[1] == 0x02) {\r\n            return authenticateUsernamePassword(sockfd);\r\n        } else if (response[1] != 0x00) {\r\n            std::cerr << \"\u274c Unsupported authentication method: \" << (int)response[1] << std::endl;\r\n            return false;\r\n        }\r\n\r\n        std::cout << \"\u2705 SOCKS5 authentication successful (no auth required)\" << std::endl;\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * SOCKS5 username\/password authentication\r\n     *\/\r\n    bool authenticateUsernamePassword(int sockfd) {\r\n        std::vector<unsigned char> auth_packet;\r\n        auth_packet.push_back(0x01); \/\/ Authentication version\r\n        auth_packet.push_back(static_cast<unsigned char>(config.username.length()));\r\n        auth_packet.insert(auth_packet.end(), config.username.begin(), config.username.end());\r\n        auth_packet.push_back(static_cast<unsigned char>(config.password.length()));\r\n        auth_packet.insert(auth_packet.end(), config.password.begin(), config.password.end());\r\n\r\n        NetworkUtils::printHex(auth_packet, \"Sending auth packet\");\r\n\r\n        if (send(sockfd, auth_packet.data(), auth_packet.size(), 0) < 0) {\r\n            std::cerr << \"\u274c Failed to send authentication packet\" << 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 << \"\u274c Failed to receive authentication response\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        NetworkUtils::printHex(std::vector<unsigned char>(auth_response, auth_response + 2), \"Auth response\");\r\n\r\n        if (auth_response[0] != 0x01 || auth_response[1] != 0x00) {\r\n            std::cerr << \"\u274c SOCKS5 authentication failed\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        std::cout << \"\u2705 SOCKS5 username\/password authentication successful\" << std::endl;\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * Connect to target server through SOCKS5 proxy\r\n     *\/\r\n    bool connectToTarget(int sockfd, const std::string& target_host, int target_port) {\r\n        std::cout << \"\ud83c\udfaf Connecting to target: \" << target_host << \":\" << target_port << std::endl;\r\n\r\n        std::vector<unsigned char> connect_packet;\r\n        connect_packet.push_back(0x05); \/\/ SOCKS version\r\n        connect_packet.push_back(0x01); \/\/ CONNECT command\r\n        connect_packet.push_back(0x00); \/\/ Reserved\r\n\r\n        \/\/ Domain name type (recommended for hostnames)\r\n        connect_packet.push_back(0x03); \/\/ Domain name\r\n        connect_packet.push_back(static_cast<unsigned char>(target_host.length()));\r\n        connect_packet.insert(connect_packet.end(), target_host.begin(), target_host.end());\r\n\r\n        \/\/ Port (big-endian)\r\n        connect_packet.push_back((target_port >> 8) & 0xFF);\r\n        connect_packet.push_back(target_port & 0xFF);\r\n\r\n        NetworkUtils::printHex(connect_packet, \"Sending connect request\");\r\n\r\n        if (send(sockfd, connect_packet.data(), connect_packet.size(), 0) < 0) {\r\n            std::cerr << \"\u274c Failed to send connect request\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        \/\/ Receive connection response\r\n        unsigned char connect_response[10];\r\n        int bytes_received = recv(sockfd, connect_response, sizeof(connect_response), 0);\r\n        if (bytes_received < 2) {\r\n            std::cerr << \"\u274c Failed to receive connect response\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        NetworkUtils::printHex(std::vector<unsigned char>(connect_response, connect_response + bytes_received), \"Connect response\");\r\n\r\n        if (connect_response[0] != 0x05 || connect_response[1] != 0x00) {\r\n            std::cerr << \"\u274c SOCKS5 connection failed with code: \" << (int)connect_response[1] << std::endl;\r\n            return false;\r\n        }\r\n\r\n        std::cout << \"\u2705 Successfully connected to target through SOCKS5 proxy\" << std::endl;\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * Send HTTP request through SOCKS5 proxy\r\n     *\/\r\n    bool sendHttpRequest(int sockfd, const std::string& target_host, const std::string& path = \"\/ip\") {\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: IPNut-C++-SOCKS5\/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        std::cout << \"\ud83d\udce4 Sending HTTP request to: \" << target_host << path << std::endl;\r\n\r\n        if (send(sockfd, http_request.c_str(), http_request.length(), 0) < 0) {\r\n            std::cerr << \"\u274c Failed to send HTTP request\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * Receive HTTP response\r\n     *\/\r\n    std::string receiveHttpResponse(int sockfd) {\r\n        std::string response;\r\n        char buffer[4096];\r\n        int bytes_received;\r\n\r\n        std::cout << \"\ud83d\udce5 Receiving HTTP response...\" << std::endl;\r\n\r\n        while ((bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) > 0) {\r\n            buffer[bytes_received] = '\\0';\r\n            response += buffer;\r\n        }\r\n\r\n        return response;\r\n    }\r\n\r\n    \/**\r\n     * Complete HTTP request through SOCKS5 proxy\r\n     *\/\r\n    void performHttpRequest(const std::string& target_host, int target_port, const std::string& path = \"\/ip\") {\r\n        std::cout << \"\\n=== \ud83c\udf10 SOCKS5 Proxy HTTP Request ===\" << std::endl;\r\n        std::cout << \"Target: \" << target_host << \":\" << target_port << path << std::endl;\r\n\r\n        int sockfd = connectToProxy();\r\n        if (sockfd < 0) return;\r\n\r\n        if (!authenticate(sockfd)) {\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        if (!connectToTarget(sockfd, target_host, target_port)) {\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        if (!sendHttpRequest(sockfd, target_host, path)) {\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        std::string response = receiveHttpResponse(sockfd);\r\n        std::cout << \"\ud83d\udcc4 HTTP Response:\" << std::endl;\r\n        std::cout << response << std::endl;\r\n\r\n        close(sockfd);\r\n    }\r\n\r\n    \/**\r\n     * Run comprehensive SOCKS5 demo\r\n     *\/\r\n    void runDemo() {\r\n        std::cout << \"\ud83d\ude80 Starting IPNut SOCKS5 Proxy Demo\" << std::endl;\r\n        std::cout << \"===================================\" << std::endl;\r\n\r\n        \/\/ Test various endpoints\r\n        performHttpRequest(\"httpbin.org\", 80, \"\/ip\");\r\n        performHttpRequest(\"httpbin.org\", 80, \"\/user-agent\");\r\n        performHttpRequest(\"httpbin.org\", 80, \"\/headers\");\r\n        performHttpRequest(\"httpbin.org\", 80, \"\/get?test=ipnut_socks5\");\r\n\r\n        std::cout << \"===================================\" << std::endl;\r\n        std::cout << \"\ud83c\udf89 SOCKS5 Proxy Demo Completed\" << std::endl;\r\n    }\r\n};\r\n\r\n\/\/ Main function for standalone SOCKS5 demo\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\">4. HTTP Proxy Implementation\nsrc\/http_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 * IPNut HTTP Proxy Integration - 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 \"..\/include\/proxy_common.h\"\r\n#include \"..\/include\/base64.h\"\r\n\r\nclass HttpProxyDemo {\r\nprivate:\r\n    ProxyConfig config;\r\n\r\npublic:\r\n    HttpProxyDemo() = default;\r\n    \r\n    explicit HttpProxyDemo(const ProxyConfig& cfg) : config(cfg) {}\r\n\r\n    \/**\r\n     * Connect to HTTP proxy server\r\n     *\/\r\n    int connectToProxy() {\r\n        int sockfd = socket(AF_INET, SOCK_STREAM, 0);\r\n        if (sockfd < 0) {\r\n            std::cerr << \"\u274c Failed to create socket\" << std::endl;\r\n            return -1;\r\n        }\r\n\r\n        \/\/ Set socket timeout\r\n        struct timeval timeout;\r\n        timeout.tv_sec = config.timeout_seconds;\r\n        timeout.tv_usec = 0;\r\n        setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));\r\n        setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));\r\n\r\n        \/\/ Resolve proxy server address\r\n        struct hostent* he = gethostbyname(config.host.c_str());\r\n        if (he == nullptr) {\r\n            std::cerr << \"\u274c Failed to resolve proxy host: \" << config.host << 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(config.port);\r\n        memcpy(&proxy_addr.sin_addr, he->h_addr_list[0], he->h_length);\r\n\r\n        std::cout << \"\ud83d\udd17 Connecting to HTTP proxy: \" << config.host << \":\" << config.port << std::endl;\r\n\r\n        \/\/ Connect to proxy server\r\n        if (connect(sockfd, (struct sockaddr*)&proxy_addr, sizeof(proxy_addr)) < 0) {\r\n            std::cerr << \"\u274c Failed to connect to HTTP proxy\" << std::endl;\r\n            close(sockfd);\r\n            return -1;\r\n        }\r\n\r\n        std::cout << \"\u2705 Successfully connected to HTTP proxy server\" << std::endl;\r\n        return sockfd;\r\n    }\r\n\r\n    \/**\r\n     * HTTP Proxy CONNECT method for tunneling\r\n     *\/\r\n    bool connectThroughProxy(int sockfd, const std::string& target_host, int target_port) {\r\n        \/\/ Build proxy authentication header\r\n        std::string auth = config.username + \":\" + config.password;\r\n        std::string encoded_auth = Base64::encode(auth);\r\n\r\n        \/\/ Send CONNECT request\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: IPNut-C++-HTTP-Proxy\/1.0\\r\\n\"\r\n            \"Connection: keep-alive\\r\\n\"\r\n            \"\\r\\n\";\r\n\r\n        std::cout << \"\ud83d\udce4 Sending CONNECT request...\" << std::endl;\r\n\r\n        if (send(sockfd, connect_request.c_str(), connect_request.length(), 0) < 0) {\r\n            std::cerr << \"\u274c Failed to send CONNECT request\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        \/\/ Read proxy response\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 << \"\u274c Failed to receive proxy response\" << 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        \/\/ Check response status\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 << \"\u274c Proxy connection failed\" << std::endl;\r\n            std::cerr << \"Response: \" << response << std::endl;\r\n            return false;\r\n        }\r\n\r\n        std::cout << \"\u2705 Successfully connected through HTTP proxy tunnel\" << std::endl;\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * Send HTTP request through proxy tunnel\r\n     *\/\r\n    void sendTunneledHttpRequest(const std::string& target_host, int target_port, const std::string& path = \"\/ip\") {\r\n        std::cout << \"\\n=== \ud83c\udf10 HTTP Proxy Tunnel Request ===\" << std::endl;\r\n        std::cout << \"Target: \" << target_host << \":\" << target_port << path << std::endl;\r\n\r\n        int sockfd = connectToProxy();\r\n        if (sockfd < 0) return;\r\n\r\n        if (!connectThroughProxy(sockfd, target_host, target_port)) {\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        \/\/ Send HTTP request through tunnel\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: IPNut-C++-HTTP-Tunnel\/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        std::cout << \"\ud83d\udce4 Sending HTTP request through tunnel...\" << std::endl;\r\n\r\n        if (send(sockfd, http_request.c_str(), http_request.length(), 0) < 0) {\r\n            std::cerr << \"\u274c Failed to send HTTP request\" << std::endl;\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        \/\/ Receive response\r\n        std::string response;\r\n        char buffer[4096];\r\n        int bytes_received;\r\n\r\n        std::cout << \"\ud83d\udce5 Receiving response...\" << std::endl;\r\n\r\n        while ((bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) > 0) {\r\n            buffer[bytes_received] = '\\0';\r\n            response += buffer;\r\n        }\r\n\r\n        std::cout << \"\ud83d\udcc4 HTTP Response:\" << std::endl;\r\n        std::cout << response << std::endl;\r\n\r\n        close(sockfd);\r\n    }\r\n\r\n    \/**\r\n     * Direct HTTP request through proxy (no tunneling)\r\n     *\/\r\n    void sendDirectHttpRequest(const std::string& target_url) {\r\n        std::cout << \"\\n=== \ud83c\udf10 HTTP Proxy Direct Request ===\" << std::endl;\r\n        std::cout << \"URL: \" << target_url << std::endl;\r\n\r\n        int sockfd = connectToProxy();\r\n        if (sockfd < 0) return;\r\n\r\n        \/\/ Build proxy authentication\r\n        std::string auth = config.username + \":\" + config.password;\r\n        std::string encoded_auth = Base64::encode(auth);\r\n\r\n        \/\/ Extract host from URL\r\n        std::string host = \"httpbin.org\";\r\n        std::string path = target_url;\r\n        \r\n        size_t pos = target_url.find(\"\/\/\");\r\n        if (pos != std::string::npos) {\r\n            size_t start = pos + 2;\r\n            size_t end = target_url.find('\/', start);\r\n            if (end != std::string::npos) {\r\n                host = target_url.substr(start, end - start);\r\n                path = target_url.substr(end);\r\n            }\r\n        }\r\n\r\n        \/\/ Send complete HTTP request (proxy will forward)\r\n        std::string http_request =\r\n            \"GET \" + path + \" HTTP\/1.1\\r\\n\"\r\n            \"Host: \" + host + \"\\r\\n\"\r\n            \"User-Agent: IPNut-C++-HTTP-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        std::cout << \"\ud83d\udce4 Sending direct HTTP request...\" << std::endl;\r\n\r\n        if (send(sockfd, http_request.c_str(), http_request.length(), 0) < 0) {\r\n            std::cerr << \"\u274c Failed to send HTTP request\" << std::endl;\r\n            close(sockfd);\r\n            return;\r\n        }\r\n\r\n        \/\/ Receive response\r\n        std::string response;\r\n        char buffer[4096];\r\n        int bytes_received;\r\n\r\n        while ((bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) > 0) {\r\n            buffer[bytes_received] = '\\0';\r\n            response += buffer;\r\n        }\r\n\r\n        std::cout << \"\ud83d\udcc4 HTTP Response:\" << std::endl;\r\n        std::cout << response << std::endl;\r\n\r\n        close(sockfd);\r\n    }\r\n\r\n    \/**\r\n     * Run comprehensive HTTP proxy demo\r\n     *\/\r\n    void runDemo() {\r\n        std::cout << \"\ud83d\ude80 Starting IPNut HTTP Proxy Demo\" << std::endl;\r\n        std::cout << \"=================================\" << std::endl;\r\n\r\n        \/\/ Test tunneled requests\r\n        sendTunneledHttpRequest(\"httpbin.org\", 80, \"\/ip\");\r\n        sendTunneledHttpRequest(\"httpbin.org\", 80, \"\/user-agent\");\r\n\r\n        \/\/ Test direct requests\r\n        sendDirectHttpRequest(\"http:\/\/httpbin.org\/headers\");\r\n        sendDirectHttpRequest(\"http:\/\/httpbin.org\/get?test=ipnut_http_proxy\");\r\n\r\n        std::cout << \"=================================\" << std::endl;\r\n        std::cout << \"\ud83c\udf89 HTTP Proxy Demo Completed\" << std::endl;\r\n    }\r\n};\r\n\r\n\/\/ Main function for standalone HTTP proxy demo\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\">5. Proxy test tool\nproxy_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\">6. 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 IPNut C++ Proxy Demo\r\n\r\nCXX = g++\r\nCXXFLAGS = -std=c++11 -Wall -Wextra -O2 -I.\/include\r\nTARGETS = socks5_demo http_demo proxy_test main_demo\r\n\r\nall: $(TARGETS)\r\n\r\nsocks5_demo: src\/socks5_proxy_demo.cpp\r\n\t$(CXX) $(CXXFLAGS) -o bin\/socks5_demo src\/socks5_proxy_demo.cpp\r\n\r\nhttp_demo: src\/http_proxy_demo.cpp\r\n\t$(CXX) $(CXXFLAGS) -o bin\/http_demo src\/http_proxy_demo.cpp\r\n\r\nproxy_test: src\/proxy_test_tool.cpp\r\n\t$(CXX) $(CXXFLAGS) -o bin\/proxy_test src\/proxy_test_tool.cpp\r\n\r\nmain_demo: src\/main.cpp src\/socks5_proxy_demo.cpp src\/http_proxy_demo.cpp src\/proxy_test_tool.cpp\r\n\t$(CXX) $(CXXFLAGS) -o bin\/main_demo src\/main.cpp src\/socks5_proxy_demo.cpp src\/http_proxy_demo.cpp src\/proxy_test_tool.cpp\r\n\r\nclean:\r\n\trm -rf bin\/*\r\n\r\ninstall:\r\n\tmkdir -p bin\r\n\r\n.PHONY: all clean install<\/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\">7. Build &amp; Execution<\/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># Compilation:\r\n# Create build directory\r\nmkdir -p cpp-proxy-demo\/bin\r\ncd cpp-proxy-demo\r\n\r\n# Build all targets\r\nmake all\r\n\r\n# Or build individually\r\nmake socks5_demo\r\nmake http_demo\r\nmake proxy_test\r\nmake main_demo\r\n\r\n# Execution:\r\n# Run SOCKS5 proxy demo\r\n.\/bin\/socks5_demo\r\n\r\n# Run HTTP proxy demo  \r\n.\/bin\/http_demo\r\n\r\n# Run connectivity tests\r\n.\/bin\/proxy_test\r\n\r\n# Run complete demonstration\r\n.\/bin\/main_demo<\/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-8a32547 elementor-widget elementor-widget-text-editor\" data-id=\"8a32547\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Key Integration Notes:<\/p><ul><li><p class=\"ds-markdown-paragraph\">Platform: Linux\/Unix systems with standard socket API<\/p><\/li><li><p class=\"ds-markdown-paragraph\">Dependencies: No external libraries required (uses system sockets)<\/p><\/li><li><p class=\"ds-markdown-paragraph\">Security: Implements proper SOCKS5 and HTTP proxy authentication<\/p><\/li><li><p class=\"ds-markdown-paragraph\">Error Handling: Comprehensive error checking and reporting<\/p><\/li><li><p class=\"ds-markdown-paragraph\">Performance: Socket timeouts and efficient buffer management<\/p><\/li><\/ul><p>Best Practices:<\/p><ol start=\"1\"><li><p class=\"ds-markdown-paragraph\">Resource Management: Always close sockets and handle errors<\/p><\/li><li><p class=\"ds-markdown-paragraph\">Timeout Configuration: Set appropriate timeouts for production use<\/p><\/li><li><p class=\"ds-markdown-paragraph\">Buffer Management: Use proper buffer sizes and bounds checking<\/p><\/li><li><p class=\"ds-markdown-paragraph\">Authentication: Secure credential handling in production applications<\/p><\/li><\/ol><hr \/><p class=\"ds-markdown-paragraph\">Technical Support<br \/>For integration assistance or location-specific requirements:<\/p><ul><li><p class=\"ds-markdown-paragraph\">Email:\u00a0Support@ipnut.com<\/p><\/li><li><p class=\"ds-markdown-paragraph\">Live Chat: 24\/7 real-time support via official website<\/p><\/li><\/ul><p class=\"ds-markdown-paragraph\">*All code examples support both HTTP and SOCKS5 protocols with enterprise-grade authentication and security features.*<\/p>\t\t\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>After purchasing sta [&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":[45],"doc_tag":[],"class_list":["post-831","docs","type-docs","status-publish","hentry","doc_category-development-documentation"],"year_month":"2026-05","word_count":441,"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":"Development Documentation","term_url":"https:\/\/help.ipnut.com\/docs\/development-documentation\/"}],"doc_tag_info":[],"lang":"en","translations":{"en":831,"cn":692},"knowledge_base_info":[],"knowledge_base_slug":[],"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/docs\/831","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=831"}],"version-history":[{"count":10,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/docs\/831\/revisions"}],"predecessor-version":[{"id":1134,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/docs\/831\/revisions\/1134"}],"wp:attachment":[{"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/media?parent=831"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/doc_category?post=831"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/help.ipnut.com\/wp-json\/wp\/v2\/doc_tag?post=831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}