日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

HTTP 代理服务器的设计与实现(C++)

發(fā)布時間:2024/1/11 windows 39 coder
生活随笔 收集整理的這篇文章主要介紹了 HTTP 代理服务器的设计与实现(C++) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

實驗內容

  1. 設計并實現(xiàn)一個基本 HTTP 代理服務器。要求在指定端口(例如 8080)接收來自客戶的 HTTP 請求并且根據其中的 URL 地址訪問該地址 所指向的 HTTP 服務器(原服務器),接收 HTTP 服 務器的響應報文,并 將響應報文轉發(fā)給對應的客戶進行瀏覽。
  2. 設計并實現(xiàn)一個支持 Cache 功能的 HTTP 代理服務器。要求能緩 存原服務器響應的對象,并 能夠通過修改請求報文(添加 if-modified-since 頭行),向原服務器確認緩存對象是否是最新版本。 (選作內容)
  3. 擴展 HTTP 代理服務器,支持如下功能: (選作內容)
    1. 網站過濾:允許/不允許訪問某些網站;
    2. 用戶過濾:支持/不支持某些用戶訪問外部網站;
    3. 網站引導:將用戶對某個網站的訪問引導至一個模擬網站(釣魚)。

代理服務器的概念

代理服務器,允許一個網絡終端(一般為客戶端)通過這個服務與另一 個網絡終端(一般為服務器)進行非直接的連接。普通 Web 應用通信方式與采用代理服務器的 通信方式的對比如下圖所示:

代理服務器在指定端口(本實驗中所指定的是666端口)監(jiān)聽瀏覽器的訪問請求(需要在客戶端瀏覽器進行相應的設置),接收到瀏覽器對遠程網站的瀏覽請求時,代理服務器開始在代理服務器的緩存中檢索 URL 對應的對象(網頁、 圖像等對象),找到對象文件后,提取該對象文件的最新被修改時間;代理服務器程序在客戶的請求報文首部插入,并向原 Web 服務器轉發(fā)修改后的請求報文。如果代理服務器沒有該對象的緩存,則會直接向原服務器轉發(fā)請求報文,并將原服務器返回的響應直接轉發(fā)給客戶端,同時將對象緩存到代理服務器中。代理服務器程序會根據緩存的時間、大小和提取記錄等對緩存進行清理。

代碼結構

代碼*實現(xiàn) 3個類,分別為WebsiteDetector類、Cache類和HttpProxyServer類。

WebsiteDetector類:

該類實現(xiàn)了網站過濾和網站引導功能。通過構造函數直接靜態(tài)設置了釣魚網站和屏蔽的網站:

WebsiteDetector::WebsiteDetector() 
{
	AddValidURL("http://jwc.hit.edu.cn/","http://jwts.hit.edu.cn/");
	AddBlockedURL("http://xltj.hit.edu.cn/");
}

可知,屏蔽了心理網站。將教務處網站引導到本科教學管理與服務平臺。

Cache

該類在當前目錄下創(chuàng)建文件夾.cache/,在其中存儲瀏覽緩存對象。同時該類中,保存著對象與文件名的映射關系,對象和LastModified字段的映射關系。

class Cache {

public:

std::string GetDate(const std::string& url); // 獲取url對應保存的LastModified字段

bool Get(const std::string& url, char* response, size_t& start, size_t& responseSize); // 讀取緩存

bool Put(const std::string& url, const char* response, size_t responseSize, size_t& start); // 保存緩存

private:

?      std::string cacheDirectory_; // 存放緩存的文件目錄

?      std::map<std::string, std::string> cacheMap_; // 對象和LastModified字段的映射關系

?      std::map<std::string, std::string> fileMap_; / 對象與文件名的映射關系

?      std::mutex mutex_; // 多線程同時讀寫文件的互斥鎖

};

HttpProxyServer

該類是代理服務器的實現(xiàn)類。是一個多用戶代理服務器。首先該類創(chuàng)建HTTP代理服務的TCP主套接字,該套接字監(jiān)聽等待客戶端的連接請求。當客戶端連接之后,創(chuàng)建一個子線程,由子線程行上述一對一的代理過程,服務結束之后子線程終止。

class HttpProxyServer

{

public:

	HttpProxyServer(int port); // 構造函數,參數為端口號

	void Start(); // 監(jiān)聽客戶端連接請求

private:

	int serverSocket_; // 代理服務Socket

	int port_; // 端口號

	struct sockaddr_in serverAddr_; // 代理服務地址

	Cache cache_; // Cache類

	WebsiteDetector websiteDetector_; // websiteDetector類

	void HandleClient(int clientSocket); // 子線程調用函數

	std::string ExtractUrl(const std::string &httpRequest); // 解析URL

	int CreateServerSocket(const std::string &host); // 創(chuàng)建與原服務器連接的Socket

	bool ServerToClient(const std::string &url, int clientSocket); // 轉發(fā)數據

	void ParseUrl(const std::string &url, std::string &host, std::string &path); // 解析主機名與路徑名

};

程序基本流程

(1) 初始化服務器Socket,監(jiān)聽等待客戶端的連接請求。

(2) 當客戶端連接后,創(chuàng)建子線程處理請求。

(3) 子線程接收請求,解析HTTP請求的首部行和請求頭。然后提取Url,Url作為參數通過websiteDetector類判斷是否屏蔽或者引導。

(4) 然后進入轉發(fā)的過程,首先進行域名解析,然后創(chuàng)建Socket先原服務器發(fā)送請求,接收響應,將數據轉發(fā)到客戶端。

(5) 在轉發(fā)的過程中,涉及保存緩存和讀取緩存。

網站引導功

利用首部行中的location字段,實現(xiàn)引導。

std::string locationResponse = std::string("HTTP/1.1 302 Found") + MY_CRLF + "Location: " + newUrl + MY_CRLF + MY_CRLF;

send(clientSocket, locationResponse.c_str(), locationResponse.size(), 0);

用戶過濾功能

設置服務器地址信息時實現(xiàn)。

serverAddr_.sin_addr.s_addr = INADDR_ANY;

// serverAddr_.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //只允許本機用戶訪問服務器

Cache功能

1. 代理服務器處理客戶端請求時,對于第一次出現(xiàn)的對象,會保存下。當客戶端再次請求時,代理服務器就會在請求中添加If-Modified-Since首部行。

date = cache_.GetDate(url);
std::string cacheRequest = httpRequest + "If-Modified-Since: " + date + MY_CRLF + MY_CRLF;
  1. 發(fā)送該請求后,等待原服務器響應,并判斷是否回應304狀態(tài)碼。
if (IsResponseNotModified(responseNotModified) ) {
?      // std::cout << "304 Not Modified" << std::endl;
?      sel = false;
}else {
?      cache_.ClearFileContent(url); //清空
?      sel = true;
}
  1. sel為false時,則讀取Cache轉發(fā)到客戶端。若為true,則發(fā)送HTTP請求到原服務器,再接收響應,轉發(fā)到客戶端,再保存到Cache。

修改Chrome瀏覽器代理配置

--proxy-server="http://127.0.0.1:666"

VScode編譯運行

?

該代理服務器成功在666端口啟動,并輸出了cache目錄。

驗證

驗證基礎的代理功能

訪問今日哈工大網站:http://today.hit.edu.cn

可以看到,網站資源順利加載,輸出欄中,輸出了請求的各個資源對象的url。

驗證網站引導功能

輸入網址:http://jwc.hit.edu.cn/

最后直接跳轉到到了,http://jwts.hit.edu.cn/

驗證網站過濾功能

輸入網址:http://xltj.hit.edu.cn/

可以看到,無法訪問。

驗證用戶過濾功能

驗證Cache功能

將在Cache中的資源 http://jwts.hit.edu.cn/resources/css/common/ydy.css ,修改一下。

把色彩均改為紅色,再次訪問 http://jwts.hit.edu.cn/

可以看到,字體顏色變?yōu)榧t色。可知,HTTP代理服務器這次使用的是Cache中的資源。

源代碼

點擊查看代碼
//g++ your_code.cpp -o your_executable -lws2_32

#include <fstream>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <thread>
#include <vector>
#include <mutex>
#include <list>
#include <map>
#include <sstream>
#include <winsock2.h>
#include <WS2tcpip.h>



#define MAX_CLIENTS 6
#define BUFSIZE 655360
#define HEADSIZE 128
#define MY_CRLF "\r\n"

class WebsiteDetector {
public:
    WebsiteDetector() 
    {
        AddValidURL("http://jwc.hit.edu.cn/", "http://jwts.hit.edu.cn/");
        AddBlockedURL("http://xltj.hit.edu.cn/");
    }
    // 釣魚
    std::string IsURLPhishing(const std::string& url) {
        auto it = validURLs_.find(url);
        if (it != validURLs_.end()) {
            return it->second;
        } else {
            return "Phishing";
        }
    }
    // 屏蔽
    bool IsURLBlocked(const std::string& url) {
        for (const std::string& blockedURL : blockedURLs_) {
             if (url.find(blockedURL) != std::string::npos) {
                return true;
            }
        }
        return false;
    }
private:
    std::map<std::string, std::string> validURLs_;
    std::vector<std::string> blockedURLs_;

    void AddValidURL(const std::string& srcURL, const std::string& dstURL) 
    {
        validURLs_[srcURL] = dstURL;
    }

    void AddBlockedURL(const std::string& url) {
        blockedURLs_.push_back(url);
    }
};

class Cache {
public:
   
    Cache() : cacheDirectory_("H:\\cppwork\\CS-networking\\.cache") {
        std::cout << cacheDirectory_ << std::endl;
        std::system(("mkdir -p " + cacheDirectory_).c_str());
    }
    bool Check(const std::string& url) {
        std::lock_guard<std::mutex> lock(mutex_);
        auto it = cacheMap_.find(url);
        if (it != cacheMap_.end()) 
        {
            return true;
        }
        return false;
    }
    // 清空文件內容
    bool ClearFileContent(const std::string& url) {
        std::lock_guard<std::mutex> lock(mutex_);

        // Generate a unique filename based on the URL
        std::string fileName = GetFileNameFromUrl(url);
        auto it = fileMap_.find(fileName);
        std::string fileTag = it->second;

        std::string filePath = cacheDirectory_ + "\\" + fileTag;
        // 打開文件并使用 std::ios::trunc 模式來清空文件內容
        std::ofstream file(filePath, std::ios::out | std::ios::trunc);
        if (!file) {
            std::cerr << "無法打開文件:" << filePath << std::endl;
            return false;
        }
        // 關閉文件
        file.close();
        return true;
    }
    std::string GetDate(const std::string& url) 
    {
        std::lock_guard<std::mutex> lock(mutex_);
        auto it = cacheMap_.find(url);
        return it->second;
    }
    bool Get(const std::string& url, char* response, size_t& start, size_t& responseSize) {
        std::lock_guard<std::mutex> lock(mutex_);

        // Generate a unique filename based on the URL
        std::string fileName = GetFileNameFromUrl(url);
        std::string fileTag = fileMap_[fileName];

        std::cout << "Get() url: " << url << std::endl;
        std::cout << "Get() fileTag: " << fileTag << std::endl;
        // If found, read the response from the file
        std::ifstream file(cacheDirectory_ + "\\" + fileTag, std::ios::binary);
        if (file) {
            file.seekg(start, std::ios::beg);
            file.read(response, BUFSIZE);
            // Get the number of bytes read in this chunk
            size_t bytesRead = static_cast<size_t>(file.gcount());
            start += bytesRead;
            responseSize = bytesRead;
            response[bytesRead] = '\0';
            file.close();
            return true;
        }
        return false; // URL not found in the cache
    }

    bool Put(const std::string& url, const char* response, size_t responseSize, size_t& start) {
        std::lock_guard<std::mutex> lock(mutex_);

        // Generate a unique filename based on the URL
        std::string fileName = GetFileNameFromUrl(url);
        auto it = fileMap_.find(fileName);
        std::string fileTag;
        if (it == fileMap_.end()) 
        {
            fileTag = std::to_string(cnt);
            fileMap_[fileName] = fileTag;
            cnt ++;
        }else 
        {
            fileTag = it->second;
        }

        // Store the response in a file
        std::ofstream file(cacheDirectory_ + "\\" + fileTag, std::ios::binary | std::ios::app );
        if (!file) {
            fprintf(stderr, "file open error: %s(errno: %d)\n", strerror(errno),errno);
            return false; // Unable to open file for writing
        }
        file.seekp(start);
        file.write(response, responseSize);
        file.close();
        start += responseSize;
        return true; // Failed to store response in the cache
    }

    void PutDate(const std::string& url)
    {
        std::lock_guard<std::mutex> lock(mutex_);
        // Generate a unique filename based on the URL
        std::string fileName = GetFileNameFromUrl(url);
        std::string fileTag = fileMap_[fileName];
        // 拼接完整的文件路徑
        std::string filePath = cacheDirectory_ + "\\" + fileTag;

        // 打開文件并讀取 Last-Modified 首部內容
        std::ifstream file(filePath);
        if (!file) {
            fprintf(stderr, "file open error: %s(errno: %d)\n", strerror(errno),errno);
        }
        std::string line;
        while (std::getline(file, line)) {
            // 查找包含 Last-Modified 首部的行
            if (line.find("Last-Modified:") != std::string::npos) {
                // 提取 Last-Modified 的值并存儲到 cacheMap_
                size_t startPos = line.find(":") + 2;
                size_t endPos = line.find(MY_CRLF);
                std::string date = line.substr(startPos, endPos);
                // std::cout << "line: " << line << std::endl;
                // std::cout << "date: " << date << std::endl;
                cacheMap_[url] = date;
                break; // 找到后可以退出循環(huán)
            }else
            {
                if (line == MY_CRLF)
                {   
                    break;
                }
            }
        }
        file.close();
    }

    
private:
    std::string cacheDirectory_;
    std::map<std::string, std::string> cacheMap_;
    std::map<std::string, std::string> fileMap_;
    std::mutex mutex_;
    int cnt = 1;

    std::string GetFileNameFromUrl(const std::string& url) {
        // Replace characters in the URL to create a valid filename
        std::string fileName = url;
        for (char& c : fileName) {
            if (c == '/' || c == '?' || c == '&' || c == '=') {
                c = '_';
            }
        }
        return fileName;
    }
};


// 定義HTTP代理服務器類
class HttpProxyServer
{
public:
    HttpProxyServer(int port) : port_(port)
    {
        
        // 初始化服務器
        // 創(chuàng)建主套接字并綁定端口
        serverSocket_ = socket(AF_INET, SOCK_STREAM, 0);
        if (serverSocket_ == -1)
        {
            fprintf(stderr, "Constructor(): create socket error: %s(errno: %d)\n", strerror(errno),errno);
            exit(EXIT_FAILURE);
        }

        // 設置服務器地址信息
        // 初始化 serverAddr_
        memset(&serverAddr_, 0, sizeof(serverAddr_));
        serverAddr_.sin_family = AF_INET;
        serverAddr_.sin_addr.s_addr = INADDR_ANY;
        // serverAddr_.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //只允許本機用戶訪問服務器
        serverAddr_.sin_port = htons(port_);

        // 綁定套接字到指定端口
        if (bind(serverSocket_, (struct sockaddr *)&serverAddr_, sizeof(serverAddr_)) == -1)
        {
            fprintf(stderr, "Constructor(): bind socket error: %s(errno: %d)\n",strerror(errno), errno);
            closesocket(serverSocket_);
            exit(EXIT_FAILURE);
        }

        // 開始監(jiān)聽客戶端連接請求
        if (listen(serverSocket_, MAX_CLIENTS) == -1)
        {
            fprintf(stderr, "Constructor(): listen socket error: %s(errno: %d)\n",strerror(errno),errno);
            closesocket(serverSocket_);
            exit(EXIT_FAILURE);
        }

        std::cout << "Proxy server started on port " << port_ << std::endl;
    }

    void Start()
    {
        // 啟動服務器,監(jiān)聽客戶端連接請求
        while (true)
        {
            struct sockaddr_in clientAddr;
            int clientAddrLen = sizeof(struct sockaddr);

            // 接受客戶端連接
            int clientSocket = accept(serverSocket_, (struct sockaddr *)&clientAddr, &clientAddrLen);
            if (clientSocket == INVALID_SOCKET)
            {
                fprintf(stderr, "Start(): accept socket error: %s(errno: %d)",strerror(errno),errno);
                continue; // 繼續(xù)等待下一個連接
            }

            // std::cout << "Start(): Accepted a client connection" << std::endl;

            // 創(chuàng)建子線程處理客戶端請求
            std::thread clientThread(&HttpProxyServer::HandleClient, this, clientSocket);
            clientThread.detach(); // 不等待
        }
    }

private:
    int serverSocket_;
    int port_;
    struct sockaddr_in serverAddr_;
    Cache cache_;
    WebsiteDetector websiteDetector_;

    void HandleClient(int clientSocket)
    {
        // 讀取客戶端的HTTP請求
        char buffer[BUFSIZE];
        memset(buffer, 0, BUFSIZE);
        ssize_t bytesRead = recv(clientSocket, buffer, BUFSIZE - 1, 0);
        if (bytesRead == -1)
        {
            perror("HandleClient(): Error reading from client socket");
            closesocket(clientSocket);
            return;
        }

        // 解析請求,提取URL
        std::string request(buffer);
        std::string url = ExtractUrl(request);

        std::cout << "<" << url << ">" << std::endl;
        
        // Website Filter; User Filter ; Website phishing
        if (websiteDetector_.IsURLBlocked(url))
        {
            std::cout << "Url Blocked Success: " << url << std::endl;
        }else
        {
            std::string newUrl = websiteDetector_.IsURLPhishing(url);
            if (newUrl == "Phishing")
            {
                // 向服務端請求,向客戶端發(fā)送
                if( ServerToClient(url, clientSocket) )
                {
                    std::cout << "Transmit Success!" << std::endl;
                }else
                {
                    std::cout << "Transmit Fail!" << std::endl;
                }
            }else
            {
                std::cout << "Phishing" << std::endl;
                std::string locationResponse = std::string("HTTP/1.1 302 Found") + MY_CRLF + "Location: " + newUrl + MY_CRLF + MY_CRLF;
                std::cout << locationResponse << std::endl;
                send(clientSocket, locationResponse.c_str(), locationResponse.size(), 0);
            }
            
        }

        std::cout << "----------------------" << std::endl;
        // 關閉連接
        closesocket(clientSocket);
    }

    // 提取URL
    std::string ExtractUrl(const std::string &httpRequest)
    {
        std::string url;
        // Debug
        // std::cout << "ExtractUrl(): httpRequest = " << std::endl << httpRequest << std::endl;

        // 在HTTP請求中查找"GET ",通常URL緊隨其后
        size_t getPos = httpRequest.find("GET ");
        if (getPos != std::string::npos)
        {
            // 找到"GET "后,查找下一個空格,該空格之后是URL
            size_t spacePos = httpRequest.find(' ', getPos + 4);
            if (spacePos != std::string::npos)
            {
                url = httpRequest.substr(getPos + 4, spacePos - (getPos + 4));
            }
        }
        return url;
    }
    
    void ParseUrl(const std::string &url, std::string &host, std::string &path)
    {
        // 查找 URL 中的 "http://",并獲取其后的部分
        size_t httpPos = url.find("http://");
        if (httpPos != std::string::npos)
        {
            std::string urlWithoutHttp = url.substr(httpPos + 7); // 7 是 "http://" 的長度
            // 查找 "/",分隔主機名和路徑
            size_t slashPos = urlWithoutHttp.find('/');
            if (slashPos != std::string::npos)
            {
                host = urlWithoutHttp.substr(0, slashPos);
                path = urlWithoutHttp.substr(slashPos);
            }
            else
            {
                // 如果沒有找到 "/",則整個剩余部分都是主機名
                host = urlWithoutHttp;
                path = "/";
            }
        }
        else
        {
            // 如果沒有 "http://" 前綴,則默認協(xié)議為 HTTP,整個 URL 都是主機名
            host = url;
            path = "/";
        }

        // Debug
        // std::cout << "url: " + url << std::endl;
        // std::cout << "host: " + host << std::endl;
        // std::cout << "path: " + path << std::endl;

    }
    int CreateServerSocket(const std::string &host)
    {
        // 域名解析
        addrinfo* result = NULL;
        addrinfo hints;

        ZeroMemory(&hints, sizeof(hints));
        hints.ai_family = AF_INET;  // 使用IPv4地址
        hints.ai_socktype = SOCK_STREAM;

        if (getaddrinfo(host.c_str(), "http", &hints, &result) != 0)
        {
            fprintf(stderr, "CreateServerSocket(): Failed to resolve the host: %s\n", host.c_str());
            return -1; // 返回-1表示連接失敗
        }

        // 創(chuàng)建Socket
        int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
        if (serverSocket == -1)
        {
            fprintf(stderr, "CreateServerSocket(): create socket error: %s(errno: %d)\n", strerror(errno), errno);
            freeaddrinfo(result);  // 釋放內存
            return -1; // 返回-1表示連接失敗
        }

        // 設置服務器地址信息
        struct sockaddr_in serverAddr;
        memset(&serverAddr, 0, sizeof(serverAddr));
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_port = htons(80); // 設置端口號為80,可以根據需要修改
        serverAddr.sin_addr.s_addr = ((struct sockaddr_in *)(result->ai_addr))->sin_addr.s_addr;

        // 連接到原服務器
        if (connect(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1)
        {
            fprintf(stderr, "CreateServerSocket(): connect error: %s(errno: %d)\n",strerror(errno),errno);
            closesocket(serverSocket); // 在Windows中使用closesocket關閉套接字
            freeaddrinfo(result);  // 釋放內存
            return -1; // 返回-1表示連接失敗
        }
        freeaddrinfo(result);  // 釋放內存
        return serverSocket; // 返回連接成功的套接字描述符
    }

    bool ServerToClient(const std::string &url, int clientSocket)
    {
        // 解析URL,獲取主機名和路徑
        std::string host, path;
        ParseUrl(url, host, path);

        // 創(chuàng)建Socket連接到原服務器
        int serverSocket = CreateServerSocket(host);
        if (serverSocket == -1)
        {
            return FALSE; // 處理連接失敗的情況
        }  
        // 構建HTTP請求
        std::string httpRequest = "GET " + path + " HTTP/1.1" + MY_CRLF + "Host: " + host + MY_CRLF + "Connection: close" + MY_CRLF;

        std::string date;
        bool sel;

        if (cache_.Check(url)) 
        {
            sel = false;
            date = cache_.GetDate(url);
            std::string cacheRequest = httpRequest + "If-Modified-Since: " + date + MY_CRLF + MY_CRLF;
            // 發(fā)送HTTP, 帶有If-Modified-Since 首部行
            if (send(serverSocket, cacheRequest.c_str(), cacheRequest.size(), 0) == -1)
            {
                perror("Error sending request to server");
                closesocket(serverSocket);
                return FALSE;
            }
            std::string cacheResponse;
            char cacheBuffer[HEADSIZE];
            ssize_t cacheBytesRead;
            cacheBytesRead = recv(serverSocket, cacheBuffer, HEADSIZE - 1, 0);
            std::string responseNotModified(cacheBuffer);

    
            // std::cout << "responseNotModified: " << responseNotModified << std::endl;

            if (IsResponseNotModified(responseNotModified) ) 
            {
                // std::cout << "304 Not Modified" << std::endl;
                sel = false;
            }else
            {
                cache_.ClearFileContent(url); //清空
                sel = true;
            }

        }else
        {
            sel = true;
        }
    
        if (sel == false) 
        {

            // std::cout << "cache hit!" << std::endl;
            // 接收緩存,轉發(fā)到客戶端
            char buffer[BUFSIZE];
            size_t start = 0;
            size_t bytesRead;
            while (1)
            {
                if (cache_.Get(url, buffer, start, bytesRead) == false)
                {
                    perror("Error sending response to client");
                }

                // std::cout << "bytesRead: " << bytesRead << std::endl;
                if (bytesRead == 0) break;

                if (send(clientSocket, buffer, bytesRead, 0) == -1)
                {
                    perror("Error sending response to client");
                    closesocket(serverSocket);
                    return FALSE;
                }
            }
           
        }else
        {
            httpRequest += MY_CRLF;
            // 發(fā)送HTTP請求到原服務器
            if (send(serverSocket, httpRequest.c_str(), httpRequest.size(), 0) == -1)
            {
                perror("Error sending request to server");
                closesocket(serverSocket);
                return FALSE;
            }

            // 接收原服務器的HTTP響應
            char buffer[BUFSIZE];
            size_t start = 0;
            ssize_t bytesRead;
            while ((bytesRead = recv(serverSocket, buffer, BUFSIZE - 1, 0)) > 0)
            {
                buffer[bytesRead] = '\0';
                // 發(fā)送接收到的數據到客戶端
                if (send(clientSocket, buffer, bytesRead, 0) == -1)
                {
                    perror("Error sending response to client");
                    closesocket(serverSocket);
                    return FALSE;
                }
                if(cache_.Put(url, buffer, bytesRead, start) == false)
                {
                    std::cerr << "Cache put error" << std::endl;
                }
            }
            cache_.PutDate(url);
            if (! cache_.Check(url))
            {
                cache_.ClearFileContent(url);
            }
        }
        // 關閉原服務器連接
        closesocket(serverSocket);
        return TRUE;
    }
    bool IsResponseNotModified(const std::string& response) {
       // 查找第一個空格,定位到狀態(tài)碼的開始
        size_t spacePos = response.find(' ');
        if (spacePos != std::string::npos) {
            // 提取狀態(tài)碼部分
            std::string statusCode = response.substr(spacePos + 1, 3);
            // 檢查狀態(tài)碼是否為 "304"
            return (statusCode == "304"); // HTTP/1.1 304 Not Modified
        }
        return false; // 未找到狀態(tài)碼
    }
};



bool InitWinsock()
{
    // 加載套接字庫(必須)
    WORD wVersionRequested;
    WSADATA wsaData;
    // 套接字加載時錯誤提示
    int err;
    // 版本 2.2
    wVersionRequested = MAKEWORD(2, 2);
    // 加載 dll 文件 Scoket 庫
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        // 找不到 winsock.dll
        printf("加載 winsock 失敗,錯誤代碼為: %d\n", WSAGetLastError());
        return FALSE;
    }
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("不能找到正確的 winsock 版本\n");
        return FALSE;
    }

    return TRUE;
}

int main()
{
    if (!InitWinsock())
    {
        WSACleanup();
        return -1; // 初始化失敗,退出程序
    }
    int port = 666; // 設置端口
    HttpProxyServer proxyServer(port);
    proxyServer.Start();
    WSACleanup(); // 在程序結束時清理Winsock庫
    return 0;
}

總結

以上是生活随笔為你收集整理的HTTP 代理服务器的设计与实现(C++)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产裸体视频bbbbb | 国产一区二区三区视频在线 | 国产剧情在线一区 | 成人av在线一区二区 | 中文字幕在线观看第三页 | 天天插天天狠 | 超碰精品在线观看 | 中文字幕视频播放 | 在线精品视频在线观看高清 | 不卡的av电影 | 免费观看全黄做爰大片国产 | 天天色.com | 国产高清免费观看 | av在线影视 | 成人h在线观看 | 九九久久免费 | 中文字幕乱在线伦视频中文字幕乱码在线 | 九九视频网| 久久精品电影院 | 亚洲乱码在线观看 | 欧美久久久一区二区三区 | a在线免费观看视频 | 日韩在线精品视频 | 精品一二三区视频 | 国产精品久久久久久麻豆一区 | 久久一视频 | 国产黄色精品在线观看 | 91视频免费播放 | 日韩成人黄色 | 久久精品国产一区二区三 | 免费观看mv大片高清 | 97国产精品亚洲精品 | 国产97在线看 | 久久久久免费电影 | 国产免费av一区二区三区 | 日本一区二区三区视频在线播放 | 精品国产免费一区二区三区五区 | 香蕉久草 | 久久久久久久综合色一本 | 久久久久久久久久久久久久免费看 | 色视频在线免费观看 | 欧美激情精品久久久久 | 日韩欧美国产激情在线播放 | 岛国av在线不卡 | 亚洲欧美在线观看视频 | 最新色视频 | 久草视频在线看 | 精品uu | 精品在线视频一区二区三区 | 国产成人三级在线播放 | 久久久久久久看片 | 韩国三级一区 | 精品人妖videos欧美人妖 | 黄色av免费电影 | 久久精品站 | 日本三级不卡视频 | 美州a亚洲一视本频v色道 | 久久99亚洲精品 | 国产成人精品综合久久久久99 | 国产 日韩 在线 亚洲 字幕 中文 | 91av在线播放视频 | 四虎国产免费 | 三级黄色在线 | 国产手机在线精品 | 欧美日韩国产免费视频 | 天天爽天天做 | 久艹视频在线观看 | 奇米影视在线99精品 | www.狠狠插.com | 国内精品久久久久久久影视麻豆 | 国产一区二区电影在线观看 | 麻豆国产精品va在线观看不卡 | 国产又粗又猛又爽又黄的视频先 | 久久精品资源 | 日韩精品一区二区三区视频播放 | 91黄色影视 | bbb搡bbb爽爽爽| 亚洲综合在线视频 | 天天操·夜夜操 | 久久免费精品一区二区三区 | 91免费国产在线观看 | 国内偷拍精品视频 | 激情av网 | 欧美aaa级片 | www.91av在线 | 国产精品99爱 | 九色精品免费永久在线 | 亚洲天堂自拍视频 | 国产免费一区二区三区最新6 | 日日干天夜夜 | 福利视频第一页 | 91尤物国产尤物福利在线播放 | 依人成人综合网 | 五月天久久狠狠 | 国产精品va在线播放 | 99久久夜色精品国产亚洲 | 久久精品专区 | 五月婷婷深开心 | 亚洲一一在线 | 国产 欧美 在线 | 亚洲免费国产 | 精品久久一区二区 | 欧美黑吊大战白妞欧美 | 人人干狠狠干 | 久久久在线观看 | 午夜精品三区 | 色橹橹欧美在线观看视频高清 | 精品 一区 在线 | 国产欧美综合视频 | 国产涩涩在线观看 | 免费精品久久久 | 丁香狠狠 | 伊人久操 | 蜜臀av性久久久久蜜臀av | 日韩精品视频一二三 | 亚洲精品美女久久久久网站 | 中文字幕 成人 | 成人av播放 | 国产精品久久99综合免费观看尤物 | 久久成人麻豆午夜电影 | 国产美女精品视频免费观看 | av在观看 | 亚州免费视频 | 国产精选视频 | 成人午夜av电影 | 91传媒视频在线观看 | 中文字幕在线观看第二页 | 国产欧美在线一区 | 91最新在线观看 | 亚洲男男gⅴgay双龙 | 精品国自产在线观看 | 国产成人精品综合久久久 | 国产极品尤物在线 | www.色com| 综合天堂av久久久久久久 | 成人久久久电影 | 精油按摩av | 亚洲国产高清视频 | 一区二三国产 | 在线免费观看成人 | 中文字幕精品一区二区三区电影 | 激情欧美丁香 | 色综合天天在线 | 美女在线观看网站 | 欧美国产日韩一区 | 五月天.com | 久久视频在线观看免费 | 久久精品网站免费观看 | 免费网址在线播放 | 久久精品久久综合 | 综合色婷婷 | 天天曰天天射 | 午夜精品久久久久久 | 国产精品剧情 | 国产又粗又猛又黄视频 | 69视频在线播放 | 免费视频久久久久久久 | 久久三级视频 | 亚洲婷婷网| 五月婷婷综 | 狠狠干.com | 精品国产一区二区三区久久 | 亚洲成人精品在线 | 91亚洲精品久久久蜜桃 | 欧美日韩在线视频免费 | 精品uu| 日本电影久久 | 欧美日韩视频免费 | 视频一区在线播放 | 美女视频一区 | 久久综合久色欧美综合狠狠 | 插综合网 | 在线a视频 | 黄色网在线播放 | 久久97久久97精品免视看 | 99麻豆视频| 黄色app网站在线观看 | 激情综合色播五月 | 色窝资源| 午夜精品久久久久久久99水蜜桃 | 国产日韩欧美精品在线观看 | 在线亚洲播放 | 69亚洲视频 | 一级黄毛片 | 97在线免费视频观看 | 免费看色网站 | 久久精品波多野结衣 | 免费观看午夜视频 | 国产一区福利 | 91视频在线观看免费 | 欧美性精品 | 国产在线观看91 | 毛片网站免费在线观看 | 久久久久在线观看 | 97在线视频免费播放 | www.久久免费 | 最近中文字幕大全 | 日韩精品黄| 丁香六月网| 999久久久久久久久 69av视频在线观看 | 国产色a在线观看 | 欧美日韩一区二区在线观看 | 久久国产网站 | 欧美精品资源 | 国产精品成人久久久久 | 一级片视频在线 | 久久久久99精品国产片 | 日本久久精 | 一区二区三区在线免费观看 | 欧美一级片 | 日韩精品视频第一页 | 国产精品美女免费 | 日批视频在线播放 | 久久免费看av | 人人干狠狠干 | 91漂亮少妇露脸在线播放 | 91热视频 | 免费看久久久 | 色香蕉网 | 国产在线观看污片 | 97精品在线观看 | 开心色婷婷| 91成人久久| 九色视频自拍 | 激情电影在线观看 | 亚洲一区日韩在线 | 亚洲激情五月 | 在线观看免费视频你懂的 | 97视频免费播放 | 伊人狠狠色丁香婷婷综合 | 亚洲人成在线观看 | 久久免费精品国产 | 午夜a区 | 久久精品一二三 | 国产精品123 | 五月综合久久 | 国产精品久久99综合免费观看尤物 | 中文字幕在线观看不卡 | 亚洲美女在线国产 | 日日日操操| 国产成人一区二区三区影院在线 | 九九精品久久 | 免费观看视频的网站 | 日韩中文字幕在线看 | 青草视频免费观看 | 久久久国产一区二区三区四区小说 | 操操色| 日韩二区在线 | av一级黄| 中文字幕在线日亚洲9 | 免费久久99精品国产婷婷六月 | 日韩精品视频久久 | 最近更新好看的中文字幕 | 国产精品欧美一区二区三区不卡 | 在线看成人av | 欧美激情综合色综合啪啪五月 | 久久久久久久久久久电影 | 狠狠狠狠狠操 | 黄色午夜网站 | 久久久国产精品麻豆 | 六月久久婷婷 | 少妇av片 | 高清在线观看av | 在线播放视频一区 | 国产成人精品一区在线 | 玖玖精品视频 | 国产精品福利在线观看 | 成人四虎 | 亚洲天堂免费视频 | 韩国三级一区 | 色丁香综合 | 狠狠色婷婷丁香六月 | 国产精品成久久久久 | 日韩免费一区二区三区 | 97电影在线看视频 | 99精品视频在线观看视频 | 人人澡人 | 五月婷婷丁香在线观看 | 色综合天天色综合 | 欧美精品在线观看免费 | 国产一区二区三区高清播放 | 五月天视频网站 | 中文字幕色站 | 日韩免费高清在线观看 | 999久久久免费视频 午夜国产在线观看 | 97在线观看免费高清完整版在线观看 | 亚洲欧美日本国产 | a视频免费 | 99久久精品网 | 婷婷丁香在线观看 | 麻豆传媒视频在线免费观看 | 成全在线视频免费观看 | 热久久免费视频精品 | 欧美黑人性爽 | 国产精品国产自产拍高清av | 亚洲免费视频观看 | 在线播放精品一区二区三区 | 夜夜躁日日躁狠狠久久88av | 中文字幕在线观看免费高清完整版 | 久久久香蕉视频 | 玖玖玖在线| 天天操综合| 人人添人人澡 | 日韩精品久久久久久久电影99爱 | 亚洲婷婷综合色高清在线 | 亚洲成aⅴ人在线观看 | 久久久久久久免费 | 亚洲男模gay裸体gay | 日韩成人免费电影 | 日日躁夜夜躁aaaaxxxx | 四虎影视8848dvd| 天天插天天爽 | 亚洲精品ww | 制服丝袜天堂 | 国产精品6999成人免费视频 | 韩国一区二区三区视频 | 成年人在线看片 | 天天插天天狠 | 蜜臀av免费一区二区三区 | 久久精品一区二区三 | 久久高清毛片 | 超碰97公开| 国产色网站 | 久久国产高清 | 狂野欧美激情性xxxx欧美 | 亚洲成人国产精品 | 国产一区二区高清视频 | 日日精品 | 99r精品视频在线观看 | 婷婷综合久久 | 国产午夜精品一区二区三区四区 | 五月婷婷激情 | 西西www444 | 九九视频在线 | 狠狠的操你| 国产精品99爱 | 在线观看香蕉视频 | 国产三级视频在线 | 亚洲精品美女免费 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 中文字幕久久网 | 激情欧美一区二区三区免费看 | 成人动态视频 | 国产精选在线观看 | 久久久久久美女 | 成人动态视频 | 国产91免费在线 | 精品国产乱码久久久久久天美 | 亚洲免费永久精品国产 | 久久精品国产亚洲精品2020 | 久久一区二区三区日韩 | 一区二区三区四区五区在线视频 | 在线看的av网站 | 久草a视频 | 午夜性色 | 色视频 在线 | 在线黄色观看 | 免费日韩av片| 中文字幕在线久一本久 | 成人久久亚洲 | 成人黄色免费观看 | 国产精品久久久久久久久久久久久 | 天天干天天拍天天操天天拍 | 一区二区精品在线 | 成人精品视频 | 久草爱| 成人影片在线播放 | 日韩欧美一二三 | 婷婷黄色片 | 玖玖爱国产在线 | 精品成人a区在线观看 | 国产录像在线观看 | 片网址| 91精品国自产在线观看 | 久久夜色电影 | 国产成人一级 | 中文字幕成人在线观看 | 日韩免费av片 | 中文字幕第一页av | 亚洲第一av在线 | 超碰在线观看97 | 久久成人人人人精品欧 | 国产免码va在线观看免费 | 亚洲一一在线 | 国产蜜臀av | 999电影免费在线观看 | 欧美午夜寂寞影院 | 国产高清视频免费 | av在线之家电影网站 | 亚洲欧美日韩一级 | 日韩一区二区三区免费视频 | 一区二区三区四区精品 | 成人精品影视 | 欧美性大战久久久久 | 欧美在线视频不卡 | av福利在线免费观看 | 亚洲精品乱码白浆高清久久久久久 | 美女免费网视频 | 欧美成人亚洲 | 亚洲在线视频免费观看 | 久久综合给合久久狠狠色 | 激情视频在线高清看 | 欧美巨乳波霸 | 91九色蝌蚪视频网站 | 夜夜夜草| 久久精品一二三区白丝高潮 | 国产亚洲va综合人人澡精品 | 一区二区三区四区五区在线 | 麻花豆传媒一二三产区 | 97精品超碰一区二区三区 | 免费aa大片| 日韩二三区 | 国产一级免费观看 | 色综合久久88色综合天天6 | 日韩一区二区三免费高清在线观看 | 在线视频观看成人 | 超碰公开97 | 成人精品亚洲 | 亚洲综合日韩在线 | 97精品国自产拍在线观看 | 午夜精品剧场 | 午夜精品久久久久久久99水蜜桃 | 国产午夜精品久久久久久久久久 | 国内精品视频免费 | 免费黄色av电影 | 久久国产精品99国产 | 成人手机在线视频 | 综合成人在线 | 国内精品久久久久国产 | 国产精品毛片久久久久久久久久99999999 | 国产剧情一区二区 | 天天操操操操操 | a v在线观看 | 成人a级黄色片 | 久久在草| 欧美激情va永久在线播放 | 国产成人亚洲在线观看 | 亚洲丁香久久久 | 国产福利专区 | 天天干天天拍天天操天天拍 | 精品字幕 | 午夜黄色大片 | 久久国产精品一二三区 | 黄在线免费看 | 天天操天天射天天操 | 亚洲 欧美 精品 | 日批视频 | 日韩欧美精品在线观看视频 | 在线视频福利 | 国产精品美女久久久久aⅴ 干干夜夜 | 成人小视频在线观看免费 | 国产成人三级一区二区在线观看一 | 在线看污网站 | 嫩嫩影院理论片 | 色综合天天综合在线视频 | 久久国产一二区 | 精品中文字幕在线 | 中文字幕亚洲综合久久五月天色无吗'' | 91精品久久久久久久久久入口 | 久久伦理电影网 | 国产精品毛片一区 | 久草在线视频首页 | 精品国产精品久久 | 久久尤物电影视频在线观看 | 中文字幕 国产专区 | 成人免费视频播放 | 日本在线观看一区二区三区 | 午夜影院一级片 | 亚洲成人中文在线 | 深夜国产福利 | 午夜精品久久久久久久99热影院 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 免费看黄色小说的网站 | 精品嫩模福利一区二区蜜臀 | 人人看人人 | 日韩av成人在线观看 | 国产91精品看黄网站在线观看动漫 | 综合国产在线观看 | 久色小说 | 中文字幕在线看片 | av电影中文 | 国产精品一区二区美女视频免费看 | 日韩乱色精品一区二区 | 欧美日本啪啪无遮挡网站 | 黄色片毛片 | 国产91免费观看 | 麻豆久久久久久久 | 在线观看爱爱视频 | 激情视频久久 | 怡红院av久久久久久久 | 国产系列 在线观看 | 国产精品一区二区在线观看 | 国产精品无av码在线观看 | 成人av亚洲 | 中文字幕在线久一本久 | 日韩在线播放欧美字幕 | 免费福利小视频 | 免费三级影片 | 国产亚洲精品久久久久久移动网络 | 精品久久网 | 99久久精品免费看国产免费软件 | 国内外成人在线 | 波多野结衣电影一区二区三区 | 成人免费 在线播放 | 精品久久久免费视频 | www.99av| 久久久国产视频 | 久草免费福利在线观看 | 亚洲精品动漫成人3d无尽在线 | 人人爽人人爽 | 色综合久久中文字幕综合网 | 成人资源在线播放 | 99精品在线免费观看 | 69av免费视频 | 日韩免费b| 国产精品成人自拍 | 久久免费国产 | 久久国产三级 | 婷婷在线观看视频 | 亚洲综合在线五月天 | 国内外激情视频 | 国产精品99久久免费黑人 | 午夜电影 电影 | 在线观看韩国av | 在线中文日韩 | 久草手机视频 | 亚洲免费在线播放视频 | 免费观看成人av | 国产在线观看免费 | 久久久久免费电影 | 精品亚洲午夜久久久久91 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产91在线免费视频 | 香蕉精品在线观看 | 波多野结衣视频一区二区三区 | 久久精品女人毛片国产 | 韩国精品福利一区二区三区 | 亚洲 欧美 综合 在线 精品 | 在线观看国产高清视频 | 久久久久成人精品亚洲国产 | 国产一区二区午夜 | 亚洲天天摸日日摸天天欢 | 亚洲精品免费在线播放 | 国产成人在线播放 | www国产精品com | 国产香蕉97碰碰碰视频在线观看 | 天天干,狠狠干 | 国模一区二区三区四区 | 日本69hd| 四虎影视欧美 | 日韩精品资源 | 欧美大片在线观看一区 | 久久精久久精 | 日韩动态视频 | 精品亚洲午夜久久久久91 | 色综合久久五月天 | 国产99久久久精品 | 免费av小说 | 日本aa在线 | 亚洲 综合 激情 | 狠狠狠操 | 久久字幕精品一区 | 五月天天av | 91污污 | 黄色成人小视频 | 免费在线观看亚洲视频 | 99热免费在线 | 91久久奴性调教 | 99久久精品国产免费看不卡 | 国产成人精品午夜在线播放 | www.黄色在线| 天天摸夜夜操 | 国产在线a视频 | 国产精品国产三级国产aⅴ入口 | 色婷婷激情电影 | 欧美日韩一区二区视频在线观看 | 在线观看av的网站 | 国产一二区精品 | 最近中文字幕高清字幕在线视频 | 在线中文字母电影观看 | 69视频国产 | 国产一级做a爱片久久毛片a | 最新超碰在线 | 欧美一级片在线 | 成人欧美一区二区三区黑人麻豆 | 国产精品视频地址 | 99久久精品一区二区成人 | 亚洲天堂激情 | 精品亚洲视频在线 | 亚洲天堂网在线播放 | 99色免费 | 亚洲黄网站 | 高清久久久久久 | 免费中午字幕无吗 | 美女一区网站 | 日韩国产精品一区 | 亚洲精品美女免费 | 日韩毛片在线一区二区毛片 | 丁香影院在线 | 青草草在线 | 精品中文字幕视频 | 日韩在线高清 | 国产无套精品久久久久久 | 国产精品一码二码三码在线 | 免费特级黄毛片 | 中文字幕精 | 福利av在线| 91精品国自产在线 | 欧美热久久 | 亚洲乱码久久 | 成人毛片久久 | 亚洲国产中文在线 | 天天爱天天操天天干 | 在线免费黄色av | 男女啪啪免费网站 | 国产高清成人 | 最新国产中文字幕 | 黄色免费网战 | 久久99国产精品二区护士 | 久久久久久久久福利 | 成年人在线免费看片 | 国产麻豆果冻传媒在线观看 | 成人h电影在线观看 | 天天操夜夜操天天射 | 欧美日韩高清一区二区三区 | 久久人人精品 | 成人久久18免费网站图片 | 99在线热播 | 亚洲一区网站 | 亚洲欧美在线视频免费 | 91日韩在线 | 亚洲男男gaygayxxxgv | 久久久久在线视频 | 欧美激情第一区 | 久久精品中文字幕少妇 | 国产成人av电影在线观看 | 日韩一区二区三区免费电影 | 人人爽人人爽人人片av | 成人av高清在线 | 中文字幕精品一区 | 久久刺激视频 | 国产专区在线 | 最近的中文字幕大全免费版 | 国产精品日韩久久久久 | 91中文字幕网 | 久草在线91 | 在线观看视频三级 | 国产欧美最新羞羞视频在线观看 | 视频一区亚洲 | 天天五月天色 | 欧美日韩视频网站 | 美女网站黄在线观看 | 免费一级片观看 | www.69xx | 国产精品久久久久久久久久 | 欧美日韩精品二区第二页 | 精品久久久久久综合 | 久久九九久久 | 天天色综合1 | 成人午夜电影在线播放 | 亚洲一区在线看 | 丁香激情五月婷婷 | 国产高清无av久久 | 91在线小视频 | 色操插 | 国产真实在线 | 久久手机精品视频 | 在线观看电影av | 99精品免费在线观看 | 国产99久久久国产精品免费看 | 日韩亚洲在线观看 | 日韩欧美高清视频在线观看 | 99欧美视频 | 日日成人网| 综合色婷婷 | 亚洲午夜电影网 | 超碰夜夜| 久久人人添人人爽添人人88v | 国产免费观看久久 | 69久久久久久久 | 久草精品视频在线观看 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 久热超碰 | 免费情趣视频 | 在线黄av | 日韩免费看片 | 人人爽人人舔 | 亚洲人人网| 免费观看成人av | 日日夜夜天天人人 | 久久99国产综合精品免费 | 99久久精品免费看国产免费软件 | 国产成人一区三区 | 视频国产 | 99色在线播放 | 亚洲伦理一区 | 9999亚洲| 国产成人在线免费观看 | 日韩a在线播放 | 天天干天天干天天干天天干天天干天天干 | 日韩爱爱网站 | 国内视频一区二区 | 日本一区二区不卡高清 | 黄色影院在线免费观看 | 天天爱天天草 | 日韩精品免费在线视频 | 日本精品久久久久中文字幕 | 99爱爱| 我要看黄色一级片 | 亚洲综合色丁香婷婷六月图片 | 免费看的黄色小视频 | 国产精品每日更新 | 日韩免费播放 | av一级片在线观看 | av大全在线观看 | 曰韩在线| 91九色视频 | a视频在线观看免费 | 亚洲日韩欧美视频 | a久久免费视频 | 久免费| 天天天天射 | 日本h视频在线观看 | 在线观看视频97 | 狠狠久久综合 | 黄色的片子 | 亚洲视频久久久久 | 日本精品在线看 | 午夜.dj高清免费观看视频 | 九色精品在线 | 国产69精品久久app免费版 | 日本最大色倩网站www | 伊人狠狠操 | 久久久麻豆精品一区二区 | 午夜精品一区二区三区可下载 | 久久免费在线 | 亚洲精品在线一区二区三区 | 人人爽网站| 国产三级午夜理伦三级 | 久久999精品 | .国产精品成人自产拍在线观看6 | 色在线免费| 在线观看中文字幕2021 | 日本公妇色中文字幕 | 国产精品久久久免费看 | 永久免费毛片在线观看 | 亚洲一级黄色av | 夜夜夜| 在线观看免费av网 | 成人永久免费 | 欧美色噜噜 | 最近中文字幕第一页 | 99免在线观看免费视频高清 | 午夜视频久久久 | 欧美日韩精品免费观看视频 | 国产精品热视频 | 国产精品免费一区二区三区在线观看 | 日本性高潮视频 | 免费日韩一区二区三区 | 国产高清绿奴videos | 久久精品www人人爽人人 | 91欧美精品 | 91av影视 | 国产视频一二三 | 国产手机视频 | 天天做天天爱天天综合网 | 韩国在线一区二区 | 色播六月天 | 日本资源中文字幕在线 | 久久电影国产免费久久电影 | 亚洲日本欧美在线 | 中文字幕在线色 | 99久久精品国产系列 | 国产在线一区二区 | 美女免费视频黄 | 久久99国产精品自在自在app | 成人黄色在线电影 | 免费色网| 操天天操| 一区二区三区日韩精品 | 日韩精品免费在线视频 | 精品在线亚洲视频 | 色av男人的天堂免费在线 | 国产精品原创av片国产免费 | 久久久久久久久久久福利 | 国产一区二三区好的 | 精品亚洲成人 | 天天做天天干 | 国产精品福利一区 | jizz999| 精品欧美日韩 | 日韩乱色精品一区二区 | 婷婷去俺也去六月色 | 又湿又紧又大又爽a视频国产 | 一区二区三区影院 | 国产日产在线观看 | 日韩专区 在线 | 91福利社区在线观看 | 日韩高清观看 | 日本一区二区高清不卡 | 欧美与欧洲交xxxx免费观看 | 欧美精品一区二区在线观看 | www.狠狠插.com| 成人在线超碰 | 99精品久久精品一区二区 | 91经典在线| 成人av资源网 | 91丨九色丨国产丨porny精品 | 97视频在线播放 | 99精品国产99久久久久久97 | 91手机视频在线 | 国产美女免费视频 | 国产婷婷久久 | 91在线日韩 | 91精品影视 | 日韩日韩日韩日韩 | 久久精品中文 | www.久热 | 中文网丁香综合网 | 国产精品欧美一区二区三区不卡 | 国产精品原创在线 | 亚洲免费在线视频 | 少妇bbbb揉bbbb日本 | 丁香花在线视频观看免费 | 国产精品久久久免费 | 国产高清av在线播放 | 中文字幕高清免费日韩视频在线 | 麻豆视频观看 | 久久综合九色 | 最近中文字幕高清字幕在线视频 | 日韩一区二区三区观看 | 狠狠色香婷婷久久亚洲精品 | 成片免费观看视频 | 中文字幕一区在线观看视频 | 丝袜美女在线 | 成片人卡1卡2卡3手机免费看 | 欧美高清成人 | 偷拍精偷拍精品欧洲亚洲网站 | 久久夜夜夜 | 在线视频18在线视频4k | 黄色福利网站 | 国产精品久久麻豆 | 色丁香色婷婷 | 黄色成人av | 国产精品美女视频网站 | 国产精品99久久久久久人免费 | 丁香综合av| 国产精品入口66mio女同 | 久久亚洲影院 | 国产精品系列在线播放 | 99高清视频有精品视频 | 992tv人人网tv亚洲精品 | 免费在线一区二区 | 九九在线国产视频 | 免费成人黄色片 | 500部大龄熟乱视频使用方法 | 国产123av| 在线免费观看国产黄色 | 中文字幕欧美激情 | 天天操天天射天天操 | 视频一区视频二区在线观看 | 99av国产精品欲麻豆 | 久久夜夜夜 | 成人欧美日韩国产 | 在线国产片 | 在线免费色 | av在线h| 超碰在线日韩 | www.日韩免费 | 伊人官网| 99国产精品视频免费观看一公开 | 国产精品自产拍在线观看 | 欧美地下肉体性派对 | 九九在线高清精品视频 | 久久中文字幕在线视频 | 91黄视频在线 | 国产麻豆电影 | 丁香激情综合 | 亚洲va欧洲va国产va不卡 | 国产伦精品一区二区三区免费 | 日本深夜福利视频 | 伊人中文在线 | 国产午夜精品一区二区三区嫩草 | 国产精品永久久久久久久www | 日韩成人黄色av | 91高清视频在线 | 久久中国精品 | 国产高清网站 | 国产成人一区二区三区 | 国产r级在线观看 | 亚洲国产999| 久久99热久久99精品 | 91丨九色丨国产在线观看 | 国产小视频免费在线观看 | 一区二区激情 | 久久视频6 | 国产成人亚洲在线观看 | 在线三级播放 | 亚洲免费精品一区二区 | 免费在线观看一区二区三区 | 99国产在线视频 | 精品久久久久久亚洲综合网 | 日韩视频免费观看高清完整版在线 | 国产中文字幕一区二区三区 | 91精品国产99久久久久久久 | 最新av电影网址 | 中日韩三级视频 | 美女网站色在线观看 | 久久看片 | 五月天天在线 | 国产在线观看免费av | 在线一区av | 欧美一区二区在线免费观看 | 成人av久久 | 九九免费精品视频 | 国产精品原创视频 | 黄色的网站在线 | 国产精品一区二区三区久久 | 国产亚洲精品久久久久秋 | 午夜国产福利视频 | 国产精品毛片久久蜜 | 婷婷久月 | av在线永久免费观看 | 69av在线视频| 亚洲激情精品 | 国产成人一区二区三区在线观看 | 国内外成人免费在线视频 | 尤物九九久久国产精品的分类 | 福利久久| 国产资源在线视频 | 日本一区二区三区免费看 | 日韩一区二区三区在线看 | 在线一二三四区 | 在线观看久久久久久 | 福利视频导航网址 | 欧美精品在线观看 | 久久爱992xxoo | 久久伊人综合 | 成人在线视频观看 | 国产黄免费在线观看 | 色偷偷888欧美精品久久久 | 93久久精品日日躁夜夜躁欧美 | 黄色午夜| 波多野结衣视频一区 | 精品国产一区二区久久 | 最近能播放的中文字幕 | 久久黄色影视 | 久久久国产99久久国产一 | 最新超碰在线 | 色香蕉视频 | 99久久99久久综合 | 免费成人av网站 | 亚洲激情在线 | 中文字幕精品一区二区精品 | 伊在线视频 | 国产区免费 | 婷婷精品在线视频 | 日韩中文免费视频 | 中文字幕网址 | 国产一区私人高清影院 | 国产一级黄色电影 | 久久精品国产一区 | 国产黄大片在线观看 | 91亚洲永久精品 | 亚洲欧洲国产视频 | 免费黄色特级片 | 日韩欧美专区 | 91成人久久 | 亚洲 欧美 综合 在线 精品 | 精品a视频| 欧美精品久 | 国产一区久久久 | 久久久久久网址 | 国产精品久久久久久av | 贫乳av女优大全 | 国产亚洲一区二区在线观看 | 91大神在线看| 激情五月婷婷综合 | 在线免费高清视频 | 久久综合婷婷 | 国产精品乱码久久久久久1区2区 | 青青色影院 | 精品人人人人 | 91精品推荐 | 麻豆激情电影 | 免费观看完整版无人区 | 国产一区欧美日韩 | 99久久久国产精品美女 | 国产成人一级 | 91成人在线视频 | 香蕉精品在线观看 | 东方av免费在线观看 | 麻豆视频在线观看 | 午夜婷婷在线播放 | 免费a视频在线 | 亚洲午夜精品一区 | 久久综合久久综合这里只有精品 | 中文字幕亚洲综合久久五月天色无吗'' |