久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

C++手寫(xiě)HTTP GET客戶端:socket、超時(shí)與chunked解析

C++手寫(xiě)HTTP GET客戶端:socket、超時(shí)與chunked解析 簡(jiǎn)介面向C網(wǎng)絡(luò)編程入門(mén)者的輕量級(jí)HTTP GET請(qǐng)求實(shí)現(xiàn)示例聚焦在Windows環(huán)境下從指定URL拉取數(shù)據(jù)的最小可用路徑。代碼將請(qǐng)求發(fā)起、響應(yīng)獲取與耗時(shí)統(tǒng)計(jì)拆分組織借助頭文件聲明接口、源文件承載連接建立與數(shù)據(jù)讀取邏輯并以計(jì)時(shí)器記錄請(qǐng)求執(zhí)行時(shí)間便于理解一次HTTP GET從構(gòu)造到回收的基本流程也可作為課程實(shí)驗(yàn)或小型工具原型的基礎(chǔ)骨架并保留較清晰的調(diào)用關(guān)系。壓縮包共3個(gè)文件由2個(gè)頭文件和1個(gè)C源文件組成整體約2KB體量精簡(jiǎn)適合快速通讀與二次修改。目前已有268人學(xué)習(xí)說(shuō)明該主題對(duì)初學(xué)者具有一定參考價(jià)值。讀者可借此理解請(qǐng)求封裝、響應(yīng)讀取與性能計(jì)時(shí)并據(jù)此補(bǔ)充超時(shí)、重定向、HTTPS與代理等擴(kuò)展能力逐步形成更健壯的網(wǎng)絡(luò)通信模塊。1. 問(wèn)題往往出在請(qǐng)求根本沒(méi)發(fā)出去線上排查一個(gè)接口問(wèn)題服務(wù)端日志里干干凈凈一條請(qǐng)求都沒(méi)收到客戶端那邊只回了一句“超時(shí)”。我翻出很早以前寫(xiě)的一個(gè) http GET C 實(shí)現(xiàn)不到三百行只用系統(tǒng) socket 和標(biāo)準(zhǔn)庫(kù)兩分鐘就把問(wèn)題定在了域名解析上。這個(gè) http GET C 實(shí)現(xiàn)干的事很單一給一個(gè) URL拼出 GET 請(qǐng)求收完響應(yīng)把狀態(tài)碼、響應(yīng)頭和正文交回來(lái)。它適合三類人想搞明白 HTTP 在網(wǎng)絡(luò)上究竟發(fā)了什么字節(jié)的初學(xué)者需要在命令行、嵌入式或者離線環(huán)境里做最小網(wǎng)絡(luò)訪問(wèn)的開(kāi)發(fā)者以及手里有老項(xiàng)目、不想為了一個(gè)下載功能就拖進(jìn)整套網(wǎng)絡(luò)庫(kù)的人。下面按我實(shí)際拆它的順序講先看邊界在哪再看目錄和編譯然后逐段過(guò)核心代碼最后落到怎么把它改成能進(jìn)項(xiàng)目的組件。2. 項(xiàng)目定位與技術(shù)選型只用標(biāo)準(zhǔn)庫(kù)和系統(tǒng) socket 的最小可用方案2.1 能力邊界先劃清楚這類小項(xiàng)目最怕定位模糊什么都能干最后什么都干不好。我拆的這個(gè)版本把邊界壓得很死只支持明文 HTTP/1.1只支持 GET一次請(qǐng)求一條連接不自動(dòng)跟隨重定向不自動(dòng)解壓 gzip。這些不是能力缺失是為了讓主流程能被完整讀完——一個(gè)剛接觸網(wǎng)絡(luò)編程的人順著一個(gè)文件從頭讀到尾就能跑通。先把這個(gè)版本能做什么、不能做什么列清楚比后面看代碼更重要。很多人在這一步就誤解了項(xiàng)目的能力接上 HTTPS 域名調(diào)半天沒(méi)反應(yīng)回頭才發(fā)現(xiàn)協(xié)議壓根不對(duì)。能力項(xiàng)當(dāng)前實(shí)現(xiàn)備注協(xié)議HTTP/1.1 明文走 80 端口不涉及 TLS方法僅 GET加 POST 只需改請(qǐng)求行和補(bǔ) body連接一次一連接Connection: close不做 keep-alive 連接池重定向不跟隨301/302 直接原樣返回壓縮不聲明 gzip收到什么給什么請(qǐng)求頭里寫(xiě) Accept-Encoding: identity編碼原樣輸出不做轉(zhuǎn)碼中文頁(yè)面可能是 GBK依賴部分很關(guān)鍵Linux 和 macOS 上什么都不用鏈POSIX socket 在 libc 里Windows 上要額外鏈 ws2_32并且在程序啟動(dòng)時(shí)調(diào)一次 WSAStartup、退出時(shí)調(diào) WSACleanup這兩步漏了就是一堆找不到符號(hào)的鏈接錯(cuò)誤。2.2 目錄結(jié)構(gòu)與構(gòu)建方式源文件按職責(zé)切了四塊加上一個(gè)入口。這樣切的好處是每個(gè)文件都能單獨(dú)看懂改起來(lái)也方便想加 POST 只動(dòng) request.cpp想加 chunked 解碼只動(dòng) response.cpp。tiny-http/ ├── include/ │ └── http_client.h # 對(duì)外結(jié)構(gòu)體與函數(shù)聲明 ├── src/ │ ├── url.cpp # URL 拆解scheme / host / port / path │ ├── socket.cpp # DNS 解析、帶超時(shí)的 connect │ ├── request.cpp # 拼裝請(qǐng)求報(bào)文并發(fā)送 │ ├── response.cpp # 收數(shù)據(jù)、解析狀態(tài)行與響應(yīng)頭、chunked 解碼 │ └── main.cpp # 命令行入口 ├── CMakeLists.txt └── README.md對(duì)應(yīng)這份結(jié)構(gòu)的 CMakeLists.txt 我一般這么寫(xiě)靜態(tài)庫(kù)加可執(zhí)行文件兩段跨平臺(tái)時(shí)在 Windows 分支補(bǔ)鏈接項(xiàng)cmake_minimum_required(VERSION 3.10) project(tiny_http CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(tinyhttp STATIC src/url.cpp src/socket.cpp src/request.cpp src/response.cpp ) target_include_directories(tinyhttp PUBLIC include) add_executable(httpget src/main.cpp) target_link_libraries(httpget PRIVATE tinyhttp) # Windows 下 socket 相關(guān)符號(hào)在 ws2_32 里不鏈必然報(bào)未定義引用 if (WIN32) target_link_libraries(tinyhttp PUBLIC ws2_32) endif()add_library(... STATIC)把四個(gè)實(shí)現(xiàn)文件打成一個(gè)靜態(tài)庫(kù)target_include_directories用 PUBLIC 把 include 目錄透出去后面加別的可執(zhí)行文件比如測(cè)試程序時(shí)不用重復(fù)寫(xiě)路徑。編譯就兩條命令cmake -B build然后cmake --build build產(chǎn)物在 build 目錄下的 httpget。2.3 一次 GET 的完整鏈路把整個(gè)流程拆成六步每一步都有明確的失敗點(diǎn)排查的時(shí)候直接對(duì)著位置找解析 URL切出 host、port、path。失敗點(diǎn)端口沒(méi)填、路徑以//開(kāi)頭、URL 里帶空格沒(méi)轉(zhuǎn)義。調(diào) getaddrinfo 做 DNS 解析拿到 sockaddr 鏈表。失敗點(diǎn)域名寫(xiě)錯(cuò)、本地 DNS 不通、IPv6 優(yōu)先但目標(biāo)沒(méi) AAAA 記錄。建 socket 并 connect。失敗點(diǎn)目標(biāo)端口沒(méi)開(kāi)、防火墻攔截、連接超時(shí)沒(méi)設(shè)。拼請(qǐng)求報(bào)文send 出去。失敗點(diǎn)Host 頭漏了服務(wù)端直接 400只發(fā)了一半數(shù)據(jù)。recv 循環(huán)收滿響應(yīng)。失敗點(diǎn)只 recv 一次正文少一截。解析狀態(tài)行、響應(yīng)頭、正文。失敗點(diǎn)\r\n處理不干凈頭部鍵大小寫(xiě)沒(méi)歸一。這六步里前兩步占了我遇到問(wèn)題的絕大多數(shù)。尤其是第二步DNS 解析是同步阻塞的沒(méi)有超時(shí)參數(shù)網(wǎng)絡(luò)環(huán)境一差就卡在那兒進(jìn)程看著像死了其實(shí)是卡在 getaddrinfo 里面——這是真正的黑匣子環(huán)節(jié)日志里什么都看不到。3. 核心代碼拆解從 URL 解析到 socket 連接3.1 URL 解析把字符串切成四段一切從字符串開(kāi)始。這段代碼看著簡(jiǎn)單實(shí)際上 IPv6 地址和端口缺省這兩個(gè)坑能把人折騰很久我寫(xiě)的時(shí)候?qū)iT(mén)把方括號(hào)分支留了出來(lái)。#include string #include cctype #include cstdlib struct Url { std::string scheme; // http std::string host; // 域名或 IPIPv6 不帶方括號(hào) std::string port; // 缺省時(shí)按 scheme 補(bǔ) 80/443 std::string path; // 含查詢串至少是 / }; static bool parse_url(const std::string raw, Url out) { std::string s raw; // 1. 拆 scheme沒(méi)有就按 http 處理 auto pos s.find(://); if (pos ! std::string::npos) { out.scheme s.substr(0, pos); for (auto c : out.scheme) c (char)std::tolower(c); s s.substr(pos 3); } else { out.scheme http; } // 2. 第一個(gè) / 之后全是路徑?jīng)]寫(xiě)就補(bǔ) / auto slash s.find(/); std::string hostport (slash std::string::npos) ? s : s.substr(0, slash); out.path (slash std::string::npos) ? / : s.substr(slash); // 3. 拆 host 和 portIPv6 形如 [::1]:8080 if (!hostport.empty() hostport[0] [) { auto rb hostport.find(]); if (rb std::string::npos) return false; out.host hostport.substr(1, rb - 1); if (rb 1 hostport.size() hostport[rb 1] :) out.port hostport.substr(rb 2); } else { auto colon hostport.rfind(:); if (colon ! std::string::npos) { out.host hostport.substr(0, colon); out.port hostport.substr(colon 1); } else { out.host hostport; } } if (out.host.empty()) return false; if (out.port.empty()) out.port (out.scheme https) ? 443 : 80; return true; }幾個(gè)點(diǎn)值得單獨(dú)說(shuō)。path在沒(méi)寫(xiě)的時(shí)候必須補(bǔ)成/因?yàn)?HTTP 請(qǐng)求行里GET HTTP/1.1是非法請(qǐng)求很多服務(wù)端直接回 400我第一次跑就栽在這兒。IPv6 分支里我存的是去掉方括號(hào)的地址因?yàn)?getaddrinfo 認(rèn)的是::1而不是[::1]。端口用rfind而不是find是為了兼容host:port后面還可能跟別的東西的情況雖然這個(gè)版本用不上但改成rfind不增加成本。參數(shù)out是引用輸出函數(shù)只返回成功與否這樣調(diào)用側(cè)不需要處理指針為空也不用考慮異常。返回值 false 的三種情況——方括號(hào)沒(méi)閉合、host 為空、整體解析不出來(lái)——在 main 里統(tǒng)一打一行 usage 提示就夠了。3.2 DNS 解析與連接超時(shí)是必須的getaddrinfo 一次拿全地址族和端口比自己調(diào) gethostbyname 再拼 sockaddr_in 靠譜得多而且后者在現(xiàn)代代碼里已經(jīng)不該出現(xiàn)。連接超時(shí)我沒(méi)用SO_SNDTIMEO那玩意兒對(duì) connect 不生效正確做法是把 socket 設(shè)成非阻塞、connect 之后用 select 等可寫(xiě)。#include sys/socket.h #include netdb.h #include unistd.h #include fcntl.h #include sys/select.h #include cerrno #include cstring int connect_with_timeout(const std::string host, const std::string port, int timeout_ms, std::string err) { struct addrinfo hints; std::memset(hints, 0, sizeof(hints)); hints.ai_family AF_UNSPEC; // IPv4 / IPv6 都接受 hints.ai_socktype SOCK_STREAM; // TCP struct addrinfo* res nullptr; int rc getaddrinfo(host.c_str(), port.c_str(), hints, res); if (rc ! 0) { err gai_strerror(rc); return -1; } int fd -1; for (auto p res; p ! nullptr; p p-ai_next) { fd socket(p-ai_family, p-ai_socktype, p-ai_protocol); if (fd 0) continue; int flags fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK); rc connect(fd, p-ai_addr, p-ai_addrlen); if (rc 0) { fcntl(fd, F_SETFL, flags); break; } // 本機(jī)地址立即成功 if (errno ! EINPROGRESS) { close(fd); fd -1; continue; } fd_set wfds; FD_ZERO(wfds); FD_SET(fd, wfds); struct timeval tv; tv.tv_sec timeout_ms / 1000; tv.tv_usec (timeout_ms % 1000) * 1000; rc select(fd 1, nullptr, wfds, nullptr, tv); if (rc 0) { int soerr 0; socklen_t len sizeof(soerr); getsockopt(fd, SOL_SOCKET, SO_ERROR, soerr, len); if (soerr 0) { fcntl(fd, F_SETFL, flags); break; } // 恢復(fù)阻塞 } close(fd); fd -1; } freeaddrinfo(res); // addrinfo 必須配對(duì)釋放 if (fd 0) err connect failed or timeout; return fd; }hints.ai_family寫(xiě)AF_UNSPEC讓系統(tǒng)自己決定走 IPv4 還是 IPv6用AF_INET硬編碼在純 IPv6 環(huán)境里直接連不上。循環(huán)遍歷ai_next是重點(diǎn)一個(gè)域名可能解析出多個(gè)地址第一個(gè)不通要試第二個(gè)直接取res頭節(jié)點(diǎn)是新手常見(jiàn)寫(xiě)法。select返回大于 0 只說(shuō)明“有事件”不代表連接成功必須用getsockopt(SO_ERROR)再確認(rèn)一次這一步漏了會(huì)出現(xiàn)“連接明明失敗但程序往下走”的詭異現(xiàn)象。連接成功后把O_NONBLOCK恢復(fù)掉后面 recv 用阻塞模式邏輯簡(jiǎn)單。timeout_ms我一般設(shè) 5000內(nèi)網(wǎng)環(huán)境可以降到 1000。3.3 拼請(qǐng)求報(bào)文CRLF、Host 頭、Connection請(qǐng)求報(bào)文就是一段字符串但每個(gè)換行必須是\r\n兩個(gè)字節(jié)少一個(gè)\r服務(wù)端就可能把整個(gè)請(qǐng)求當(dāng)非法處理。std::string build_request(const Url u) { std::string req; req GET u.path HTTP/1.1\r\n; req Host: u.host \r\n; req User-Agent: tiny-http/1.0\r\n; req Accept: */*\r\n; req Accept-Encoding: identity\r\n; // 明確不要壓縮省掉解壓邏輯 req Connection: close\r\n; // 服務(wù)端回完即關(guān)讀起來(lái)不用判長(zhǎng)度 req \r\n; // 空行報(bào)文結(jié)束標(biāo)志 return req; }Host在 HTTP/1.1 里是必填項(xiàng)虛擬主機(jī)靠它區(qū)分后端站點(diǎn)漏了大概率回 400。Accept-Encoding: identity是我故意的不聲明 gzip服務(wù)端就不會(huì)壓客戶端也就不需要鏈接解壓庫(kù)整個(gè)依賴又少一層。Connection: close讓服務(wù)端發(fā)完就關(guān)連接recv 讀到 0 就代表結(jié)束不用自己算 Content-Length是這類小工具最省心的寫(xiě)法。發(fā)送時(shí)有個(gè)細(xì)節(jié)send的返回值可能小于請(qǐng)求長(zhǎng)度尤其是請(qǐng)求頭很大或者網(wǎng)絡(luò)擁塞時(shí)。小請(qǐng)求一般一次發(fā)完但我習(xí)慣寫(xiě)成循環(huán)避免偶發(fā)的半包問(wèn)題size_t sent 0; while (sent req.size()) { ssize_t n send(fd, req.data() sent, req.size() - sent, 0); if (n 0) { /* 記錄錯(cuò)誤并退出 */ break; } sent (size_t)n; }4. 響應(yīng)讀取與解析狀態(tài)行、頭部、正文三段式4.1 收數(shù)據(jù)recv 循環(huán)與內(nèi)存上限一次 recv 拿到的可能只是響應(yīng)頭的一部分也可能是整個(gè)響應(yīng)加后半截正文絕不能假設(shè)一次收完。寫(xiě)法就是循環(huán)拼接到對(duì)端關(guān)閉為止同時(shí)加一個(gè)上限防止碰上超大文件把內(nèi)存吃光。std::string recv_all(int fd, size_t max_bytes 8 * 1024 * 1024) { std::string buf; char tmp[8192]; while (true) { ssize_t n recv(fd, tmp, sizeof(tmp), 0); if (n 0) { buf.append(tmp, (size_t)n); if (buf.size() max_bytes) break; // 保護(hù)性截?cái)?} else if (n 0) { break; // 對(duì)端關(guān)閉正常結(jié)束 } else { if (errno EINTR) continue; // 被信號(hào)打斷重試 break; // 超時(shí)或真錯(cuò)誤 } } return buf; }緩沖區(qū) 8192 是個(gè)經(jīng)驗(yàn)值太小系統(tǒng)調(diào)用次數(shù)多太大棧上占用高。EINTR那行必須留著某些環(huán)境下信號(hào)會(huì)打斷 recv不重試就會(huì)拿到半截?cái)?shù)據(jù)還以為收完了。max_bytes默認(rèn) 8MB超過(guò)就停返回的內(nèi)容雖然不完整但程序不會(huì)崩——下載大文件應(yīng)該走邊收邊寫(xiě)的路子不該用這個(gè)函數(shù)。另外如果 socket 上設(shè)了SO_RCVTIMEO超時(shí)后 recv 返回 -1 且 errno 為EAGAIN或EWOULDBLOCK這里會(huì)走到 break調(diào)用方看到的是“短響應(yīng)”需要自己根據(jù)狀態(tài)判斷是超時(shí)還是正常結(jié)束。4.2 解析狀態(tài)行與響應(yīng)頭響應(yīng)分成三段狀態(tài)行、若干頭部行、空行之后的正文。用\r\n\r\n定位頭部結(jié)束位置是最穩(wěn)的做法比逐行掃描簡(jiǎn)單。#include map #include sstream #include algorithm struct Response { int status 0; std::string reason; std::mapstd::string, std::string headers; // 鍵統(tǒng)一轉(zhuǎn)小寫(xiě) std::string body; }; static std::string to_lower(std::string s) { std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c) { return (char)std::tolower(c); }); return s; } static std::string trim(const std::string s) { size_t b s.find_first_not_of( \t); if (b std::string::npos) return ; size_t e s.find_last_not_of( \t\r); return s.substr(b, e - b 1); } bool parse_response(const std::string raw, Response resp) { auto head_end raw.find(\r\n\r\n); if (head_end std::string::npos) return false; // 響應(yīng)頭都不完整 std::istringstream ss(raw.substr(0, head_end)); std::string line; std::getline(ss, line); // 狀態(tài)行 if (!line.empty() line.back() \r) line.pop_back(); auto sp1 line.find( ); // HTTP/1.1 200 OK if (sp1 std::string::npos) return false; auto sp2 line.find( , sp1 1); resp.status std::atoi(line.substr(sp1 1, sp2 - sp1 - 1).c_str()); if (sp2 ! std::string::npos) resp.reason line.substr(sp2 1); while (std::getline(ss, line)) { // 逐個(gè)頭字段 if (!line.empty() line.back() \r) line.pop_back(); if (line.empty()) continue; auto colon line.find(:); if (colon std::string::npos) continue; resp.headers[to_lower(trim(line.substr(0, colon)))] trim(line.substr(colon 1)); } resp.body raw.substr(head_end 4); // 剩下的就是正文 return true; }頭部鍵統(tǒng)一轉(zhuǎn)小寫(xiě)是關(guān)鍵設(shè)計(jì)。RFC 里頭部名不區(qū)分大小寫(xiě)實(shí)際服務(wù)端有的發(fā)Content-Type有的發(fā)content-type不歸一的話查詢會(huì)落空。trim里順帶把\r也去掉因?yàn)槟承?getline 實(shí)現(xiàn)會(huì)把\r留在行尾。resp.body這里直接取剩余全部字節(jié)前提是用了Connection: close。如果以后改成 keep-alive這里就得改成按Content-Length精確切否則會(huì)把下一個(gè)響應(yīng)也吃進(jìn)來(lái)。4.3 正文邊界Content-Length 與 chunked大部分響應(yīng)帶Content-Length但有一類響應(yīng)會(huì)帶Transfer-Encoding: chunked正文被切成一塊塊每塊前面是十六進(jìn)制的長(zhǎng)度。不處理的話輸出里會(huì)混進(jìn)1a2b\r\n這種字符這是最容易被誤判成“亂碼”的坑。// in: 原始正文含 chunk 頭out: 解碼后的凈正文 bool dechunk(const std::string in, std::string out) { size_t pos 0; out.clear(); while (pos in.size()) { auto eol in.find(\r\n, pos); if (eol std::string::npos) return false; std::string size_line in.substr(pos, eol - pos); auto semi size_line.find(;); // 可能有 chunk 擴(kuò)展參數(shù) if (semi ! std::string::npos) size_line size_line.substr(0, semi); size_t chunk_size std::strtoul(size_line.c_str(), nullptr, 16); pos eol 2; if (chunk_size 0) return true; // 結(jié)束塊 if (pos chunk_size in.size()) return false; // 數(shù)據(jù)還沒(méi)收全 out.append(in, pos, chunk_size); pos chunk_size 2; // 跳過(guò)數(shù)據(jù)尾巴的 \r\n } return false; }strtoul第三個(gè)參數(shù)寫(xiě) 16 表示按十六進(jìn)制解析長(zhǎng)度字段本來(lái)就是 hex。返回 false 有兩種含義數(shù)據(jù)沒(méi)收全或者格式不對(duì)調(diào)用側(cè)可以選擇再 recv 一輪或者直接報(bào)錯(cuò)。結(jié)束塊之后理論上還可能跟 trailer 頭這個(gè)版本直接忽略夠用。調(diào)用順序很講究先解析頭部再判斷Transfer-Encoding是否含chunked含才走解碼否則原樣輸出。判斷時(shí)要把值轉(zhuǎn)小寫(xiě)再find因?yàn)橛械姆?wù)端寫(xiě)Chunked。5. 排查清單把程序跑通前大概率會(huì)遇到的五個(gè)坑5.1 程序卡住不返回連錯(cuò)誤都沒(méi)有現(xiàn)象命令行敲下去光標(biāo)一直閃幾分鐘都不動(dòng)CtrlC 才能退出日志里一個(gè)字都沒(méi)有。原因兩條路都可能阻塞——getaddrinfo 不受任何超時(shí)控制DNS 服務(wù)器不通就會(huì)卡在這兒connect 在默認(rèn)阻塞模式下目標(biāo)不可達(dá)時(shí)會(huì)等系統(tǒng)級(jí)超時(shí)動(dòng)輒一兩個(gè)分鐘。這兩個(gè)位置都不打日志看上去就是“死機(jī)”。解決連接超時(shí)按 3.2 節(jié)用非阻塞加 select 實(shí)現(xiàn)日志在解析前后各打一行就能立刻看出卡在哪一步。getaddrinfo 本身沒(méi)法設(shè)超時(shí)工程上的做法是把它扔到獨(dú)立線程里主線程等結(jié)果超過(guò)閾值就放棄——雖然線程收不回來(lái)但至少主流程能繼續(xù)。5.2 服務(wù)端返回 400但請(qǐng)求看起來(lái)沒(méi)問(wèn)題現(xiàn)象自己拼的請(qǐng)求發(fā)出去回來(lái)的狀態(tài)碼是 400把同樣的 URL 丟瀏覽器里完全正常。原因九成是Host頭缺失或者請(qǐng)求行里的路徑?jīng)]寫(xiě)全。HTTP/1.1 強(qiáng)制要求 Host虛擬主機(jī)環(huán)境下沒(méi)有 Host 服務(wù)端不知道該給哪個(gè)站點(diǎn)。另一種情況是路徑寫(xiě)成了空字符串請(qǐng)求行變成GET HTTP/1.1兩個(gè)空格連著解析直接失敗。解決把實(shí)際發(fā)出的報(bào)文用十六進(jìn)制方式打出來(lái)看重點(diǎn)檢查每一行結(jié)尾是不是\r\n兩個(gè)字節(jié)、空行有沒(méi)有、Host 值是不是純域名不帶http://前綴和端口以外的多余字符。5.3 正文比預(yù)期少一截或者末尾混進(jìn)奇怪字符現(xiàn)象抓下來(lái)的 HTML 尾部缺了幾個(gè)標(biāo)簽或者正文里出現(xiàn)3f\r\n這類十六進(jìn)制字符串。原因前者是只調(diào)用了一次 recv拿到的只是第一段數(shù)據(jù)后者是響應(yīng)用了 chunked 編碼但沒(méi)解碼長(zhǎng)度行被當(dāng)成正文輸出了。解決recv 必須循環(huán)到返回 0同時(shí)看響應(yīng)頭里有沒(méi)有Transfer-Encoding: chunked。加日志把每次 recv 的字節(jié)數(shù)和累計(jì)長(zhǎng)度打出來(lái)一眼就能看出是提前退出還是解碼漏了。5.4 編譯過(guò)了鏈接階段一堆未定義符號(hào)現(xiàn)象Linux 下編譯運(yùn)行正常拿到 Windows 上編譯通過(guò)鏈接報(bào)找不到socket、connect、getaddrinfo之類。原因Windows 的 socket API 在 ws2_32 庫(kù)和 winsock2.h 里和 POSIX 不是一套而且進(jìn)程啟動(dòng)時(shí)必須調(diào)WSAStartup否則所有 socket 調(diào)用直接失敗。解決頭文件包含改成條件編譯Windows 走winsock2.h并鏈ws2_32同時(shí)在 main 開(kāi)頭調(diào)WSAStartup(MAKEWORD(2, 2), wsa)退出前調(diào)WSACleanup()。注意包含順序winsock2.h必須在windows.h前面否則會(huì)帶進(jìn)老的 winsock1 定義。5.5 中文頁(yè)面抓下來(lái)是亂碼現(xiàn)象英文頁(yè)面一切正常中文頁(yè)面輸出成一片問(wèn)號(hào)或者奇怪的符號(hào)組合。原因這個(gè)實(shí)現(xiàn)把字節(jié)原樣輸出不做任何轉(zhuǎn)碼。如果響應(yīng)頭里Content-Type帶的是charsetgbk而終端按 UTF-8 顯示就必然亂碼。解決先看Content-Type里的 charset再?zèng)Q定怎么處理。最省事的做法是在請(qǐng)求頭里加Accept-Language并優(yōu)先挑 UTF-8 的站點(diǎn)真要做轉(zhuǎn)換就得引入編碼轉(zhuǎn)換庫(kù)那已經(jīng)超出這個(gè)項(xiàng)目的最小定位了我一般建議在調(diào)用側(cè)解決。6. 二次開(kāi)發(fā)把它收斂成一個(gè)能進(jìn)項(xiàng)目的類單文件 main 跑通之后下一步一定是包裝。我的做法是把 fd 的生命周期收進(jìn) RAII 類里外面只看到一個(gè)get(url)接口錯(cuò)誤用返回值加錯(cuò)誤串往外拋不折騰異常。class HttpClient { public: explicit HttpClient(int timeout_ms 5000) : timeout_ms_(timeout_ms) {} bool get(const std::string url, Response resp, std::string err) { Url u; if (!parse_url(url, u)) { err bad url; return false; } if (u.scheme ! http) { err scheme not supported; return false; } int fd connect_with_timeout(u.host, u.port, timeout_ms_, err); if (fd 0) return false; bool ok false; std::string req build_request(u); if (send_all(fd, req)) { // 內(nèi)部循環(huán)處理短寫(xiě) std::string raw recv_all(fd); ok parse_response(raw, resp); if (ok is_chunked(resp)) ok dechunk(resp.body, resp.body); // 成功后原地替換 } else { err send failed; } close(fd); // 析構(gòu)前統(tǒng)一關(guān)閉 return ok; } private: int timeout_ms_; };封裝時(shí)有三個(gè)點(diǎn)別省。第一close(fd)一定要在所有分支上都覆蓋到我見(jiàn)過(guò)太多在錯(cuò)誤分支直接 return 導(dǎo)致句柄泄漏的代碼跑久了文件描述符耗盡報(bào)的錯(cuò)還跟網(wǎng)絡(luò)毫無(wú)關(guān)系。第二send_all內(nèi)部循環(huán)處理短寫(xiě)把這段從業(yè)務(wù)邏輯里挪出去。第三dechunk支持原地替換時(shí)要小心實(shí)現(xiàn)簡(jiǎn)單起見(jiàn)可以先解到臨時(shí)串再 swap。改完之后驗(yàn)證方法很樸素拿幾個(gè)已知行為的地址跑一遍——一個(gè)返回固定長(zhǎng)度正文的、一個(gè)返回 chunked 的、一個(gè)會(huì) 302 跳轉(zhuǎn)的、一個(gè)不存在的域名。四個(gè)用例覆蓋了正常路徑和三類異常每次改動(dòng)后全跑一遍比盯著代碼看有效得多。擴(kuò)展路線按需要挑別一次全加需求改動(dòng)位置大致工作量支持 POSTrequest.cpp 加請(qǐng)求行和 Content-Length半小時(shí)自動(dòng)跟隨 302外層循環(huán)最多跟 5 跳一小時(shí)支持 HTTPS連接層換成 TLS 握手端口改 443半天起大文件下載recv 改成邊收邊寫(xiě)文件一小時(shí)連接復(fù)用加連接池解析改按 Content-Length 切一天最后說(shuō)個(gè)血淚經(jīng)驗(yàn)。這套代碼我前后改過(guò)三四版每次都是圖快跳過(guò)“把請(qǐng)求報(bào)文原樣打出來(lái)看一眼”這一步結(jié)果在 Host 頭、路徑斜杠、CRLF 這些地方反復(fù)翻車(chē)。從那以后我每次動(dòng)到請(qǐng)求拼裝相關(guān)代碼都強(qiáng)制把完整報(bào)文用十六進(jìn)制打一遍再走后續(xù)流程這個(gè)習(xí)慣救回來(lái)的時(shí)間遠(yuǎn)超它花掉的幾秒。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
秋霞久久亚洲精品成人| 老女人老91妇女老热女| 美女91网| 色婷婷激一区二区三区| 97干色天堂| 天天爱天天操| 人妻av在线| 国产妇女精品视频青青草| 亚洲天堂资源网| 日韩AC| 都市激情人妻一区二区青青操视频 | 国产成人精品一区| 18禁中文字幕| 夜夜福利| 国模不卡| 操淫穴亚洲五月丁香| 大象AV在线| 五月激情视频| 天天狂操夜夜狂日| 久久一留热品黄| 97精品久久| 67914亚洲精品| 易易A毛视频| 亚洲一本色道中文无码aV天美| 人妻 制服 日韩 中文 在线| 亚洲自拍天堂| 丝袜综合| 99色热国产视频精品| 99re69综合| 久热69九色熟妇97| 亚洲欧洲激情卡通另类文学四射小说网站| 九九热九九| 九九九偷拍| 九九aV| 久欲AV| 日韩色欲久久一二三四区| 久久久熟妇熟女国产| 蜜乳视频网站| 欧洲精品欧洲精品| 另类专区在线观看| 黄片视频观看| 欧美乱妇狂野欧美在线视频| av网页一区二区三区| 男人的天堂日本东京热| 久热9| 欧美美女视频| 麻豆久久久久久久久丝袜 | 78精品| 五月丁香久久| 亚洲āv网址在线观看| 97爱欧美| 免费综合亚洲中文| 天美传媒AV在线| 国内精品不卡无毒99999| 99色热| 国产一区96在线| 国产精品剧情| 好看的91视频| 亚洲成人久久一区二区| 成人十八禁日韩欧美一二三| 日本亚洲熟女视频| 日韩少妇无码| 91天美传媒精品| 大色综合网| 色噜噜综合在线| 欧美天天| 色婷婷一区二区三区久久午夜成人不| 操一区| 大JI巴好深好爽又大又粗视频| 一区二区三区四区五区高清无码永久视频 | 男女猛烈无遮掩视频免费软件| 中文字幕诱惑制服人妻丝袜美丝袜美| 日本特黄f c2| 欧美一级黄片视频在线| 日韩精品人妻中文字幕不卡乱码| 九九久久久久久爱| 91一起操| 久久久久久久久久久免费精品| 久久有码| 91久青| 亚洲午夜福利在线影院| 翔田千里无码一区| 欧美另类天堂| 极品久久久久久久久久久久久久| 丁香婷婷啪啪| 欧美1区二区三区公司| 激情文学亚洲| 欧洲与亚洲欧美精品中文字幕| 国产小u女在线观看| 亚洲欧美色图片| 风月影院男女十八禁| 超踫中文字幕| 91麻豆va国产精品| 天综合网欧美| 亚洲丝袜色| 韩三级a视频在线观看| 东北女人性交| 欧美综合色图网| 美女大乳久久久久久久女人18| **一级毛片国产| 国内精品久久人妻性色av| 玖色av| 人妻精品4K4K4K4K4| 国产精品制服丝袜清纯唯美| 国产91乱伦| 97色综合中文网| 在线情色电影 91大 | 日本亚欧爱爱| 天美欧美国产| 欧美天天谢综合网| 久久久com| 日本三级R| 天天干天天燥| 思思视频免费看网站| 一本久道久久综合狠狠爱一密臀精| 欲香欲色天天天综合和网| 欧美熟爽综合| 成人欧美一区二区三区黑人一| 国人欧美精品一区二区| 久久综合亚洲色1080p| 亚洲色婷婷综合久久一区二区三区| 91撸色网 玖玖网 欧美| 美女91在线观看| 口爆综合网| 欧美黄色大香蕉一区二区| heyZO天然素人无码AⅤ专区| 婷婷去俺也去六月色| 成人午夜高潮av猛片| 欧美日韩久久精品爱爱| 9精品久久久久| 欧美 亚洲 综合 制服 另类| 亚洲另类色图片| 亚洲高清视频在线免费观看| 乱伦强奸区日韩| 九热久| 国产又粗又长又大的视频| 成人精品水蜜桃久久久久久久| 性性欧美| 国产又粗又长的视频| 欧美色图片欧美色图| 97视频在线视频| 久久精品99久久久久久| 欧洲亚洲综合| 久久9精品| 国产真实子伦对白| 综合av社区| 91亚洲网| 成人羞羞视频国产| 国产99久久99热这里只有精品15 | 九色婷婷| 色综合一区二区三巨| 91粉芽高清在线一区二区| 精品久久久久久亚洲| 床上啊啊啊一区二区三区| 九九热精品| 91久久久久久久久久久| 国产人伦精品一区二区三区| 麻豆黄四叶草网站| 亚洲欧美日韩电影网站一区 | 久久久久久久久国产| 国产欧美后入| www.av在线视频| 精品国产一区探花在线观看| 免费视频在线一区二区不卡| 亚洲精品不卡一二三区| 欧美人妻中出| 日韩视频小说在线观看| 爱射综合| 成人av影院在线观看| 377p欧洲日本亚洲大胆| 日产操逼| 自拍偷拍草一草| 婷婷超| 欧洲久久一二线| 极品销魂美女一区二区 | 26uuu国产| 操99| 美女淫穴| 九九夜精品九九在线| 上床不卡网站| 日韩专区久久久| 91天美免费| 人妻激情在线视频| 少妇九九九九| 亚洲天堂男人的天堂| 51国产午夜精品视频| 午夜一级免费毛片| 在线看免费无码AV天堂的| 九九热久久99精品re| 日韩八十路老熟女| 国产成人精品日本亚洲语言| 久久久久久久久女黄| 夜夜嗨AV一区天天| 亚欧性爱在线无码| 日日爱99| 水野优香在线观看| 欧美中日韩XXXX| 91少妇通奸网站| 亚洲欧洲无码一区夜| 天天看综合网| 操逼网免费无码视频| 六六久久日韩不卡| 亚洲情色 自拍| 国产熟妇 码视频户外直播| 69av一区二区三区| 成人性爱全视频观看| 色欧美天天| 超碰97久久国| 天堂v无码免费视频| 在线观看综合精品亚洲| 精品久久久久瑟瑟| 亚洲久9| 精品人妻一区二区视频| 国产视频一区二区在线观看| 99re在线精品78| 久96热在线观看视频| 午夜福利精品| wwe 天天干.com| 亚洲综合首页| 中文字幕精品一区二区精品| 91亚洲丝袜| 中文字幕人成乱码熟女香港| 少妇高潮99p| 婷婷人妻激情| 亚洲各类熟们中文字幕| 日韩特一级久久| 国产精品欧美激在线| 你草精品在线视频| 粉嫩AV一区夜夜嗨| 国产激情综合五月久久| 啊啊啊 在线| 开心五月婷婷激情| 亚洲AV在线资源| 少妇大屁屁| 国产精品嫩草影院免费| 精品国产乱码久久久久久蜜臀| 377p欧洲日本亚洲大胆| 久久鲁夜| 亚洲国产尤物yw在线观看| 蜜乳av首页| 亚洲天堂另类| 骚货| 黄片视频观看| 免费9 1久久| 日韩激情啪啪啪| 麻豆乱码久久精| 精品少妇999| 宗合情欲网| 国产一级高跟丝袜| 天天干1区2区在线| 日本日逼视频网| 91网站18| 少妇色综合| 色综合色色| 啪啪啪综合网| 国产精品一区二区后入| 美女自卫慰黄网站免费| #NAME?| 久久这里是精品| 熟女激情综合网| 天美国产三级传媒| 亚洲欧洲av影音| 亚洲情色图片区| 欧美aaaaaaa| 麻豆激情综合| 性色av网站| 亚洲天堂AV在线播放| 五月丁香黄色网| 超碰97爽| 欧美强奸乱| 午夜舔阴达高潮视频免费看| 97高清啪啪| 巨爆乳一区二区爆乳区| 91丝袜视频在线观看| 怡红院成人av| 无码高清专| 国产高清午夜成人在线观看| 午夜九九| 欧美色图私拍91| 久久婷婷热| 伊人久久综合影院| 日本色日夜干| 国内操逼视频二区| 精品四五区| 欧美日韩性爱视屏免费看了| 国产一进一出视频网站| 2017天天插| 99热国产| 午夜性| 天天精品| 亚洲一卡2卡3卡4卡乱码网站 | 久草草一二三四区久久| 欧美性爱精品七区| 激情人妻另类| 国产精品一区二区a| 欧美亚洲清纯| 久久久久人| ...日韩成人一区二区三区字幕| 夜夜爽77777| 一区二区影视| 天天干夜夜操一区二区| 一级啊性爱在线视频| 日韩精品字幕| 怡红院久久老司机| 色www精品视频在线观看| 黄色不卡视频| 91色黑人少妇| 亚洲s在线观看| 蜜臀精品1区2区| 宅男午夜在线视频| 精品亚洲俞拍视频一区| 91美女丝袜诱惑视频| 亚 欧 美 综合| 亚洲天堂另类小说男人| 婷婷色香| 超硑97精品| 中文高清一区二区的| 国产天天骚| 人人澡人人弄| 好湿好紧视频| 国产日本一区二区三区蜜臀在线观看| 欧美91在线| 国产高清亚洲日韩一区| 国产成人无码a| 热的中文 热的有码 热的国产| 国产一区二区久久| 国产精品久久伊人| 91宗合网| 男人高清无码一区二区| 天天躁日日躁XXXXYY| 色婷婷综合视频| 99精品欧美一区二区三区桃色| 日韩97| 97天天摸天天碰| 国产在线观看一区二区三区| 亚洲 日本 国产 综合| 26uuu国产免费观看| 亚洲人成色9999精品久久 | 精品久久青青草| 久久久久久中文版| 男人精品天堂一区| 黄骗免费网站| 久操热| 久久草视频污视频| 久久精品国产亚洲AV清纯| 国产亚洲日韩欧| 国产999精品久久久久久| 999综合色| 久草午夜| 天天拍天天操| 亚洲自拍欧美国产首页网曝| 欧洲综合色| a级理论午夜日本| 欧美精品双插| 亚洲国产美女久久久久| 国产精品色色| 欧洲亚洲人妻无码高清久久三区四区| 特色a在线上| 国产在线综合福利网站| 嗯嗯嗯啊啊在线观看| 国产精品丝袜久久亚洲不卡| 免费成人在线熟妇网| 国内毛片免费h片在线| 久久久久久波多野吉衣高潮| 色色香蕉| 中文字幕成人乱码熟女精品国50 | 久久女女| 亚洲熟女少妇免费视频| 色色青青久久| 在线观看啊啊啊啊啊| 国产精品午夜AV完会免费| 亚洲中文字幕一区二区| 一级AV性爱| 曰本人妻人人澡人人夹| 91亚洲青青草原精品1区| 精品一区二区三区蜜桃臀www| 一级一性爱免费视频| 乱伦1色页| 久久久一热在线播放| 大但人体久久久久| 国产黄色 A 片免费看| 97这里都是精品| 凹凸精品熟女在线观看| 婷婷五月天激情小说| 九九免费影片| av日韩手机在线影视| 国产天天骚| 久久久蜜桃臀无码视频| 久草视频分类在线| 国产白丝网站| 国产精品国产自产高清AV| 精品97精品97| 超碰97人妻| 大香蕉亚洲中文| 在线日韩精品一区二区三区| 麻豆 欧美 日韩| 日韩熟女精一区二区三区不卡| 国产av又色又爽又黄| 伊人玖玖网| 综合亚洲欧美精品日韩?v| yirendaxiangjiashipin| 人妻精品视频一区二区三区| 超碰久久中文| AV一起草在线| 天堂av最新电影网| 99国产人成精品| 国产1024在线播放| 大香蕉色网| 色就色综合| 蜜臀久久精品久久久久视频| 丁香五月激情综合国产| 中欧人妻丝袜中文字幕| 亚州乱码中文字幕综合久久久| 91美女小视频| 亚av顶级裸体一区二区三区四区五区 | 夜夜嗨TV| juliaann精品熟女一区| 爽 好舒服 无码刺激久久| 亚洲图片欧美色| 9久久美女首页| 久热伊人| 激情抓乳插进去啪啪啪日韩| 九九久久玖玖| 欧美第一页| 丝袜内射| 激情五月综合| 日本操逼视频导航| 超碰97人妻| 91超碰丝袜制服| 黄总AV色图| 日欧操屄视频| 国产极品美女高潮无套在线观看| 97超碰色色| 韩日自拍| 久久久久久波多野吉衣高潮| 久久人妻视频| 97在线视频观看免费| 91是天天| 韩国一级婬片A片无码天美| 久久久人妻| 91欧美经典| 日本在线伊人啪啪| 亚州色综合| 易易A毛视频| 久久亚洲天天做| 亚洲欧美国产成人综合不卡| 中文字幕天天操| 国内毛片欧美香蕉精品| 一中国女人毛片水真多| 上海一级黄片| 天无日色综合| 久久久免费懂色| 大学生美女口爆| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 五月婷婷丁香| 97香蕉人人乳| 欧美色性情| aⅴ日韩成人电影av在线免费看av大全| 久久最新视频免费观看| 色网色网色网色网色网色| 色小视频蜜乳| 亚洲风情综合网| 天天色悠悠激情| 97超碰色| 五月丁香六月激情| 日本高清一本二本免费不卡| 夜夜影视四色| 日韩精品人妻中文字有码在线| 无码137片内射在线影院| 欧美日韩高潮喷水91| 东京太热男人的天堂久久久| 国模少妇一区二区三区| 亚洲国产97在线精品一区| 久久性爱城| 91男女| 久久鲁干| 精品人妻少妇| 亚洲宅男天堂| 欧美极品| 美腿丝袜高跟网免费视频免费视频| 1769一区| 色制服丝袜夫妻av一区| 上海一级黄片| 久久9免费视频| 郑州宾馆老熟女露脸啪啪| 香蕉免费一区二区三区不读| 欧美18老人禁| 国产黄a三级三级三级av在线看 | 啊啊啊啊啊啊啊啊啊在线观看| 亚洲熟女性高潮久久久| 国产AB视频| 97av在线视频| 日韩一级久久毛片| 天美传媒Av在线| 国产97视频免费观看| 中文字幕av片| 日韩情色视频| 国产精品网址| 97久久超碰国产精品| 五月婷婷综合网| 亚洲加勒比久久日本道| 免费网站观看www在线观| 亚州操逼图| 超碰吊日色| 国产女上位好爽在线| 免费看黄片现成| 色哟哟1区2区| 超碰人人妻| 日韩AV无码网站| www被窝色com| 一区二区日韩欧美久久| 久久性爱视频99| 蜜臀久久99'精品久久久| 蜜桃色色网站视频三区| 中日亚韩免费视频| 超碰97COm中文| 天天舔九色婷婷| 免费精品福利在线观看| 色色色日本| 青青草五月份天| 亚洲色综合| 白丝一区| 亚洲欧美国产精品久久久久久久| 精品人妻一区二区免费蜜桃| **一级毛片国产| 青娱乐福利99| 午夜啊啊| 欧美九九99久久精品| 日韩激情啪啪| 免费一级性爱久久| 久久久久久久性爱| 97视频在线免费播放| 神马久久久久眼| 日韩不卡a级视频专区| aV中亚| 九九热午夜欧亚国产视频| 99综合视频一体| 啊啊啊啊啊舒服| 亚洲情色欧美| 成人天天爽| 刺激性视频黄页| 日本护士高潮| AV网站高清无码在线观看| 国产99热| 欧美自拍网| 噜噜噜亚洲精品| 97亚洲综合电影| 人妻-91porn| 干超碰碰熟女| 国产三级中文字幕粉嫩 | 艹我哪美一区无码| 97任你吞精| 亚洲伊人a线观看视频| 国产精品国产精品国产| 欲色综合| 亚洲91射| 亚洲一区制服诱惑| 日韩 成人 有码| 人人手机欧洲亚洲国产人妻| 五月天色综合| 国模吧 一区二区三区| 日韩激情啪啪啪| 欧美日韩亚洲天堂网| 91精品丝袜久久久久久| 超碰97导航| 60秒免费小视频| 亚洲AO在线| 国产精品一区二区在钱播放| 狠狠 91| 国产女人操逼视频| 国产精品久久久久久高清无码免费看 | 精品人妻视频入口| 久久精品一区二区一8| 日本一二区不卡| 中文字幕在线免费观看| 国产97视频| 亚洲AV不卡在线观看| 欧美国产操逼| 久热99999| 亚洲天天精品| 超碰综合97在线| 欧美一区二区三熟女剧情| 狠狠躁日日躁夜夜躁A| 五十路熟女工口 | 久九9精品| 岛国不卡超碰护士AV在线播放| av72网| 欧美国产操逼| chaopen97久久| 亚洲天在线| 78m成人视线| 美女91在线| 久久久97| 亚洲国产精品99久久久| 国产白嫩漂亮KTV在线| 婷婷午夜成人色中色| 亚洲精品啪视频| 1769精品一区二区三区| 我要看免费韩日黄片| 色五月婷婷五月天| 伊人97色天使| www.AV有限公司一区| 欧洲亚洲人人爽爽视频| 久久综合久色欧美综合狠狠| 亚洲脚交| 91欧美综合| 内射夫妻三片| 国产辣妈在线视频福利| 99国产在线 精品 视频| 欧美成va视频网站| 操九九九九九九| 蜜臀AV成人精品蜜臀| 久久久久久久久久久久九| 人澡逼| 超碰97丝袜| 五月婷婷丁香六月丁香| 欧美视频一区二区在线| 3571色综合一区二区二区| 久久免费看高潮毛片韩国| 国产亚洲日本| 香蕉99秘 一区精品蜜桃臀| 12一15性XXXX粉嫩国产| 欧美性爱日韩性爱| 丝袜 亚洲 偷拍| 天天日天天射天天干| 久久久精| 一二三区精品视频| 欧亚日韩一区在线| 中文字幕aⅴ在线视频| 日韩三级视频一区二区三区| 又黄又粗又硬又长又大| 久久久女人| 亚欧毛片基地国产毛片基地| 色欲久久综合| 闷骚老熟女15P| 欧美日韩亚洲少妇寂寞影院正在播放| 思思热在线视频免费| 欧美强奸乱| 校园春色综合| 天天综合亚在线| 久悠悠av| 综合久久99亚洲人妻中文在线| 91操熟女视频| 啪啪性爱免费视频| 天天干天天插| 中文熟女五十乱码在线| 欧美片第一页| 五月天啪啪| 东京热不卡视频| 女性喷水高潮在线观看| 九九色图| 亚洲男人天堂2013| 日韩电影在线观看网址| www.久久久久| 在线观看午夜婷婷久久久久清性观看| 天天躁日日躁狠狠躁| 亚洲一区二区精品福利| 日本啊啊啊啊啊视频| 干B网| HEYZO高无码国产精品227| 免费人人搞97| 中国人高清www色视频免费| 国产精品午夜高潮呻吟久久av| 色婷婷婷五月天激情四射| 亚洲欧洲自拍| 五月婷婷爱六月丁香色| 国产高清自拍视频| 97久久久精品| 精品久久九| 国产精品第一页国产大屁股视频免费区| 成人三一级一片aaa| 麻豆AV一区二区| 影视综合无码少妇| 中文字幕久热视频在线| 天天摸天天插天天日| 日韩精品资源| 久久久久成人亚洲国产| 天堂8在线新版官网| 色五月大香蕉| 天欧美在线| 国产精品嫩草影院免费| 天天躁日日躁AAA片李宗瑞| AV99热18这里只有精品| 91丨人妻丨国产丨丝袜| 东京热男人的天堂网| 人妻天天操天天爽视频免费| 激情AV| www.99热在线只有精品| 久久产精品一区二区三区电影| 国产这里只有精品| 亚洲精品黄码久久久久| 国产一区二区三区精品观看啪| 人妻素股| 尤物一级在线免费观看| 日韩色图 一区二区| 艹少妇网站| 无卡一区=区| 91精品人妻电影| 欧美在线大香蕉| 999久久久免费精品国产牛牛| 天综合中文| 国产成久久综合片| 亚洲自拍一区夜夜操| 日韩激情啪啪啪| 日韩 欧美 国产 麻豆| 51一区二区三区| 精品9999| 色色激情| 国产成人亚洲精品无| 一区,二区,三区网站| 人人干黄色| 青青草成人视频在线观看二区 | 亚州色图欧美色图| 色色99| 日韩天天综合| 精品国产精品一区二区| 久久亚洲一区女同性恋中文字幕| 岛园激情| 久久岛国| 中文字幕88av在线| 一类av片在线看| 国产精品69久久久久久久| 91九色网| 91精品无码久久久久久久| 99色婷婷中文字幕乱色| 亚洲五码一区二区三区| 伊人网高清| 99色色网| 丁香九月 婷婷| 日韩精品9999| 日韩欧美午夜视频在线| 久久香蕉国产线看观看亚洲女人 | 99亚洲精品| AV中文字幕剧情1区2区3| 欧美性生活综合| 98久久| 不卡人妻少妇精品毛片一区23区视频| 蜜乳av一区二区| 大香蕉一人| 岛国小电影| 久久av成人无码免费| 亚洲无码日韩电影| 青娱乐大香蕉| www.久久爱| 免费中文综合精品| 欧美日韩国产精品久久色婷婷| 亚洲情色电影网| 中日亚韩免费视频| 欧美翘臀视频网站一区二区三区| 91成人国产综合久久精品蜜月| 精品久久人妻成人网| 色色毛片| 97精品久久久久中文字幕| 久操com| 色色97爱| 日本一区二区电影网站| 久久中文字幕一区不卡| 欧美影音在线| 花野真衣| 亚洲AV无码乱码在线观看性色| av激情亚洲五月天| 亚洲欧美变态| 和协影院中文字幕三区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 琪琪精品免费一区二区三区 | 三上悠亚在线毛片91| 综合大香蕉美。| 又黄又粗又硬又长又大| www.夜夜| 中国一级操逼视频| 东京热一区二区中文字幕| 亚洲日韩黑丝| 超碰综合色| 精品久久久久,69国产成人精| 色五月AV| 国产人妻一区二区三区欧美毛片| 国产精品天美传媒| 欧洲熟妇xxXx欧美老妇裸体| 亚洲导航深夜福利| a亚洲欧美色欲| 超碰在线一区二区| 亚洲第一视频 欧美风情 日韩| 99精品国产户外露出| 四季AV一区二区凹凸精品小说| 天天干少妇| av一区二区三区 中文| 人人潮人人摸| 600国产精品视频| 青青草无码视频| 亚洲色91C| 蜜奶av| 800zy一区二区| 男人的天堂2010| 开心五月婷婷激情| 久久东京国产精品视频| 约操熟妇| 久草网站免费在线观看| 日韩精品在线观看观看| 国产亚洲福利第一页丝袜| 日本一二区不卡| 久久内射| 欧美精品一二三| 综合色欧美| 91欧美www| 噜噜噜噜天天狠狠| 天天超级碰碰碰| 天天干天天日天天射黄色大片| 日韩97超碰中文字幕| 亚洲欧美日韩精品久久久一区二区 | 免费的黄片有限公司| 成人蜜乳小视频网站| 欧洲熟妇xxXx欧美老妇裸体| 日本免费亚洲欧美| 五月天婷精品激情| 欧美久久伊人| 欧美精品久久久久久久久88| 国产1769在线| 国内毛片免费h片在线| 留下AⅤ黄色片| 另类专区在线观看| 婷婷午夜| 欧美78p| 久久久久骚| 色噜噜人妻av 中文字幕| 蜜桃精品一区二区三区ww| 岛国AV一区二区电影| 欧美爆操91| 久久久专区| 日韩色图 一区二区| 毛片麻豆91糖心精品毛情片| wuyechaopeng| 久久精品中文字幕女同| 日韩天天本| 蜜桃臀一区二区aV| 日日97| 国产99热| av一区二区三区不卡| 女同女同恋久久级三级| 乱伦AVxx| 九月丁香婷婷| 日本丝袜美腿人妻九九| 神马久久69| 午夜操操操| 欧美亚洲小说| 操一操摸一摸| 人妻一区二区三区视频| 精品中文字幕一区二区l - 百度| 色综合久久久久| 宅男午夜在线视频| 久久一区二区加油站| julia ann久久| 美欧色综合| 91人妻最真实刺激绿帽| 欧美性爱1080p| 久久九九综合| 国产精品一区人妻精品阁在线| 蜜桃在线观看一区二区三区 | 日本亚欧爱爱| 97超碰色色| 国产亚洲女v在线观看| 日韩国产成人自拍视频| 三级三级三级日本99| 秋霞午夜视频一区二区| 婷婷丁香人妻 | 亚洲?V高清一区二区三区尤物| 日本日逼高清| 亚洲婷婷五月天| A啊啊在线观看| 竹菊一区二区三区AV线| 日韩免费av片高清无码| 欧美成人午夜免费福利785| 欧美人妻精品| 亚洲图片偷拍欧美| 亚洲av成人精品一区| 国产一级作爱毛片| 亚洲情色电影网| 久久久久久久久国产| 偷拍综合网| 熟女五十路一区二区三| 五月丁香啪啪啪| 亚洲综合性网址| 五十路一区无码| 啪啪啪精品| 先锋精品av色鲁| 亚洲美女黄色| 青娱乐国产剧情av一区| www欧美性爱| 国产60区。| 麻豆91熟妇人妻中文字幕茄子| 一二三四视频中文字幕在线看| 亚洲天堂电影精品一区| 国产视频小说| 亚洲āv网址在线观看| 91超级碰| 骚逼自拍99| 一级婬片120分钟试看| 五月婷视频| 精品乱码在线观看| 高潮精品| 亚欧高清在线| 国内黄色精品| 啊v在线观看视频| 欧美精品日韩一区二区| 老熟女中文字幕高清| 女性喷水高潮在线观看| 久久天堂婷婷网| 老司机免费视频在线91| 精品国模无码| 国产天美欧美| 校园春色AV天堂| 亚洲一区二区中文字幕| 久久伊人青青草| 日韩性爱小视频| 91粉嫩萝控精品福利网站_精品影音先锋国| 久偷拍| 亚洲色婷婷久久91| 久久免费中文字幕在线观看| 色综合大香蕉| 成人电影一区| 男人的天堂kva| 户外裸露刺激视频第一区| 98精品国产乱码久久久久久| 亚洲精品自拍| 78综合网| 欧美色女人| 天天操狠狠日夜夜干超碰撸com视频在线观看| 另类视频在线| 人人操肉肉| 熟妇熟女一区二三区| 中文字幕日韩专区精品系列| 午夜福利久久久噜久噜久久综合| 亚洲国产精品无码AV久久| 一区二区激情国产熟女| 午夜一区| 青青草视频久久| 午夜精品久久99蜜桃的功能章节 | 国产99 中文字幕日韩小视频| 另类亚洲图色| 国产综合色精品在线观看| 奸色色 男人天堂 天天射| 在线亚洲欧美| 乱理日韩中文| 成人无码在线视频网站| 欧美97在线观看| 又粗又长又大国产不卡| 嗯嗯啊啊亚欧精品| 大屁股人妻女教师撅着屁股| 伊人影院中文字幕| 欧美日韩人妻精品系列一区二区三区| 色情五月婷婷| 美女诱惑一区| 97青青操视频| 操婢日韩| 激情四射五月天| 天天色综亚洲91污| 东北女人性交| 欧美一区91大爱| 东北女人av| 不卡视频一区蜜桃视频 | WWW啪啪的com| 青青草久草AV| 99热精品在线播放| 校园春色五月天| 欧美九九99久久精品| 69少妇一区二区| 思思视频免费看网站| 麻豆精品一区二区三区四区免费观看| 亚洲经典啪啪| 我要色综合网| 91欧美长吊| 人人射人人操人人摸| 亚洲精品成人| 久久婷婷亚洲欧| 91宗合网| 老司机深夜18禁污污网站| 韩国一级婬片A片AAAAA| 另类av天堂| 美女啊啊啊啊啊| 亚洲一本色道中文无码aV天美| 91丝袜美女| 色97欧美| 日本操逼视频在线| 91狠| 99只有精品| 国产精品不卡av免费在线观看| 久久欧美性爱视频| 婷婷在线视频| 欧美在线大香蕉| 亚洲欧美日韩偷拍色图| 欧亚乱色熟女一区二区| 综合 青草 伊久久 影院 综合| 日韩有码中文字幕女同性恋| 精品久久无码午夜福利| 97WW精品| 日韩精品午夜操呦呦不卡影院| 91视频伊人| 欧亚乱色熟一区二区三四区| 九九九九九九成人| 久久久免费高清中文视频| 色在线亚洲视频www| 嗯~啊~快点 死我视频| 久久綜合很很很| 青草一区二区| 中文字幕在线高清男人的天堂 | 91亚洲欧美激情| 蜜桃av综合网发布| 91影视亚洲| 东北少妇高潮zzzz| 乱人伦 国语对白:视频直接看| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 国产精品白丝AV| 久久亚洲精品成人av| 九九热精彩视频| 无码丰满熟妇一区二区浪潮AV| 免费9 1久久| 澳门黄片一香蕉视频| 日产狠狠干| 天天伊人| www鬼畜国产男人的天堂| 少妇久久久久久| 小草精彩毛片| 亚洲乱码精品一区二区| 超碰97资源大奶| 婷婷伊人五月| 综合久欧洲| 国产精品视频自拍在线| 精品国产国产AV| 丁香婷婷五月| 日韩精品操少妇| 人人潮人人摸| 国内一区二区三区| 婷婷久久久| 91AV天堂| 欧美性爱伊人| 天天欧美| 久热伊人99re| 青青草原av| 一区二区首页| 青草草免费网站av| 天天躁狠狠躁av| 婷婷五月天av| 精品熟女呻吟久久91| 亚洲精品天天影视综合网| 一本久道在线综合视频| 美国三级日本三级久久99| 一区二区三区欧美激情| 超碰精品97| 大香蕉宗合网在线| 欧美A片中文字幕| 欧美熟女丝袜| 99熟女| 老司机香蕉久久久久| 精品人妻1237| 一级黄色视频网| 超碰97极品9| 婷婷五月天AV| 午夜男女爽爽大片免费观看| 99天天超碰| 欧美日韩国产高清在线一二三区 | 日韩性爱一级片| 成人在线视频一区| 日本欧美一区二区三区免费| 久久久久久十| 欧美情色男人的天堂| 极品极品色影院| 国产成人亚洲精品无码最新在线| 亚洲天堂日本| 日韩AV片| 精品人妻av在线播放| 男人的天堂久久| 国模不卡一本二本三电影| 男人的天堂一区三区| 国产精品农村妇女| 久久水蜜臀亚洲AV无码精品| 亚洲黄网在哪免费看| 国产毛片毛片4p懂色| 亚洲97网站| 特级大荫道BBwBBwBBW| 黄色性爱网网| 欧美精品久久久久久久丰满| 香蕉国产97| 屌妞视频久久久久久久久久久久| 免费看日产一区二区三区| 亚洲大色堂| 久久国产精品91| 欧美另类自拍 | 亚洲欧美精品久| 99热18这里只有精品| 超碰97综合网| 日躁天天爽爽| 国产美女在线精品免费看| 欧美日韩色综合网| 人人操人人摸人人看人人插| 伊人久久大香大香线蕉中文| 丁香五月天激情综合| 亚洲熟女乱色| 使劲用力艹少妇视频一区二区| 国产九九九九九九| 亚洲Av诱惑| 夜夜操美女| 国产强奸AV在线| 黄色AAAAA欧美| 色婷婷网| 五十路成人在线视频二区三区| 江都AV在线| 开心五月婷婷| 激情综合婷婷| 亚洲午夜福利在线影院| 亚洲āv网址在线观看| 中文视频在线观看| 激情小说激情视频| 骚鸭AV| 日韩特一级久久| 97视频在线视频| 精品二999| 亚洲城人男人的天堂| 精品国产乱码久久久久A| 亚洲天堂热| 人人色人人操在线| 在线观看日韩av不卡| a级成人毛片免费视频高清| 国产成人欧美一区二区三区的国产| 老司机午夜精品视频| 男女国产精品| 伊人欧美大香蕉视频| 骚逼自拍99| 91AV天美在线视频| 九九九九精品一区| 91久久久老司机| 伊人久久亚洲中文字幕不卡| 国产一区96在线| 综合色图亚洲欧美| 伊人综合色网| 97精品一二区| 欧美熟女激情| 99青青草国产视频| 五月婷丁香| 97久久超碰| 玖玖色综合| 污啪啪啪视频| 色播五月婷婷| 成人日本精品九区| 久久97超碰香蕉| 99热aaa| 97国产综合欧美| 91亚洲情色| 日本一区二区三区免费观看| 亚洲欧洲精品视频发布| 久草福利在线资源站| 一本道综合色图| 91国产大片| 美女91网址| 夜草网站| 大香蕉久| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 午夜天堂啪啪| 亚洲密乳AV| 精品人妻av在线播放| 日本一区三级韩国| 色偷偷综合91久久噜噜|