目標:監聽指定端口(如 80)上的所有 HTTP 請求數據包,將請求內容(特別是 GET 請求)寫入文本文件。純用戶態 C 代碼實現,不依賴 libpcap 等第三方庫。
SOCK_RAW 需 Root/Administrator 權限。不要在 C 語言底層造輪子。在應用層攔截:
access_log 記錄完整請求體。// 伪代碼流程
int sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
// 綁定網卡 (可選)
struct sockaddr_in sin = { .sin_family = AF_INET, .sin_port = htons(80) };
bind(sock, (struct sockaddr*)&sin, sizeof(sin));
while (1) {
char buf[65536];
int len = recv(sock, buf, sizeof(buf), 0);
// 1. 解析 IP 頭 -> 獲取源/目標 IP、協議
// 2. 解析 TCP 頭 -> 獲取源/目標端口、SEQ/ACK、標誌位、數據偏移
// 3. 提取 Payload
// 4. **關鍵**:維護一個哈希表 (四元組 -> TCP 會話狀態),按 SEQ 重組流
// 5. 解析重組後的 HTTP 協議 (請求行、頭、體)
// 6. 寫入文件
}
「少量 C 代碼實現」是不現實的。工程上請使用 成熟的抓包庫 (libpcap/Npcap) 或 應用層代理/日誌。若為學習網絡協議,建議從 libpcap 循環抓包開始,逐步理解 TCP 重組邏輯。