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

C++ 模擬 HTTP/HTTPS POST 登錄 Web 站點實戰

     編輯:關於C++

HTTP 與 HTTPS 差異

  • HTTP:明文傳輸,端口 80,效率高但不安全。
  • HTTPS:HTTP + SSL/TLS,端口 443,加密傳輸,安全性高但有加解密開銷。

Socket 發送 HTTP 請求流程

  1. WSAStartup 初始化 Winsock
  2. socket() 創建套接字
  3. connect() 連接服務器
  4. 構造 POST 請求頭與體
  5. send() 發送,recv() 接收響應
  6. 解析 Set-Cookie 判斷登錄成功

核心代碼片段(HTTP)

BOOL SocketClient::SendPostData() {
    CString cstrSendParam = _T("redirect=&username=") + cstrUserName + ...;
    CString cstrSendData = _T("POST https://account.vsochina.com/user/login HTTP/1.1\r\n");
    cstrSendData += _T("Host: account.vsochina.com\r\n");
    cstrSendData += _T("Content-Type: application/x-www-form-urlencoded\r\n");
    cstrSendData += _T("Content-Length: ") + cstrSendParamLen + _T("\r\n\r\n");
    cstrSendData += cstrSendParam;
    send(socketClient, cstrSendData.GetBuffer(), cstrSendData.GetLength(), 0);
    // 接收並解析 Cookie...
}

OpenSSL 發送 HTTPS 請求流程

  1. 同 HTTP 前三步建立 TCP 連接
  2. SSL_CTX_new() 創建 SSL 上下文
  3. SSL_new() 創建 SSL 對象
  4. SSL_set_fd() 綁定 socket
  5. SSL_connect() 建立 TLS 連接
  6. SSL_write()/SSL_read() 收發加密數據
  7. 清理:SSL_shutdown(), SSL_free(), SSL_CTX_free()

核心代碼片段(HTTPS)

BOOL HttpsClient::SendLoginPostData() {
    CString cstrSendData = _T("POST https://account.xiaomi.com/pass/serviceLoginAuth2 HTTP/1.1\r\n");
    // ... 設置 Host, User-Agent, Content-Type, Content-Length 等頭部
    SSL_write(ssl, cstrSendData, cstrSendData.GetLength());
    // SSL_read 循環接收...
}

關鍵注意點

  • 請求頭必須以 \r\n\r\n 結束,體緊隨其後。
  • HTTPS 需鏈接 libeay32.lib、ssleay32.lib。
  • Cookie 解析需處理多行 Set-Cookie,提取關鍵字段(如 uid)判斷登錄態。
  • 生產環境建議使用成熟庫(libcurl, cpp-httplib, Boost.Beast)而非手寫 Socket。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved