HTTP 與 HTTPS 差異
- HTTP:明文傳輸,端口 80,效率高但不安全。
- HTTPS:HTTP + SSL/TLS,端口 443,加密傳輸,安全性高但有加解密開銷。
Socket 發送 HTTP 請求流程
WSAStartup 初始化 Winsock
socket() 創建套接字
connect() 連接服務器
- 構造 POST 請求頭與體
send() 發送,recv() 接收響應
- 解析
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 請求流程
- 同 HTTP 前三步建立 TCP 連接
SSL_CTX_new() 創建 SSL 上下文
SSL_new() 創建 SSL 對象
SSL_set_fd() 綁定 socket
SSL_connect() 建立 TLS 連接
SSL_write()/SSL_read() 收發加密數據
- 清理:
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。