首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ Web 程式設計:CGI 協議、HTTP 交互與 Cgicc 庫實戰

     編輯:C++ 入門

C++ 透過 CGI (Common Gateway Interface) 與 Web 伺服器互動,構建高效能 Web 應用。本文系統介紹 CGI 架構、HTTP 頭部、環境變量、GET/POST 處理、Cookie、檔案上傳,並使用 GNU Cgicc 庫簡化開發。

CGI 核心架構

  • Web 伺服器 (Apache/Nginx/IIS) 接收 HTTP 請求。
  • 匹配 CGI 目錄 (/var/www/cgi-bin) 下的可執行檔。
  • 啟動進程,環境變量傳遞請求元數據,STDIN 傳遞 Body,STDOUT 讀取響應。
  • CGI 程式輸出 Content-Type 頭 + 空行 + Body。

CGI 架構圖

首個 CGI 程式:Hello World

#include <iostream>
int main() {
    std::cout << "Content-type:text/html\r\n\r\n"; // 必須:頭部結束雙換行
    std::cout << "<html><head><title>Hello</title></head><body>"
              << "<h2>Hello World! C++ CGI</h2>"
              << "</body></html>";
    return 0;
}

編譯:g++ hello.cpp -o hello.cgi,部署至 cgi-bin,chmod 755 hello.cgi。

HTTP 頭部關鍵字段

頭部用途範例
Content-Type響應體 MIME 類型text/html; charset=utf-8
Set-Cookie設定 CookieSessionId=abc; Path=/; HttpOnly
Location重導向/login
StatusHTTP 狀態碼200 OK, 404 Not Found
Expires快取過期Wed, 21 Oct 2025 07:28:00 GMT

環境變量 (getenv 讀取)

變量含義
REQUEST_METHODGET / POST / PUT...
QUERY_STRINGURL ? 後參數
CONTENT_LENGTHPOST Body 長度
CONTENT_TYPEPOST Body MIME
HTTP_COOKIE客戶端 Cookie
HTTP_USER_AGENT瀏覽器標識
REMOTE_ADDR客戶端 IP
SCRIPT_NAMECGI 腳本路徑

GNU Cgicc 庫:表單處理、Cookie、檔案上傳

// 安裝
tar xzf cgicc-X.X.X.tar.gz && cd cgicc-X.X.X && ./configure --prefix=/usr && make && make install

// 編譯鏈接
g++ app.cpp -o app.cgi -lcgicc

GET/POST 參數讀取

#include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h>
using namespace cgicc;

int main() {
    Cgicc form;
    std::cout << HTTPHTMLHeader() << std::endl;
    form_iterator name = form.getElement("first_name");
    if (name != form.getElements().end() && !name->isEmpty())
        std::cout << "名:" << **name << "<br/>";
    // 同理 last_name
}

Checkbox / Radio / Select / Textarea 統一 API

// Checkbox
bool maths = form.queryCheckbox("maths");
// Radio / Select
form_iterator subject = form.getElement("subject");
if (subject != form.getElements().end()) std::cout << **subject;
// Textarea
form_iterator text = form.getElement("textcontent");
if (text != form.getElements().end()) std::cout << **text;

Cookie 讀寫

// 寫入 (在 HTTPHTMLHeader 之前)
std::cout << "Set-Cookie: UserID=123; Path=/\r\n";
std::cout << "Set-Cookie: Theme=dark; Max-Age=3600\r\n";
std::cout << HTTPHTMLHeader();

// 讀取
Cgicc cgi;
const CgiEnvironment& env = cgi.getEnvironment();
for (const_cookie_iterator it = env.getCookieList().begin(); it != env.getCookieList().end(); ++it)
    std::cout << it->getName() << "=" << it->getValue() << "<br/>";

檔案上傳 (multipart/form-data)

// HTML: <form enctype="multipart/form-data" action="/cgi-bin/upload.cgi" method="post"><input type="file" name="userfile"></form>
Cgicc cgi;
const_file_iterator file = cgi.getFile("userfile");
if (file != cgi.getFiles().end()) {
    std::cout << HTTPContentHeader(file->getDataType()); // 自動輸出 Content-Type
    file->writeToStream(std::cout); // 直接輸出檔案內容 (演示用)
    // 實際應用:file->writeToStream(ofstream("uploaded.bin", std::ios::binary));
}
std::cout << "<p>上傳成功</p>";

效能與部署考量

  • 進程模型:每請求啟動新進程,開銷大。高併發需 FastCGI (常駐進程) 或嵌入式 HTTP 伺服器 (libmicrohttpd, cpp-httplib, Crow, Pistache)。
  • 靜態鏈接:g++ -static -O2 app.cpp -o app.cgi -lcgicc 減少依賴部署風險。
  • 安全:輸入驗證、路徑遍歷防護、權限最小化 (chroot/容器)、非 root 運行。
  • 現代替代:C++ REST SDK (Casablanca)、Boost.Beast、Drogon、oatpp 等非同步框架,效能遠超 CGI。
  1. 上一篇文章: No
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved