国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

Linux其他備選高級IO模型用法詳解

 更新時間:2025年09月23日 16:26:59   作者:Truelon  
文章介紹了Linux系統(tǒng)中同步與異步I/O模型,包括阻塞I/O、非阻塞I/O、IO多路復(fù)用(select/poll/epoll)、信號驅(qū)動I/O和異步I/O,重點解析了各模型工作原理、優(yōu)缺點及適用場景,強調(diào)通過非阻塞、多路復(fù)用和事件驅(qū)動機制提升I/O效率,減少資源消耗,適用于高并發(fā)網(wǎng)絡(luò)服務(wù)等場景

其他高級 I/O 模型

以上基本介紹的都是同步IO相關(guān)知識點,即在同步I/O模型中,程序發(fā)起I/O操作后會等待I/O操作完成,即程序會被阻塞,直到I/O完成。

整個I/O過程在同一個線程中進行,程序在等待期間不能執(zhí)行其他任務(wù)。下面將會介紹除同步IO之外的其他常見IO模型。

什么是IO?什么是高效的IO?

**I/O(輸入/輸出)**是計算機與外部世界進行數(shù)據(jù)交換的過程。在Linux系統(tǒng)中,I/O操作通常指的是程序與硬盤、網(wǎng)絡(luò)設(shè)備、終端等進行數(shù)據(jù)交換的操作。I/O性能直接影響到系統(tǒng)的響應(yīng)速度和吞吐量,是很多應(yīng)用系統(tǒng)優(yōu)化的關(guān)鍵目標。

高效的IO 涉及優(yōu)化I/O操作的延遲、吞吐量和資源消耗。在一個復(fù)雜的系統(tǒng)中,I/O效率通常通過以下方式得到提升:

  • 減少I/O等待時間(例如,通過非阻塞I/O或異步I/O)
  • 最大化吞吐量(例如,通過數(shù)據(jù)預(yù)讀或緩存機制)
  • 優(yōu)化系統(tǒng)資源的利用(例如,通過多路復(fù)用和線程池等技術(shù))

高效的IO不僅可以提升程序的響應(yīng)速度,還能減少系統(tǒng)的負載,提高并發(fā)處理能力。

IO模型分析方法

出處:Linux五種IO模型

分析IO模型需要了解2個問題:

問題1:發(fā)送IO請求,IO請求可以理解為用戶空間和內(nèi)核空間數(shù)據(jù)同步,根據(jù)發(fā)起者不同分為以下兩種情況:

  • 由用戶程序發(fā)起(同步IO)。
  • 由內(nèi)核發(fā)起(異步IO)。

問題2:等待數(shù)據(jù)到來,等待數(shù)據(jù)到來的方式有以下幾種:

  • 阻塞(阻塞IO)。
  • 輪詢(非阻塞IO)。
  • 信號通知(信號驅(qū)動IO)。

內(nèi)核空間和用戶空間數(shù)據(jù)同步由誰發(fā)起是分析Linux IO模型最核心的問題

1.阻塞式I/O(Blocking I/O)

  • 阻塞式I/O是最常見的I/O模型,在這種模型下,當程序請求I/O操作時,會阻塞當前線程直到I/O操作完成(如讀/寫數(shù)據(jù))。在等待期間,線程無法進行其他操作。
  • 優(yōu)點:簡單,易于理解和實現(xiàn)。
  • 缺點:性能瓶頸,當進行大量I/O操作時,阻塞會導致線程無法有效利用,浪費CPU資源。

代碼示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int sockfd;
    struct sockaddr_in server_addr;
    char buffer[BUFFER_SIZE];

    // 創(chuàng)建一個TCP套接字
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("套接字創(chuàng)建失敗");
        return -1;
    }

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;

    // 綁定套接字
    if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("綁定失敗");
        close(sockfd);
        return -1;
    }

    // 監(jiān)聽端口
    if (listen(sockfd, 3) < 0) {
        perror("監(jiān)聽失敗");
        close(sockfd);
        return -1;
    }

    printf("等待客戶端連接...\n");

    int new_sock;
    struct sockaddr_in client_addr;
    socklen_t client_len = sizeof(client_addr);

    // 接受客戶端連接
    if ((new_sock = accept(sockfd, (struct sockaddr*)&client_addr, &client_len)) < 0) {
        perror("接受連接失敗");
        close(sockfd);
        return -1;
    }

    printf("客戶端已連接。等待數(shù)據(jù)...\n");

    // 阻塞式recv:等待客戶端發(fā)送數(shù)據(jù)
    while (1) {
        printf("發(fā)起 I/O 請求:調(diào)用 recv() 等待數(shù)據(jù)...\n");
        ssize_t bytes_received = recv(new_sock, buffer, BUFFER_SIZE - 1, 0); // BUFFER_SIZE -1 保證留出 '\0'

        if (bytes_received < 0) {
            perror("recv 失敗");
            break;
        }

        if (bytes_received == 0) {
            printf("客戶端已斷開連接。\n");
            break;
        }

        buffer[bytes_received] = '\0';  // 確保字符串結(jié)束
        printf("收到數(shù)據(jù):%s\n", buffer); // 數(shù)據(jù)到達并喚醒進程
    }

    close(new_sock);
    close(sockfd);
    return 0;
}

原理分析:

階段 1: 用戶程序調(diào)用 recv 發(fā)起 I/O 請求(同步 I/O)

背景: 在阻塞 I/O 模式下,用戶程序發(fā)起 I/O 操作時(比如通過 recv 函數(shù)從套接字讀取數(shù)據(jù)),如果內(nèi)核空間的套接字緩沖區(qū)沒有數(shù)據(jù)準備好,用戶進程會被阻塞,直到數(shù)據(jù)可用。

步驟 1: 發(fā)起 I/O 請求

ssize_t bytes_received = recv(sockfd, buffer, BUFFER_SIZE, 0);
  • 當用戶程序調(diào)用 recv 函數(shù)時,內(nèi)核會檢查指定的套接字是否有足夠的數(shù)據(jù)可以讀取。如果套接字的緩沖區(qū)為空,內(nèi)核會將調(diào)用進程從 TASK_RUNNING 狀態(tài)切換到 TASK_INTERRUPTIBLE 狀態(tài)。

步驟 2: 進程切換狀態(tài)并阻塞

  • 進程狀態(tài)的切換意味著 CPU 將會把當前進程放入 進程等待隊列,并且該進程不再占用 CPU 資源。系統(tǒng)調(diào)度程序會選擇其他可以運行的進程來執(zhí)行,這就是“進程阻塞”的表現(xiàn)。
  • 被阻塞的進程會被加入到該套接字的等待隊列中,等待數(shù)據(jù)的到來。一旦數(shù)據(jù)可用,進程就會被喚醒并繼續(xù)執(zhí)行。

重要的概念:

  • 阻塞 I/O 并不意味著阻塞 CPU,它只會使進程切換到阻塞狀態(tài),讓出 CPU 的控制權(quán),其他進程可以繼續(xù)執(zhí)行。
  • 進程的阻塞狀態(tài)是由內(nèi)核進行管理的,通常是 TASK_INTERRUPTIBLETASK_UNINTERRUPTIBLE,這取決于 I/O 請求的性質(zhì)。TASK_INTERRUPTIBLE 狀態(tài)表示進程可以響應(yīng)信號中斷,而 TASK_UNINTERRUPTIBLE 狀態(tài)下進程不會響應(yīng)信號。

階段 2: 網(wǎng)卡收到數(shù)據(jù)包并喚醒進程

背景: 數(shù)據(jù)包通過網(wǎng)絡(luò)接口卡(NIC)到達時,內(nèi)核通過硬件中斷機制將數(shù)據(jù)拷貝到內(nèi)核空間。內(nèi)核會將這些數(shù)據(jù)存入相應(yīng)的套接字緩沖區(qū),進而喚醒之前等待的進程。

步驟 1: 網(wǎng)卡接收數(shù)據(jù)包

  • 網(wǎng)絡(luò)接口卡(NIC)通過 DMA(直接內(nèi)存訪問)機制將收到的網(wǎng)絡(luò)數(shù)據(jù)包直接拷貝到內(nèi)核空間的環(huán)形緩沖區(qū)(RingBuffer)中,這一過程在硬件和內(nèi)核中自動完成。
  • 一旦數(shù)據(jù)包被成功接收,NIC 會觸發(fā)硬件中斷,通知操作系統(tǒng)數(shù)據(jù)包已到達。

步驟 2: 數(shù)據(jù)包復(fù)制到套接字接收緩沖區(qū)

  • 中斷處理程序會將數(shù)據(jù)包從環(huán)形緩沖區(qū)復(fù)制到對應(yīng)套接字的接收緩沖區(qū)。
  • 在這時,內(nèi)核會檢查是否有任何進程(如在第一階段被阻塞的進程)正在等待該套接字的接收數(shù)據(jù)。如果有,內(nèi)核會喚醒等待隊列中的進程,使其恢復(fù)執(zhí)行。

步驟 3: 喚醒等待的進程

  • 被喚醒的進程會重新進入 TASK_RUNNING 狀態(tài),系統(tǒng)調(diào)度器會將該進程從等待隊列中移除,并將其放回可運行隊列。
  • 用戶進程被恢復(fù)執(zhí)行后,recv 函數(shù)會從套接字接收緩沖區(qū)中讀取數(shù)據(jù),并將數(shù)據(jù)返回到用戶空間的緩沖區(qū)(例如 buffer)。

步驟 4: 用戶程序完成 I/O 操作

  • 一旦數(shù)據(jù)被成功讀取,recv 函數(shù)會返回讀取的字節(jié)數(shù),用戶程序可以繼續(xù)處理接收到的數(shù)據(jù)。

2.非阻塞IO(Non-blocking I/O)

首先我們先來認識一個新的函數(shù)fcntl():

2.1fcntl函數(shù)的基本用法

fcntl 函數(shù)主要用于對已打開的文件描述符進行控制操作,以改變文件描述符的屬性或獲取其狀態(tài)。

fcntl函數(shù)通常在處理低級別的文件I/O時使用,例如復(fù)制文件描述符、獲取和設(shè)置文件描述符標志、獲取和設(shè)置文件狀態(tài)標志、文件鎖定(共享鎖和排他鎖)、設(shè)置文件所有者。

  • fcntl函數(shù)的基本原型如下:
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

參數(shù)說明

  • fd 是文件描述符。
  • cmd 是要執(zhí)行的命令。
  • arg 可選參數(shù),可能還需要一個或多個附加參數(shù),具體取決于 cmd 的值。

返回值

  • 成功時,根據(jù)cmd的不同,可能需要一個或多個附加參數(shù)。
  • 失敗時,返回-1,并設(shè)置errno以只是錯誤原因。

fcntl的常見命令

復(fù)制文件描述符

示例代碼:

  • F_DUPFD:返回一個大于或等于指定值的最小可用文件描述符,該描述符與原來的描述符指向同一個文件。
  • F_DUPFD_CLOEXEC:與 F_DUPFD 類似,但新描述符設(shè)置 FD_CLOEXEC 標志。
?
#include <fcntl.h> // 包含 fcntl 相關(guān)的頭文件
#include <unistd.h> // 包含 close 和 open 函數(shù)的頭文件
#include <iostream> // 包含輸入輸出流的頭文件

int main() {
    int old_fd = open("example.txt", O_RDONLY); // 打開文件用于只讀
    if (old_fd == -1) {
        std::perror("打開文件失?。?); // 輸出錯誤信息
        return -1;
    }

    int new_fd = fcntl(old_fd, F_DUPFD, 3); // 復(fù)制文件描述符,要求新的描述符至少為 3
    if (new_fd == -1) {
        std::perror("復(fù)制文件描述符失敗:");
        close(old_fd);
        return -1;
    }

    std::cout << "新的文件描述符:" << new_fd << std::endl; // 輸出新的文件描述符

    close(old_fd); // 關(guān)閉舊的文件描述符
    close(new_fd); // 關(guān)閉新的文件描述符

    return 0;
}

?

獲取/設(shè)置文件描述符標志

標志

  • 示例代碼:
?
#include <fcntl.h> // 包含 fcntl 相關(guān)的頭文件
#include <unistd.h> // 包含 close 和 open 函數(shù)的頭文件
#include <iostream> // 包含輸入輸出流的頭文件

int main() {
    int fd = open("example.txt", O_RDONLY); // 打開文件用于只讀
    if (fd == -1) {
        std::perror("打開文件失敗:"); // 輸出錯誤信息
        return -1;
    }

    int flags = fcntl(fd, F_GETFD); // 獲取文件描述符的標志
    if (flags == -1) {
        std::perror("獲取文件描述符標志失?。?);
        close(fd);
        return -1;
    }

    // 設(shè)置 FD_CLOEXEC 標志,使文件描述符在執(zhí)行 exec 時關(guān)閉
    if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {
        std::perror("獲取文件描述符標志失?。?);
        close(fd);
        return -1;
    }

    std::cout << "設(shè)置 FD_CLOEXEC 前的標志:" << flags << std::endl; // 輸出設(shè)置前的標志
    std::cout << "設(shè)置 FD_CLOEXEC 后的標志:" << new_flags << std::endl; // 輸出設(shè)置后的標志

    close(fd); // 關(guān)閉文件描述符
    return 0;
}

?
  • F_GETFD:獲取文件描述符的標志。
  • F_SETFD:設(shè)置文件描述符的標志。
  • FD_CLOEXEC:設(shè)置或取消 close-on-exec 標志,該標志表示在執(zhí)行 exec 系列函數(shù)時關(guān)閉該描述符。
  • O_NONBLOCK:非阻塞模式。
  • O_APPEND:追加模式。
  • O_ASYNC:啟用信號驅(qū)動 I/O。
  • O_DIRECT:直接 I/O(盡量繞過緩沖區(qū)緩存)。
  • O_NOATIME:不更新文件的訪問時間。

獲取/設(shè)置文件狀態(tài)標志

  • 示例代碼:
?
#include <fcntl.h> // 包含 fcntl 相關(guān)的頭文件
#include <unistd.h> // 包含 close 和 open 函數(shù)的頭文件
#include <iostream> // 包含輸入輸出流的頭文件

int main() {
    int fd = open("example.txt", O_RDONLY); // 打開文件用于只讀
    if (fd == -1) {
        std::perror("打開文件失?。?); // 輸出錯誤信息
        return -1;
    }

    int flags = fcntl(fd, F_GETFL); // 獲取文件狀態(tài)標志
    if (flags == -1) {
        std::perror("獲取文件狀態(tài)標志失敗:");
        close(fd);
        return -1;
    }

    // 設(shè)置 O_NONBLOCK 標志,使文件描述符處于非阻塞模式
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);

    int new_flags = fcntl(fd, F_GETFL); // 再次獲取文件狀態(tài)標志
    if (new_flags == -1) {
        std::perror("獲取文件狀態(tài)標志失?。?);
        close(fd);
        return -1;
    }

    std::cout << "設(shè)置 O_NONBLOCK 前的標志:" << flags << std::endl; // 輸出設(shè)置前的標志
    std::cout << "設(shè)置 O_NONBLOCK 后的標志:" << new_flags << std::endl; // 輸出設(shè)置后的標志

    close(fd); // 關(guān)閉文件描述符

    return 0;
}

?
  • F_GETFL:獲取文件狀態(tài)標志。
  • F_SETFL:設(shè)置文件狀態(tài)標志。

2.2 阻塞模式 vs 非阻塞模式

阻塞模式:(上面已有介紹)

  • 默認情況下,文件描述符處于阻塞模式。
  • 當你嘗試從一個沒有數(shù)據(jù)可讀的文件描述符中讀取數(shù)據(jù),或者嘗試向一個寫緩沖區(qū)已滿的文件描述符寫入數(shù)據(jù)時,進程會被阻塞,直到操作可以完成。

非阻塞模式

非阻塞I/O模型下,I/O請求立即返回,不會阻塞程序。如果數(shù)據(jù)沒有準備好,程序會收到錯誤或“沒有數(shù)據(jù)”的通知,之后可以重新嘗試。

  • 如果設(shè)置了 O_NONBLOCK 標志,那么當嘗試讀取沒有數(shù)據(jù)可讀或?qū)懢彌_區(qū)已滿的情況下,不會阻塞進程,而是立即返回一個錯誤。
  • 典型的錯誤碼是 EAGAINEWOULDBLOCK,這表明操作不能立即完成。
  • 優(yōu)點:線程可以進行其他任務(wù),而不是等待I/O操作完成。
  • 缺點:需要不斷輪詢(polling)I/O操作,增加了額外的CPU開銷。

代碼示例:

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <cstring>

using namespace std;
#define PORT 8080
#define BUFFER_SIZE 1024

// 設(shè)置套接字為非阻塞模式
int setNonBlocking(int sockfd) {
    int flags = fcntl(sockfd, F_GETFL, 0);
    if (flags == -1) {
        cerr << "獲取文件狀態(tài)標志失敗: " << strerror(errno) << endl;
        return -1;
    }
    if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) == -1) {
        cerr << "設(shè)置非阻塞模式失敗: " << strerror(errno) << endl;
        return -1;
    }
    return 0;
}

int main() {
    // 創(chuàng)建套接字
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == -1) {
        cerr << "創(chuàng)建套接字失敗: " << strerror(errno) << endl;
        return -1;
    }

    // 設(shè)置套接字為非阻塞
    if (setNonBlocking(server_fd) == -1) {
        close(server_fd);
        return -1;
    }

    // 綁定地址和端口
    struct sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        cerr << "綁定地址和端口失敗: " << strerror(errno) << endl;
        close(server_fd);
        return -1;
    }

    // 監(jiān)聽連接
    if (listen(server_fd, 3) < 0) {
        cerr << "監(jiān)聽連接失敗: " << strerror(errno) << endl;
        close(server_fd);
        return -1;
    }

    cout << "服務(wù)器正在監(jiān)聽端口 " << PORT << endl;

    // 接受客戶端連接
    struct sockaddr_in client_address;
    socklen_t addr_len = sizeof(client_address);
    int client_fd = -1;

    while (client_fd == -1) {
        client_fd = accept(server_fd, (struct sockaddr *)&client_address, &addr_len);

        if (client_fd == -1) {
            // 如果沒有連接,errno 會被設(shè)置為 EWOULDBLOCK 或 EAGAIN
            if (errno == EWOULDBLOCK || errno == EAGAIN) {
                cout << "沒有可用連接,繼續(xù)等待..." << endl;
                sleep(1);  // 延時 1s 后重試
            } else {
                cerr << "接受客戶端連接失敗: " << strerror(errno) << endl;
                close(server_fd);
                return -1;
            }
        }
    }

    cout << "接受到客戶端連接" << endl;

    // 設(shè)置客戶端套接字為非阻塞
    if (setNonBlocking(client_fd) == -1) {
        close(server_fd);
        close(client_fd);
        return -1;
    }

    char buffer[BUFFER_SIZE];
    int bytes_read;

    while (true) {
        // 嘗試讀取客戶端數(shù)據(jù)
        bytes_read = recv(client_fd, buffer, sizeof(buffer), 0);

        if (bytes_read == -1) {
            // 如果沒有數(shù)據(jù),errno 會被設(shè)置為 EWOULDBLOCK 或 EAGAIN
            if (errno == EWOULDBLOCK || errno == EAGAIN) {
                cout << "沒有可用數(shù)據(jù),執(zhí)行其他任務(wù)..." << endl;
                usleep(100000);  // 假設(shè)其他任務(wù)的延時(100ms)
            } else {
                cerr << "接收數(shù)據(jù)失敗: " << strerror(errno) << endl;
                break;
            }
        } else if (bytes_read == 0) {
            // 客戶端關(guān)閉連接
            cout << "客戶端已斷開連接" << endl;
            break;
        } else {
            // 成功接收到數(shù)據(jù)
            buffer[bytes_read] = '\0';  // 確保接收到的字符串以 '\0' 結(jié)尾
            cout << "收到數(shù)據(jù): " << buffer << endl;
        }
    }

    // 關(guān)閉連接
    close(client_fd);
    close(server_fd);

    return 0;
}

原理分析:

非阻塞 I/O/階段1:用戶程序調(diào)用 recv 發(fā)起 I/O 請求

  • 在循環(huán)中調(diào)用 recv,如果沒有數(shù)據(jù),recv 會立即返回 -1 并設(shè)置 errnoEWOULDBLOCKEAGAIN。
  • 程序檢測到 EWOULDBLOCK 錯誤后,執(zhí)行其他任務(wù)(如打印信息和休眠),然后繼續(xù)嘗試接收數(shù)據(jù)。
  • 這對應(yīng)于用戶程序調(diào)用 recv 發(fā)起 I/O 請求,讀取 socket 緩沖區(qū)數(shù)據(jù)。由于 socket 緩沖區(qū)沒有就緒數(shù)據(jù)包,非阻塞 I/O recv 直接返回 EWOULDBLOCK 錯誤碼,用戶如果一直調(diào)用 recv 函數(shù)則一直返回 EWOULDBLOCK 錯誤碼,直到數(shù)據(jù)準備好。

非阻塞 I/O/階段2:數(shù)據(jù)到達并喚醒進程

  • 當數(shù)據(jù)通過網(wǎng)絡(luò)接口卡(NIC)接收并被內(nèi)核處理后,數(shù)據(jù)被復(fù)制到套接字接收緩沖區(qū)。
  • 隨后,recv 調(diào)用會成功讀取數(shù)據(jù),返回接收到的字節(jié)數(shù),程序繼續(xù)處理數(shù)據(jù)。
  • 這與阻塞 I/O 的階段2 相同,即網(wǎng)卡收到數(shù)據(jù)包并喚醒進程,包括數(shù)據(jù)復(fù)制到套接字接收緩沖區(qū)和喚醒等待的進程。

拓展知識Ctrl+CCtrl+D:

組合鍵作用退出狀態(tài)碼典型場景
Ctrl+C發(fā)送 SIGINT 信號給前臺進程,請求程序終止通常為 130(128 + 2)用于中斷正在運行的程序
Ctrl+D發(fā)送 EOF 信號,表示輸入結(jié)束通常為 0用于結(jié)束輸入或退出交互式 shell

3.IO多路復(fù)用(Multiplexing)

IO多路復(fù)用是一種高效的IO處理方式,它可以讓一個進程同時監(jiān)控多個文件描述符,當其中任意一個文件描述符就緒時,就可以進行相應(yīng)的IO操作。

相比于傳統(tǒng)的阻塞IO和非阻塞IO,IO復(fù)用可以打打提高IO效率,減少CPU資源的浪費。

在Linux中,常用的IO復(fù)用模型有select、poll、epoll等。

IO復(fù)用模型請求由用戶程序發(fā)起,所以IO復(fù)用模型為同步IO。

3.1 IO復(fù)用select模型

3.1.1 認識select函數(shù)

系統(tǒng)調(diào)用select()會一直阻塞,直到一個或多個文件描述符集合成為就緒態(tài)。

它通過傳遞三個文件描述符集合(讀集合、寫集合和異常集合)給內(nèi)核,內(nèi)核會在這些集合中等待任意一個文件描述符就緒。

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

參數(shù):

  • nfds:設(shè)為比下面三個文件描述符集合中所包含的最大文件描述符號 +1。
  • readfds:是用來檢測輸入是否就緒的文件描述符集合。
  • writefds:是用來檢測輸出是否就緒的文件描述符集合。
  • exceptfds:是用來檢測異常情況是否發(fā)生的文件描述符集合。
  • timeout:超時時間,這個參數(shù)控制著select()的阻塞行為。

該參數(shù)可指定為NULL,此時select()會一直阻塞。又或者指向一個timeval結(jié)構(gòu)體。

如果結(jié)構(gòu)體timeval的兩個域都為0的話,此時select()不會阻塞。它只是簡單低輪詢指定的文件描述符集合,查看其中是否有就緒的文件描述符并立即返回。

否則,timeval的兩個域都不為0的話,timeval將為select()指定一個等待時間上限值。代表多久之后返回,即超時時間。

返回值:

  • 如果有文件描述符變得可讀、可寫或發(fā)生異常,返回值為準備就緒的文件描述符的數(shù)目。
  • 如果 timeout 到達,返回值為 0。這種情況下每個返回的文件描述符集合將被清空。
  • 如果發(fā)生錯誤,返回值為 -1。

timeval結(jié)構(gòu)體原型

struct timeval
{
__time_t tv_sec;		/* 秒.  */
__suseconds_t tv_usec;	/* 微秒.  */
};

timeout設(shè)為NULL,或其指向的結(jié)構(gòu)體字段非零時,select()將阻塞直到下列事件發(fā)生:

  • readfds、writefdsexceptfds中指定的文件描述符中至少有一個成為就緒態(tài)。
  • 該調(diào)用被信號處理中斷。
  • timeout 中指定的時間上限已超時。

關(guān)于 fd_setfd_set 是一個位圖結(jié)構(gòu),用于標識一組文件描述符(通常是網(wǎng)絡(luò)套接字)。fd_set 的定義通常是由底層實現(xiàn)細節(jié)決定的,但通常它是一個足夠大的位字段,能夠容納系統(tǒng)中可能的最大文件描述符值。fd_set 的主要用途包括:

  • 輸入?yún)?shù):告訴 select 哪些文件描述符應(yīng)該被監(jiān)控。你可以在調(diào)用 select 之前,通過調(diào)用 FD_ZERO 清空集合,然后用 FD_SET 向集合中添加感興趣的文件描述符。
  • 輸出參數(shù)select 返回后,被監(jiān)控的文件描述符集合中,就緒的描述符對應(yīng)的比特位會被設(shè)置為 1。你可以通過 FD_ISSET 宏來檢查特定的文件描述符是否已經(jīng)就緒。

3.1.2fd_set類型和宏

通常數(shù)據(jù)類型fd_set以位掩碼的形式來實現(xiàn)。但是,我們并不需要知道這些細節(jié),因為所有關(guān)于文件描述符集合的操作都是通過四個宏完成的:

#include <sys/select.h>
void FD_ZERO(fd_set *set);			/* 將fdset所指向的集合初始化為空 */
void FD_SET(int fd, fd_set *set);	/* 將文件描述符fd添加到由fdset所指向的集合中 */
void FD_CLR(int fd, fd_set *set);	/* 將文件描述符fd從fdset所指向的集合中移除 */
int FD_ISSET(int fd, fd_set *set);	/* 檢查已連接的套接字是否有數(shù)據(jù)可讀 */

參數(shù)readfdswritefdsexceptfds所指向的結(jié)構(gòu)體都是保存結(jié)果值的地方。

在調(diào)用select()之前,這些指向的結(jié)構(gòu)體必須初始化(通過FD_ZERO()FD_SET()),以包含我們感興趣的文件描述符集合。

之后select()調(diào)用會修改這些結(jié)構(gòu)體,當select()返回時,它們包含的就是已處于就緒態(tài)的文件描述符集合了(由于這些結(jié)構(gòu)體會在調(diào)用中被修改,如果在循環(huán)中重復(fù)調(diào)用select(),我們必須保證每次都要重新初始化它們)。

之后這些結(jié)構(gòu)體可以通過FD_ISSET()來檢查是否有數(shù)據(jù)可讀。

3.1.3 select特點

文件描述符上限:

  • select 函數(shù)能同時等待的文件描述符(fd)是有上限的。
  • 這個上限在很多操作系統(tǒng)中默認為 1024,可以通過調(diào)整內(nèi)核參數(shù)來增加這個上限,但即使增加,仍然存在一個固定的上限。
  • 這是因為 select 使用位圖來表示文件描述符集合,而位圖的大小是固定的。
  • 如果需要更大的文件描述符數(shù)量,需要修改內(nèi)核或使用其他 I/O 多路復(fù)用技術(shù),如 epoll。

維護合法的文件描述符:

  • 使用 select 時,需要維護一個第三方數(shù)組來保存合法的文件描述符。
  • 這是因為在實際應(yīng)用中,文件描述符可能會動態(tài)增加或減少,而 select 本身并不提供任何機制來自動跟蹤這些變化。因此,程序員需要自己維護這樣一個列表,確保每次調(diào)用 select 時提供的文件描述符集合是最新的。

輸入輸出型參數(shù):

  • select 的參數(shù)是輸入輸出型的。這意味著在調(diào)用 select 之前,你需要設(shè)置好各個集合(readfds、writefds、exceptfds),告訴內(nèi)核你需要監(jiān)控哪些文件描述符的狀態(tài)。而在 select 返回后,你需要檢查這些集合,確定哪些文件描述符就緒。
  • 這種模式要求在每次調(diào)用 select 之前重置集合,并在調(diào)用之后檢查集合,這增加了用戶的負擔。

第一個參數(shù)是最大 fd+1

  • select 的第一個參數(shù) nfds 是最大的文件描述符值加 1。
  • 這是因為 select 在內(nèi)核中需要遍歷從 0 到最大文件描述符值的范圍,來檢查哪些文件描述符處于就緒狀態(tài)。
  • 如果最大文件描述符是 n,那么實際上需要檢查的范圍是從 0n,共 n+1 個文件描述符。
  • 例如,如果最大的文件描述符是 5,那么 select 實際上需要檢查 0 到 5 的文件描述符,共 6 個。

位圖的使用:

  • select 使用位圖(fd_set)來表示文件描述符集合。位圖是一種高效的數(shù)據(jù)結(jié)構(gòu),每個比特位代表一個文件描述符的狀態(tài)。
  • 當用戶向內(nèi)核傳遞文件描述符集合時,實際上是傳遞了一個位圖。內(nèi)核在監(jiān)控過程中會修改這個位圖,將就緒的文件描述符標記出來。
  • select 返回后,用戶可以根據(jù)位圖來確定哪些文件描述符已經(jīng)準備好。這種方式簡化了內(nèi)核與用戶空間之間的交互,但也帶來了額外的內(nèi)存拷貝成本。

代碼示例:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>
#include <fcntl.h>
#include <sys/select.h>

#define SERVER_PORT 8080
#define MAX_CLIENTS 10
#define BUF_SIZE 1024

void set_socket_non_blocking(int sockfd) {
    int flags = fcntl(sockfd, F_GETFL, 0);
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
}

int main() {
    int server_fd, client_fd, max_fd, new_socket;
    struct sockaddr_in server_addr;
    char buffer[BUF_SIZE];
    fd_set read_fds, master_fds;
    struct timeval timeout;

    // 創(chuàng)建 TCP socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("創(chuàng)建套接字失敗");
        return -1;
    }

    // 設(shè)置服務(wù)器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(SERVER_PORT);

    // 綁定套接字
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
        perror("綁定失敗");
        return -1;
    }

    // 開始監(jiān)聽客戶端連接
    if (listen(server_fd, MAX_CLIENTS) == -1) {
        perror("監(jiān)聽失敗");
        return -1;
    }

    // 設(shè)置 server_fd 為非阻塞
    set_socket_non_blocking(server_fd);

    // 初始化 fd_set
    FD_ZERO(&master_fds);
    FD_SET(server_fd, &master_fds);
    max_fd = server_fd;

    while (true) {
        // 將 master_fds 賦值給 read_fds,因為 select() 會修改 read_fds
        read_fds = master_fds;

        // 設(shè)置超時,阻塞 5 秒
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;

        // 調(diào)用 select() 進行 I/O 多路復(fù)用
        int activity = select(max_fd + 1, &read_fds, nullptr, nullptr, &timeout);
        if (activity == -1) {
            perror("select 錯誤");
            break;
        } else if (activity == 0) {
            std::cout << "沒有活動,繼續(xù)等待...\n";
            continue;
        }

        // 遍歷所有文件描述符
        for (int fd = 0; fd <= max_fd; ++fd) {
            // 如果 fd 是活動的文件描述符
            if (FD_ISSET(fd, &read_fds)) {
                if (fd == server_fd) {
                    // 處理新的客戶端連接
                    if ((new_socket = accept(server_fd, nullptr, nullptr)) == -1) {
                        perror("接受連接失敗,繼續(xù)...");
                        continue;
                    }

                    std::cout << "新連接,套接字 fd: " << new_socket << "\n";

                    // 設(shè)置新的套接字為非阻塞
                    set_socket_non_blocking(new_socket);

                    // 將新的客戶端套接字加入 fd_set
                    FD_SET(new_socket, &master_fds);
                    if (new_socket > max_fd) {
                        max_fd = new_socket;
                    }
                } else {
                    // 處理已連接客戶端的 I/O 操作
                    int bytes_read = read(fd, buffer, sizeof(buffer) - 1);
                    if (bytes_read == 0) {
                        // 客戶端關(guān)閉連接
                        std::cout << "客戶端斷開連接,套接字 fd: " << fd << "\n";
                        close(fd);
                        FD_CLR(fd, &master_fds);
                    } else if (bytes_read > 0) {
                        // 處理收到的數(shù)據(jù)
                        buffer[bytes_read] = '\0';
                        std::cout << "收到來自客戶端 " << fd << " 的數(shù)據(jù): " << buffer << "\n";

                        // 回送數(shù)據(jù)給客戶端
                        send(fd, buffer, bytes_read, 0);
                    } else {
                        perror("讀取錯誤");
                        close(fd);
                        FD_CLR(fd, &master_fds);
                    }
                }
            }
        }
    }

    close(server_fd);
    return 0;
}

原理分析:

3.2 IO復(fù)用poll模型

poll是一種改進的 IO 多路復(fù)用模型,它解決了select模型中的一些局限性,尤其是在處理大量文件描述符和提高性能方面。

pollselect類似,但它通過使用pollfd結(jié)構(gòu)體數(shù)組來管理文件描述符,而不是像select那樣依賴位圖(bitmask)。這使得poll在某些方面更加靈活和高效。

3.2.1poll的基本使用方法

#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);

參數(shù)說明

  • fds:指向 pollfd 結(jié)構(gòu)體數(shù)組的指針,每個結(jié)構(gòu)體代表一個需要監(jiān)視的文件描述符及其事件。
  • nfdspollfd 數(shù)組中元素的數(shù)量,即有多少個文件描述符需要被監(jiān)視。
  • timeout:等待事件的超時時間,單位為毫秒。-1 表示無限等待直到至少有一個文件描述符準備好;0 表示非阻塞;如果是正數(shù),則表示最大等待的時間長度。

pollfd 結(jié)構(gòu)體:

struct pollfd {
    int   fd;         // 要監(jiān)視的文件描述符
    short events;     // 監(jiān)視的事件
    short revents;    // 實際發(fā)生的事件
};

事件類型常用值:

  • POLLIN:數(shù)據(jù)可讀。
  • POLLOUT:可以寫數(shù)據(jù)。
  • POLLERR:發(fā)生錯誤。
  • POLLHUP:掛斷。
  • POLLPRI:高優(yōu)先級數(shù)據(jù)可讀。

3.2.2poll解決select存在的問題

poll相較于select在多個方面進行了改進,解決了select模型中的一些關(guān)鍵限制。以下是poll解決select存在問題的主要方面:

  1. 無需重新設(shè)定參數(shù):與select每次調(diào)用前都需要重新初始化監(jiān)視的文件描述符集合不同,poll使用一個獨立的結(jié)構(gòu)體數(shù)組(pollfd),該數(shù)組在函數(shù)調(diào)用后保持不變,只需更新事件結(jié)果。這使得代碼更簡潔、易于維護。
  2. 消除文件描述符數(shù)量的上限select受限于系統(tǒng)定義的最大文件描述符數(shù)(如FD_SETSIZE),而poll通過動態(tài)管理文件描述符數(shù)組,僅受系統(tǒng)資源和內(nèi)核能力的限制,適合處理大量并發(fā)連接。
  3. 更高效的事件通知機制:盡管兩者都可能需要掃描所有文件描述符,poll得益于其靈活的結(jié)構(gòu)和操作系統(tǒng)的優(yōu)化,在實際應(yīng)用中通常性能更優(yōu)。
  4. 支持更多事件類型:相較于select僅支持基本事件類型,poll支持更多種類的事件,如高優(yōu)先級數(shù)據(jù)和掛斷事件,提供更細致的監(jiān)控能力。
  5. 更好的跨平臺兼容性poll在多種現(xiàn)代操作系統(tǒng)中的實現(xiàn)更為一致,簡化了跨平臺應(yīng)用的開發(fā)難度。

代碼示例:

#include <iostream>
#include <vector>
#include <poll.h>
#include <unistd.h>
#include <cstring>
#include <arpa/inet.h>
#include <fcntl.h>

#define PORT 8080
#define MAX_EVENTS 1024
#define BUFFER_SIZE 1024

int set_non_blocking(int fd) {
    int flags = fcntl(fd, F_GETFL, 0);
    if (flags == -1)
        return -1;
    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    
    // 創(chuàng)建監(jiān)聽套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
    
    // 設(shè)置套接字選項
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
        perror("setsockopt");
        close(server_fd);
        exit(EXIT_FAILURE);
    }
    
    // 設(shè)置地址結(jié)構(gòu)
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
    
    // 綁定套接字
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }
    
    // 開始監(jiān)聽
    if (listen(server_fd, 10) < 0) {
        perror("listen");
        close(server_fd);
        exit(EXIT_FAILURE);
    }
    
    // 設(shè)置服務(wù)器套接字為非阻塞
    if (set_non_blocking(server_fd) < 0) {
        perror("set_non_blocking");
        close(server_fd);
        exit(EXIT_FAILURE);
    }
    
    // 初始化pollfd數(shù)組
    std::vector<struct pollfd> fds;
    struct pollfd server_pollfd;
    server_pollfd.fd = server_fd;
    server_pollfd.events = POLLIN;
    server_pollfd.revents = 0;
    fds.push_back(server_pollfd);
    
    std::cout << "服務(wù)器正在端口 " << PORT << " 上監(jiān)聽" << std::endl;
    
    while (true) {
        int activity = poll(fds.data(), fds.size(), -1);
        
        if (activity < 0) {
            perror("poll error");
            break;
        }
        
        for (size_t i = 0; i < fds.size(); ++i) {
            // 檢測是否有事件發(fā)生
            if (fds[i].revents & POLLIN) {
                if (fds[i].fd == server_fd) {
                    // 有新的連接請求
                    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
                        perror("accept");
                        continue;
                    }
                    
                    // 設(shè)置新套接字為非阻塞
                    if (set_non_blocking(new_socket) < 0) {
                        perror("set_non_blocking");
                        close(new_socket);
                        continue;
                    }
                    
                    // 添加新套接字到pollfd數(shù)組
                    struct pollfd client_pollfd;
                    client_pollfd.fd = new_socket;
                    client_pollfd.events = POLLIN;
                    client_pollfd.revents = 0;
                    fds.push_back(client_pollfd);
                    
                    std::cout << "新連接,socket fd: " << new_socket << std::endl;
                } else {
                    // 處理已連接的客戶端數(shù)據(jù)
                    char buffer[BUFFER_SIZE];
                    int valread = read(fds[i].fd, buffer, BUFFER_SIZE);
                    
                    if (valread <= 0) {
                        // 客戶端關(guān)閉連接或發(fā)生錯誤
                        close(fds[i].fd);
                        std::cout << "連接關(guān)閉,socket fd: " << fds[i].fd << std::endl;
                        fds.erase(fds.begin() + i);
                        --i;
                        continue;
                    }
                    
                    buffer[valread] = '\0';
                    std::cout << "收到: " << buffer << " 來自socket fd: " << fds[i].fd << std::endl;
                    
                    // 回顯數(shù)據(jù)給客戶端
                    send(fds[i].fd, buffer, valread, 0);
                }
            }
        }
    }
    
    // 關(guān)閉所有套接字
    for (auto &pfd : fds) {
        close(pfd.fd);
    }
    
    return 0;
}

原理分析:

poll模型和select非常相似,主要區(qū)別為poll模型把位圖改為鏈表,poll通過鏈表實現(xiàn)IO復(fù)用,將 socket 注冊 poll_list 鏈表,通過poll系統(tǒng)調(diào)用輪詢鏈表,獲取 socket 事件。

成功獲取到 socket 事件后,poll成功返回,此時可以通過接收函數(shù)讀取 socket 緩沖區(qū)數(shù)據(jù)。

3.3 IO復(fù)用epoll模型

epoll是Linux下高效的IO多路復(fù)用機制,相較于selectpoll,epoll在處理大量并發(fā)連接時具有更好的性能和擴展性。

epoll的工作機制主要包括下面幾個步驟:

3.3.1 epoll的基本使用方法

  • 創(chuàng)建 epoll 實例

使用 epoll_createepoll_create1 系統(tǒng)調(diào)用創(chuàng)建一個 epoll 實例,該調(diào)用返回一個 epoll 文件描述符(epoll_fd)。這個文件描述符用于后續(xù)的事件注冊和事件等待。

#include <sys/epoll.h>
int epoll_create1(int flags);

參數(shù):

  • flags: 可以是0或EPOLL_CLOEXEC。如果設(shè)置為EPOLL_CLOEXEC,則會在新創(chuàng)建的文件描述符上設(shè)置“執(zhí)行時關(guān)閉”標志(close-on-exec),這意味著當調(diào)用 exec 系列函數(shù)執(zhí)行新程序時,這個文件描述符會自動關(guān)閉,防止不必要的資源泄漏。
  • 返回值:成功時返回一個非負整數(shù)的文件描述符,失敗時返回 -1 并設(shè)置相應(yīng)的 errno 錯誤碼。

注冊感興趣的事件

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

epoll_ctlepoll API 的核心組成部分之一,它用于控制 epoll 實例中的文件描述符集合。通過這個函數(shù),可以向 epoll 實例中添加、修改或刪除感興趣的文件描述符及其對應(yīng)的事件類型。

使用 epoll_ctl 系統(tǒng)調(diào)用向 epoll 實例中注冊需要監(jiān)控的文件描述符及其感興趣的事件類型(如可讀、可寫等)

參數(shù)

  • epfd: epoll_create1epoll_create 返回的 epoll 實例的文件描述符。

op: 操作類型,可以是以下三種之一:

  • EPOLL_CTL_ADD: 向 epoll 實例中添加新的文件描述符,并注冊感興趣的事件。
  • EPOLL_CTL_MOD: 修改已存在的文件描述符上的事件類型。
  • EPOLL_CTL_DEL: 從 epoll 實例中移除指定的文件描述符,不再監(jiān)聽其上的任何事件。
  • fd: 需要操作的目標文件描述符。
  • event: 如果 op 不是 EPOLL_CTL_DEL,則需要提供一個指向 epoll_event 結(jié)構(gòu)體的指針,用于指定事件類型和用戶數(shù)據(jù)。

返回值:成功時返回 0;失敗時返回 -1 并設(shè)置相應(yīng)的 errno 錯誤碼。

事件結(jié)構(gòu)體 epoll_event

struct epoll_event {
    uint32_t events;    /* Epoll events */
    epoll_data_t data;  /* User data variable */
};

typedef union epoll_data {
    void *ptr;
    int fd;
    uint32_t u32;
    uint64_t u64;
} epoll_data_t;

在使用 epoll_ctl 之前,我們需要定義一個 epoll_event 結(jié)構(gòu)體來描述要監(jiān)控的事件和關(guān)聯(lián)的數(shù)據(jù)。這個結(jié)構(gòu)體有兩個主要成員:

events:這是一個位掩碼,指定了我們對文件描述符感興趣的事件類型。

常見的事件類型包括:

  • EPOLLIN:文件描述符可讀(例如,socket接收緩沖區(qū)中有數(shù)據(jù))。
  • EPOLLOUT:文件描述符可寫(例如,socket發(fā)送緩沖區(qū)有空間)。
  • EPOLLET:邊緣觸發(fā)模式(Edge Triggered),意味著只有狀態(tài)變化時才會觸發(fā)事件。
  • EPOLLRDHUP:遠程端關(guān)閉連接或半關(guān)閉連接(TCP-specific)。

data:這是一個聯(lián)合體,通常用來存儲與該文件描述符相關(guān)的用戶數(shù)據(jù)。最常見的做法是使用 data.fd 來存儲文件描述符本身,以便在事件發(fā)生時能夠快速識別出哪個描述符觸發(fā)了事件。

示例代碼

struct epoll_event event;
event.events = EPOLLIN | EPOLLET; 	// 監(jiān)聽可讀事件,采用邊緣觸發(fā)
event.data.fd = sock_fd;			// 將sock_fd綁定到event.data.fd
// 使用EPOLL_CTL_ADD操作將sock_fd加入epoll實例
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock_fd, &event) == -1) {
    perror("epoll_ctl: add");
    exit(EXIT_FAILURE);
}

等待事件的發(fā)生

使用 epoll_wait 系統(tǒng)調(diào)用阻塞等待注冊的事件發(fā)生。當有事件就緒時,epoll_wait 返回就緒事件的數(shù)量,并提供epoll_event數(shù)組中填充準備好的事件信息。

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

參數(shù)

  • epfd: 指向 epoll 實例的文件描述符。
  • events: 一個指向 epoll_event 結(jié)構(gòu)數(shù)組的指針,用于存儲已就緒的事件。
  • maxevents: 表示 events 數(shù)組的最大大小,即一次最多能返回多少個事件。
  • timeout: 超時時間(毫秒)。如果設(shè)置為 -1,則無限期等待;如果設(shè)置為 0,則立即返回,即使沒有事件發(fā)生;如果設(shè)置為正數(shù),則表示最長等待的時間。

返回值:成功時返回已就緒的文件描述符的數(shù)量;如果沒有事件發(fā)生且超時到期,則返回 0;出錯時返回 -1 并設(shè)置 errno。

struct epoll_event events[MAX_EVENTS];
int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
if (n == -1) {
    perror("epoll_wait");
    exit(EXIT_FAILURE);
}
for (int i = 0; i < n; i++) {
    if (events[i].events & EPOLLIN) {
        // 處理可讀事件
    }
    // 處理其他事件類型
}

處理事件

根據(jù)就緒事件的類型,執(zhí)行相應(yīng)的 I/O 操作,如讀取數(shù)據(jù)、寫入數(shù)據(jù)或關(guān)閉連接等。在邊緣觸發(fā)模式下,必須一次性將所有可讀或可寫的數(shù)據(jù)處理完畢,否則可能會錯過后續(xù)的事件通知。

關(guān)閉 epoll 實例

當不再需要 epoll 實例時,使用 close 關(guān)閉 epoll 文件描述符,釋放資源。

close(epoll_fd);

3.3.2 epoll原理

  • 事件就緒的定義:底層的IO條件滿足了,可以進行某種IO行為了,就叫做事件就緒。select、pollepoll的工作方式都是基于“等待”到“IO就緒”的事件通知機制。它們通過不同的數(shù)據(jù)結(jié)構(gòu)和算法實現(xiàn)對文件描述符的高效管理和事件通知。
  • 紅黑樹epoll內(nèi)部使用紅黑樹來管理事件的注冊和監(jiān)控。紅黑樹作為一種自平衡的二叉搜索樹,能夠高效的執(zhí)行增、刪、改、查操作。紅黑樹的使用大大提高了epoll在大量文件描述符管理中的效率,尤其是在處理動態(tài)注冊和插銷事件時。
  • 回調(diào)通知機制:當 epoll 監(jiān)聽的套接字上有數(shù)據(jù)可讀或可寫時,內(nèi)核會通過回調(diào)機制通知用戶進程。這種機制能夠精確地通知程序哪些文件描述符上的事件發(fā)生了,而不需要每次都循環(huán)遍歷檢查數(shù)據(jù)是否到達以及數(shù)據(jù)該由哪個進程處理。這樣,程序只需關(guān)注那些已經(jīng)就緒的文件描述符,避免了不必要的輪詢。

3.3.3 水平觸發(fā)(LT)模式 vs 邊緣觸發(fā)(ET)模式

epoll提供了兩種主要的事件觸發(fā)模式:水平觸發(fā)(LT) vs 邊緣觸發(fā)(ET)。它們決定了在文件描述符的狀態(tài)發(fā)生變化時,內(nèi)核如何通知應(yīng)用程序。理解這兩種觸發(fā)的特點及其使用場景,對高效使用epoll至關(guān)重要。

工作原理

  • 水平觸發(fā)(Level-triggered LT):當一個文件描述符準備好了,內(nèi)核會一直報告這個文件描述符,直到應(yīng)用程序處理這個事件。
  • 邊緣觸發(fā)(Edge-triggered ET):當一個文件描述符從無數(shù)據(jù)變?yōu)橛袛?shù)據(jù)時,內(nèi)核只會報告一次,如果應(yīng)用程序沒有及時處理,那么需要等下一次數(shù)據(jù)變動時才會再次報告。

水平觸發(fā)和邊緣觸發(fā)的比較

特性水平觸發(fā)(LT)邊緣觸發(fā)(ET)
通知次數(shù)只要事件未被處理完,內(nèi)核會持續(xù)通知。只會在文件描述符的狀態(tài)發(fā)生變化時通知一次。
對阻塞 I/O 的要求不要求,I/O 可以是阻塞的。必須使用非阻塞 I/O,防止錯過后續(xù)事件。
復(fù)雜度實現(xiàn)簡單,事件處理較為直觀。需要更復(fù)雜的事件處理邏輯,必須一次性處理所有數(shù)據(jù)。
資源消耗可能會造成不必要的重復(fù)通知,增加 CPU 占用。更加高效,減少了重復(fù)的事件通知。
適用場景普通的 I/O 密集型應(yīng)用,如文件處理、輕量級的網(wǎng)絡(luò)服務(wù)等。高并發(fā)、高性能的網(wǎng)絡(luò)應(yīng)用,如 Web 服務(wù)器、實時流處理等。

邊緣觸發(fā)(ET)模式的優(yōu)化技巧

由于 ET 模式要求事件處理更為高效,一些優(yōu)化策略可以確保高并發(fā)下的穩(wěn)定運行:

非阻塞 I/O

必須將所有受 epoll 監(jiān)控的文件描述符設(shè)置為非阻塞模式。否則,在數(shù)據(jù)未及時讀取或?qū)懭氲那闆r下,ET 模式可能錯過后續(xù)事件通知,導致程序不響應(yīng)新事件。

int flags = fcntl(sock_fd, F_GETFL, 0);
fcntl(sock_fd, F_SETFL, flags | O_NONBLOCK);

一次性處理所有數(shù)據(jù)

在 ET 模式下,應(yīng)用程序必須確保在收到事件通知時一次性處理所有可讀或可寫的數(shù)據(jù)。如果不處理完所有數(shù)據(jù),下一次數(shù)據(jù)到達時 epoll 可能不會再次通知,從而導致數(shù)據(jù)丟失。

例如,對于一個可讀事件的套接字,應(yīng)該不斷調(diào)用 read()recv() 來讀取所有數(shù)據(jù),直到 read() 返回 EAGAINEWOULDBLOCK,表示數(shù)據(jù)已讀取完畢。

ssize_t bytes_read;
while ((bytes_read = read(sock_fd, buffer, sizeof(buffer))) > 0) {
    // 處理數(shù)據(jù)
}
if (bytes_read < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
    perror("read failed");
    // 錯誤處理
}

處理數(shù)據(jù)時避免阻塞

ET 模式通常與非阻塞 I/O 一起使用,因此處理事件時要特別小心。確保每次操作不會阻塞整個進程,避免應(yīng)用程序掛起。

合理選擇超時值

如果你的應(yīng)用程序不需要實時響應(yīng),也可以考慮使用超時等待(epoll_wait 的第四個參數(shù)設(shè)置為適當?shù)某瑫r值),這樣可以避免應(yīng)用程序因過于頻繁的調(diào)用 epoll_wait 而浪費 CPU 時間。

  • 代碼示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAX_EVENTS 10
#define PORT 8080
#define BUFFER_SIZE 1024

// 設(shè)置文件描述符為非阻塞
int set_nonblocking(int fd) {
    int flags = fcntl(fd, F_GETFL, 0);
    if (flags == -1) {
        perror("fcntl(F_GETFL)");
        return -1;
    }
    if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
        perror("fcntl(F_SETFL)");
        return -1;
    }
    return 0;
}

// 處理客戶端數(shù)據(jù)的函數(shù)
void handle_client_data(int client_fd) {
    char buffer[BUFFER_SIZE];
    ssize_t bytes_read = read(client_fd, buffer, sizeof(buffer));
    if (bytes_read == -1) {
        if (errno != EAGAIN && errno != EWOULDBLOCK) {
            perror("read failed");
            close(client_fd);
        }
    } else if (bytes_read == 0) {
        // 客戶端關(guān)閉連接
        printf("Client disconnected\n");
        close(client_fd);
    } else {
        // 處理讀取的數(shù)據(jù)
        buffer[bytes_read] = '\0';
        printf("Received data: %s\n", buffer);

        // 發(fā)送數(shù)據(jù)到客戶端
        ssize_t bytes_written = write(client_fd, buffer, bytes_read);
        if (bytes_written == -1) {
            perror("write failed");
            close(client_fd);
        }
    }
}

int main() {
    int server_fd, epoll_fd;
    struct sockaddr_in server_addr;
    struct epoll_event ev, events[MAX_EVENTS];

    // 創(chuàng)建監(jiān)聽套接字
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == -1) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 設(shè)置服務(wù)器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // 綁定套接字
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 監(jiān)聽連接
    if (listen(server_fd, 10) == -1) {
        perror("listen failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 創(chuàng)建 epoll 實例
    epoll_fd = epoll_create1(0);
    if (epoll_fd == -1) {
        perror("epoll_create1 failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 將服務(wù)器套接字加入 epoll 事件監(jiān)聽
    ev.events = EPOLLIN | EPOLLET;  // 監(jiān)聽可讀事件,采用邊緣觸發(fā)模式
    ev.data.fd = server_fd;
    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_fd, &ev) == -1) {
        perror("epoll_ctl failed");
        close(server_fd);
        close(epoll_fd);
        exit(EXIT_FAILURE);
    }

    // 主事件循環(huán)
    while (1) {
        int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
        if (num_events == -1) {
            perror("epoll_wait failed");
            break;
        }

        // 處理就緒事件
        for (int i = 0; i < num_events; i++) {
            if (events[i].data.fd == server_fd) {
                // 服務(wù)器套接字有連接請求
                int client_fd = accept(server_fd, NULL, NULL);
                if (client_fd == -1) {
                    perror("accept failed");
                    continue;
                }

                // 設(shè)置客戶端套接字為非阻塞
                if (set_nonblocking(client_fd) == -1) {
                    close(client_fd);
                    continue;
                }

                // 將客戶端套接字添加到 epoll 中
                ev.events = EPOLLIN | EPOLLET;  // 監(jiān)聽客戶端的可讀事件,采用邊緣觸發(fā)模式
                ev.data.fd = client_fd;
                if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_fd, &ev) == -1) {
                    perror("epoll_ctl: add client failed");
                    close(client_fd);
                    continue;
                }

                printf("New client connected\n");

            } else if (events[i].events & EPOLLIN) {
                // 客戶端有數(shù)據(jù)可讀
                handle_client_data(events[i].data.fd);
            }
        }
    }

    // 清理資源
    close(server_fd);
    close(epoll_fd);
    return 0;
}

原理分析:

epoll 是一種高效的 I/O 事件通知機制,它通過以下方式提高效率:

  1. 紅黑樹管理文件描述符:使用 epoll_ctl 系統(tǒng)調(diào)用將感興趣的 socket(或其他文件描述符)注冊到 epoll 實例中。這些描述符被存儲在一個內(nèi)部的紅黑樹結(jié)構(gòu)中,這使得添加、刪除和查找操作都非常高效。
  2. 就緒隊列記錄活動事件:當某個 socket 上有數(shù)據(jù)到達時,內(nèi)核會自動將該 socket 標記為就緒,并將其加入到一個就緒隊列中。這里并沒有使用回調(diào)函數(shù),而是依賴于內(nèi)核的通知機制。
  3. 事件通知而非輪詢:與 selectpoll 不同,epoll 使用的是事件驅(qū)動的通知機制。這意味著只有當有實際事件發(fā)生時(如可讀或可寫),epoll_wait 才會返回并告知應(yīng)用程序哪些 socket 已準備好進行 I/O 操作。這樣避免了對所有文件描述符的重復(fù)檢查,提高了效率。
  4. epoll_wait 獲取事件:應(yīng)用程序調(diào)用 epoll_wait 來等待事件的發(fā)生。一旦有事件發(fā)生,epoll_wait 就會返回一個包含所有就緒事件的列表,供應(yīng)用程序處理。

4.信號驅(qū)動式IO

信號驅(qū)動式IO是Linux提供的一種IO模型,通過信號通知應(yīng)用程序某個文件描述符的狀態(tài)發(fā)生變化,適用于需要非阻塞IO操作的場景。它利用信號機制將內(nèi)核的事件通知傳遞給用戶空間,使得程序無需主動倫旭即可對IO事件做出響應(yīng)。

4.1 工作原理

  1. 信號和信號處理:
  • 在信號驅(qū)動I/O中,當某個I/O事件(如數(shù)據(jù)準備好讀或?qū)懀┌l(fā)生時,內(nèi)核會向進程發(fā)送一個信號。進程通過信號處理函數(shù)來處理該事件。
  • 該信號通常是 SIGIO(I/O信號)或 SIGURG(緊急數(shù)據(jù)的信號)等。
  1. 非阻塞模式:
  • 為了使信號驅(qū)動I/O工作,通常需要將相關(guān)的套接字設(shè)置為非阻塞模式。這樣,I/O操作(如 recvsend)不會因為沒有數(shù)據(jù)而阻塞。
  • 一旦數(shù)據(jù)準備好,操作系統(tǒng)會發(fā)送 SIGIO 信號,通知進程可以進行讀取或?qū)懭搿?/li>
  1. 信號處理函數(shù):
  • 在信號觸發(fā)時,操作系統(tǒng)會中斷進程的正常執(zhí)行流程,并轉(zhuǎn)到預(yù)先注冊的信號處理函數(shù)中執(zhí)行。這使得信號驅(qū)動I/O成為一種異步機制。
  • 信號處理函數(shù)中通常會包含對 recvsend 等函數(shù)的調(diào)用,以便處理就緒的I/O數(shù)據(jù)。

4.2 為什么使用信號驅(qū)動IO

  1. **避免輪詢:**傳統(tǒng)的非阻塞I/O通常需要通過 select、pollepoll 等方式輪詢文件描述符,檢查是否有數(shù)據(jù)可以讀取。信號驅(qū)動I/O消除了這種輪詢機制,避免了CPU時間的浪費。
  2. **減少阻塞:**通過信號驅(qū)動I/O,應(yīng)用程序不再需要阻塞等待I/O事件發(fā)生,而是通過信號觸發(fā)事件,從而使得程序可以在等待I/O的同時執(zhí)行其他任務(wù)。
  3. **資源高效:**信號驅(qū)動I/O能夠?qū)崿F(xiàn)資源的高效利用,因為它允許應(yīng)用程序在I/O事件到達時立即處理,而不需要檢查文件描述符狀態(tài)。
  4. **適用于實時應(yīng)用:**對于一些需要及時響應(yīng)的實時應(yīng)用,信號驅(qū)動I/O提供了一種快速響應(yīng)數(shù)據(jù)的方式。

4.3 實現(xiàn)流程

信號驅(qū)動式I/O的核心思想是預(yù)先告知內(nèi)核當某個描述符準備發(fā)生某件事情(如數(shù)據(jù)到達)時發(fā)送一個信號(SIGIO)給進程。這使得進程可以在等待數(shù)據(jù)的過程中不被阻塞,只有在接收到SIGIO信號后才去處理I/O事件。程序需要按照如下步驟執(zhí)行:

  • 為內(nèi)核發(fā)送的通知信號安裝一個信號處理例程。默認情況下,這個通知信號為SIGIO
  • 設(shè)定文件符的屬主,也就是當文件描述符山可執(zhí)行IO時會接收通知信號的進程或進程組。通常我們讓調(diào)用進程成為屬主。設(shè)定屬主可通過fcntl()F_SETOWN操作來完成
fcntl(fd, F_SETOWN , pid);
  • 通過設(shè)定O_NONBLOCK標識使能非阻塞IO
  • 通過打開O_ASYNC標志使能信號驅(qū)動IO。這可以和上一步合并為一個操作,因為它們都需要用到fcntl()F_SETFL操作
flags = fcntl(fd, F_GETFL);  // get current flags
fcntl(fd, F_SETFL, flags | O_ASYNC | O_NONBLOCK);
  • 調(diào)用進程線程可以執(zhí)行其他任務(wù)了。當IO操作就緒時,內(nèi)核為進程發(fā)送一個信號,然后調(diào)用在第1步中安裝好的信號處理例程
  • 信號驅(qū)動IO提供的是邊緣觸發(fā)通知。這表示一旦進程被通知IO就緒,它就應(yīng)該盡可能的能多地執(zhí)行 I/O(例如盡可能多地讀取字節(jié))。假設(shè)文件描述符時非阻塞的,這表示需要在循環(huán)中執(zhí)行IO系統(tǒng)調(diào)用直到失敗位置,此時的錯誤碼為EAGAIN(再來一次)或者EWOULDBLOCK(期望阻塞)。

示例代碼及圖解:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>

#define PORT 8080
#define MAXLINE 1024

static int sockfd;  // 監(jiān)聽套接字
static struct sockaddr_in cli_addr;
static socklen_t clilen = sizeof(cli_addr);

// 信號處理函數(shù)
void do_sometime(int signal) {
    char buffer[MAXLINE] = {0};
    int len = recvfrom(sockfd, buffer, MAXLINE, 0, (struct sockaddr *)&cli_addr, (socklen_t*)&clilen);
    if (len > 0) {
        printf("收到客戶端消息: %s\n", buffer);
        strcat(buffer, "→[Msg]");
        sendto(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cli_addr, clilen);  // 回顯消息
    } else {
        printf("沒有收到數(shù)據(jù)或出現(xiàn)錯誤\n");
    }
}

int main(int argc, char const *argv[]) {
    // 創(chuàng)建套接字
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }
    
    // 注冊信號處理函數(shù)
    struct sigaction act;
    act.sa_handler = do_sometime;
    sigemptyset(&act.sa_mask);
    act.sa_flags = SA_RESTART;  // 重新啟動被信號中斷的系統(tǒng)調(diào)用
    sigaction(SIGIO, &act, NULL);

    // 創(chuàng)建并初始化地址結(jié)構(gòu)
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = INADDR_ANY;
    
    // 設(shè)置文件描述符的擁有者為當前進程
    fcntl(sockfd, F_SETOWN, getpid());
    int flags = fcntl(sockfd, F_GETFL, 0);
    // 啟用信號驅(qū)動模式 | 設(shè)置文件描述符為非阻塞模式
    fcntl(sockfd, F_SETFL, flags | O_ASYNC | O_NONBLOCK);
    
    // 綁定地址
    if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
        perror("bind failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    while (1)
        sleep(1);   // 等待信號

    close(sockfd);
    return 0;
}

異步IO通知的工作流程

  1. 注冊異步通知

在用戶空間,應(yīng)用程序通過 fcntl 系統(tǒng)調(diào)用來設(shè)置文件描述符的異步通知機制:

  • 設(shè)置 O_ASYNC 標志:使用 fcntl(fd, F_SETFL, flags | O_ASYNC) 來啟用異步通知。
  • 設(shè)置接收 SIGIO 信號的進程 ID:使用 fcntl(fd, F_SETOWN, getpid()) 來指定哪個進程應(yīng)該接收 SIGIO 信號,通知它可以進行IO操作了。
  1. 內(nèi)核空間處理

在內(nèi)核空間,驅(qū)動程序需要支持異步通知機制。具體步驟如下:

  • 管理 fasync_struct 隊列:使用 fasync_helper 函數(shù)來管理一個鏈表(隊列),該鏈表存儲了所有注冊了異步通知的進程信息。
  • 觸發(fā)事件:當某個事件發(fā)生時(如數(shù)據(jù)到達),驅(qū)動程序調(diào)用 kill_fasync 函數(shù)來通知所有注冊了異步通知的進程。
  1. 觸發(fā)事件

當驅(qū)動程序檢測到某個事件(如數(shù)據(jù)到達)時,它會調(diào)用 kill_fasync 函數(shù)來通知所有注冊了異步通知的進程。kill_fasync 函數(shù)會遍歷 fasync_struct 隊列,并向每個進程發(fā)送 SIGIO 信號。

  1. 處理信號

用戶空間的應(yīng)用程序收到 SIGIO 信號后,可以在其信號處理函數(shù)中執(zhí)行相應(yīng)的操作。例如,處理接收到的數(shù)據(jù)或進行其他必要的操作。

5.異步IO

異步IO(Asynchronous IO,AIO)是一種處理輸入/輸出操作的方式,它允許程序在發(fā)起IO操作后立即返回,而不是等待操作完成。

這種方式可以顯著提高應(yīng)用程序的并發(fā)性和吞吐量,特別是在IO密集型的應(yīng)用場景中。下面將從多個角度深入探討異步IO的概念,實現(xiàn)機制及其應(yīng)用場景。

5.1 異步I/O的基本概念

5.1.1 同步 vs 異步

  • 同步I/O:當一個進程發(fā)起I/O請求時,它會被阻塞直到該請求完成。這意味著在此期間,進程不能執(zhí)行其他任務(wù)。
  • 異步I/O:當一個進程發(fā)起I/O請求時,它可以立即繼續(xù)執(zhí)行其他任務(wù),而不需要等待I/O操作完成。一旦I/O操作完成,系統(tǒng)會通過某種方式通知進程結(jié)果。

5.1.2 阻塞 vs 非阻塞

  • 阻塞I/O:如果文件描述符未準備好進行讀寫操作,調(diào)用將被掛起,直到操作準備好為止。
  • 非阻塞I/O:如果文件描述符未準備好進行讀寫操作,調(diào)用會立即返回一個錯誤碼,允許進程嘗試其他操作或稍后再試。

雖然“異步”和“非阻塞”聽起來相似,但它們實際上是不同的概念。異步I/O指的是整個操作由內(nèi)核而非用戶進程來完成,并且在完成后通知用戶進程;而非阻塞I/O則是指用戶進程可以在沒有數(shù)據(jù)可讀/寫時不被阻塞,但仍需主動輪詢檢查狀態(tài)

5.1.3 異步IO的工作原理

異步 I/O 的實現(xiàn)通常依賴于以下幾個關(guān)鍵組件:

事件通知機制:內(nèi)核提供一種機制,能夠在 I/O 操作完成時通知應(yīng)用程序。常見的事件通知機制有:

  • 信號通知:如 SIGIO。
  • 回調(diào)通知:如 io_uringAIO 中的回調(diào)機制。
  • 輪詢機制:應(yīng)用程序主動檢查 I/O 狀態(tài),類似于 select()poll()。

文件描述符和 I/O 操作:文件描述符是 I/O 操作的基礎(chǔ)。內(nèi)核會根據(jù)文件描述符的狀態(tài)來決定 I/O 操作是否可以完成,并在完成時通知程序。

非阻塞模式:異步 I/O 需要文件描述符處于非阻塞模式。通過設(shè)置 O_NONBLOCK 或其他標志,程序可以立即返回,而不是等待 I/O 完成。

POSIX AIO 示例:

POSIX AIO 是 Linux 提供的一套接口,用于執(zhí)行異步 I/O 操作。

在異步 I/O 中,程序可以發(fā)起 I/O 操作(如 aio_readaio_write),然后繼續(xù)執(zhí)行其他任務(wù),而不是等待 I/O 操作完成。

當 I/O 操作完成時,程序可以通過輪詢、信號或回調(diào)來獲取結(jié)果。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <aio.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    // 創(chuàng)建 TCP 套接字
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);

    // 設(shè)置服務(wù)器地址結(jié)構(gòu)
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // 綁定地址
    bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));

    // 監(jiān)聽連接
    listen(server_fd, 5);

    printf("Server listening on port %d...\n", PORT);

    // 接受客戶端連接
    struct sockaddr_in client_addr;
    socklen_t client_len = sizeof(client_addr);
    int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len);

    // 設(shè)置異步讀操作
    char buffer[BUFFER_SIZE];
    struct aiocb aio_read_cb;
    memset(&aio_read_cb, 0, sizeof(struct aiocb));
    aio_read_cb.aio_fildes = client_fd;
    aio_read_cb.aio_buf = buffer;
    aio_read_cb.aio_nbytes = sizeof(buffer);
    aio_read_cb.aio_offset = 0;

    // 發(fā)起異步讀操作
    aio_read(&aio_read_cb);

    // 等待讀操作完成
    while (aio_error(&aio_read_cb) == EINPROGRESS) {
        // 可以執(zhí)行其他操作
        usleep(10000);  // 等待10ms
    }

    // 讀取完成,獲取結(jié)果
    int bytes_read = aio_return(&aio_read_cb);

    printf("Received message: %s\n", buffer);

    // 發(fā)送數(shù)據(jù)到客戶端
    send(client_fd, buffer, bytes_read, 0);

    close(client_fd);
    close(server_fd);
    return 0;
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

lutube在线成人免费看| 三上悠亚和黑人665番号| 亚洲高清一区二区三区视频在线| 日韩成人综艺在线播放| 午夜精彩视频免费一区| 日本一区二区三区免费小视频| 色爱av一区二区三区| 亚洲精品国品乱码久久久久| 国产97视频在线精品| 国产黑丝高跟鞋视频在线播放| 国产成人一区二区三区电影网站| 中文字幕人妻三级在线观看| 天天操夜夜骑日日摸| 亚洲综合色在线免费观看| 视频久久久久久久人妻| 精品欧美一区二区vr在线观看| 日本成人不卡一区二区| 91欧美在线免费观看| 91精品免费久久久久久| 久久香蕉国产免费天天| 亚洲蜜臀av一区二区三区九色| 天天日天天鲁天天操| 日韩亚洲高清在线观看| 老鸭窝日韩精品视频观看| 搡老熟女一区二区在线观看| av网址在线播放大全| 色综合久久无码中文字幕波多| 亚洲一区自拍高清免费视频| 中出中文字幕在线观看| 亚洲精品国产在线电影| 少妇高潮无套内谢麻豆| 在线免费91激情四射 | 国产性生活中老年人视频网站| 精品一区二区三四区| 一区二区三区四区视频| 亚洲码av无色中文| 亚洲免费va在线播放| 国产精品久久9999| 精品成人啪啪18免费蜜臀| 免费69视频在线看| 久久久制服丝袜中文字幕| 38av一区二区三区| 亚洲精品在线资源站| 免费在线观看污污视频网站| 99精品免费久久久久久久久a| 亚洲欧美清纯唯美另类| 在线免费视频 自拍| 亚洲精品 日韩电影| 日本av熟女在线视频| 日韩亚洲高清在线观看| 北条麻妃av在线免费观看| 视频 一区二区在线观看| 欧美亚洲自偷自拍 在线| 国产欧美精品免费观看视频| 韩国黄色一级二级三级| 2021久久免费视频| 亚洲视频在线视频看视频在线| 中文字母永久播放1区2区3区| 视频 一区二区在线观看| 午夜免费体验区在线观看| 国产剧情演绎系列丝袜高跟| 国产精品久久久久网| 91 亚洲视频在线观看| 国产精品sm调教视频| 青青色国产视频在线| 五十路丰满人妻熟妇| 国产欧美日韩在线观看不卡| 99精品亚洲av无码国产另类| 喷水视频在线观看这里只有精品| 亚洲码av无色中文| 中出中文字幕在线观看| 18禁无翼鸟成人在线| 熟女俱乐部一二三区| 免费男阳茎伸入女阳道视频 | 999久久久久999| 中文字幕人妻一区二区视频| 偷拍3456eee| 动色av一区二区三区| 欧美黑人与人妻精品| 欧美女同性恋免费a| h国产小视频福利在线观看| 搞黄色在线免费观看| 一区二区麻豆传媒黄片| av男人天堂狠狠干| 91精品国产观看免费| 国产aⅴ一线在线观看| 日本av高清免费网站| 11久久久久久久久久久| sw137 中文字幕 在线| 99re6热在线精品| 中文字幕一区二区亚洲一区| 玖玖一区二区在线观看| 偷拍自拍亚洲美腿丝袜| 久久三久久三久久三久久| 黄色视频成年人免费观看| 老司机99精品视频在线观看| 日韩欧美高清免费在线| 亚洲熟妇久久无码精品| 国产av福利网址大全| 99热久久极品热亚洲| 在线不卡成人黄色精品| 嫩草aⅴ一区二区三区| 亚洲图库另类图片区| 日韩精品二区一区久久| 日本裸体熟妇区二区欧美| 一区二区三区日本伦理| 亚洲精品亚洲人成在线导航| 日韩精品中文字幕福利| 在线免费观看日本片| 99精品免费久久久久久久久a| 欧美成人小视频在线免费看| 九一传媒制片厂视频在线免费观看| mm131美女午夜爽爽爽| 最新欧美一二三视频| 国产精品午夜国产小视频| 强行扒开双腿猛烈进入免费版| 午夜激情久久不卡一区二区| 天天干天天插天天谢| 57pao国产一区二区| 精内国产乱码久久久久久| 都市家庭人妻激情自拍视频| 经典国语激情内射视频| 全国亚洲男人的天堂| 999九九久久久精品| 免费在线观看污污视频网站| 老师啊太大了啊啊啊尻视频| 欧美viboss性丰满| 中国熟女@视频91| 丁香花免费在线观看中文字幕| 成年女人免费播放视频| 91精品视频在线观看免费| 欧亚日韩一区二区三区观看视频| 黄色大片男人操女人逼| 日本一区美女福利视频| 女蜜桃臀紧身瑜伽裤| 国产福利小视频二区| 午夜av一区二区三区| 成人sm视频在线观看| 欧洲黄页网免费观看| 人妻熟女中文字幕aⅴ在线| 91免费黄片可看视频| 一区二区三区四区五区性感视频 | 天天插天天狠天天操| 亚洲欧美激情国产综合久久久| 国产免费高清视频视频| 狠狠躁夜夜躁人人爽天天天天97| 亚洲精品亚洲人成在线导航| 40道精品招牌菜特色| 国产精品一二三不卡带免费视频| 最新激情中文字幕视频| 午夜精品福利一区二区三区p | 黄色三级网站免费下载| 日韩欧美高清免费在线 | 日韩精品中文字幕在线| 日日操夜夜撸天天干| 亚洲av日韩精品久久久| 日本xx片在线观看| 国产大鸡巴大鸡巴操小骚逼小骚逼 | 久久久91蜜桃精品ad| 天天日天天天天天天天天天天| 伊人综合aⅴ在线网| 都市家庭人妻激情自拍视频| 亚洲av琪琪男人的天堂| 成人国产小视频在线观看| 特级无码毛片免费视频播放| 在线观看视频 你懂的| 亚洲人一区二区中文字幕| 中文字幕高清在线免费播放| 欧美亚洲免费视频观看| 美味人妻2在线播放| 黑人性生活视频免费看| 在线国产精品一区二区三区| 好太好爽好想要免费| av资源中文字幕在线观看| 大尺度激情四射网站| 久久久麻豆精亚洲av麻花| 干逼又爽又黄又免费的视频| 欧美天堂av无线av欧美| 又黄又刺激的午夜小视频| 99热久久这里只有精品| 中文字幕+中文字幕| av在线资源中文字幕| 成人高清在线观看视频| 日本在线一区二区不卡视频| 三级黄色亚洲成人av| 欧美区一区二区三视频| 国产美女一区在线观看| 午夜精品福利一区二区三区p | 日本美女成人在线视频| 后入美女人妻高清在线| 国产麻豆剧果冻传媒app| caoporn蜜桃视频| 欧美色呦呦最新网址| 人人妻人人人操人人人爽| 亚洲av无乱一区二区三区性色| 亚洲乱码中文字幕在线| 小泽玛利亚视频在线观看| 97a片免费在线观看| 久久永久免费精品人妻专区| 国产性色生活片毛片春晓精品| 在线播放国产黄色av| 无套猛戳丰满少妇人妻| 亚洲国产欧美一区二区三区…| 午夜激情高清在线观看| 中文字幕一区的人妻欧美日韩| 免费观看丰满少妇做受| 国产无遮挡裸体免费直播视频| 日本黄色特一级视频| 久久综合老鸭窝色综合久久| 97a片免费在线观看| 1024久久国产精品| 国产一区成人在线观看视频| 女同久久精品秋霞网| 欧美特色aaa大片| 成人久久精品一区二区三区| 亚洲乱码中文字幕在线| 香港一级特黄大片在线播放| 天堂v男人视频在线观看| 日韩欧美在线观看不卡一区二区| 久久www免费人成一看片| 岛国黄色大片在线观看| 3D动漫精品啪啪一区二区下载| 最后99天全集在线观看| 全国亚洲男人的天堂| gogo国模私拍视频| 美女张开腿让男生操在线看| 中文字幕AV在线免费看 | 婷婷色中文亚洲网68| 韩国爱爱视频中文字幕| 偷拍自拍亚洲美腿丝袜| 日日摸夜夜添夜夜添毛片性色av| 99视频精品全部15| 国产真实乱子伦a视频| 高清成人av一区三区| 亚洲美女高潮喷浆视频| 日本少妇人妻xxxxx18| 亚洲1区2区3区精华液| 免费看美女脱光衣服的视频| 夫妻在线观看视频91| 国产成人精品福利短视频| av久久精品北条麻妃av观看| 色吉吉影音天天干天天操| 天天想要天天操天天干| 四虎永久在线精品免费区二区| 国产麻豆剧果冻传媒app| 日本少妇人妻xxxxx18| 91久久综合男人天堂| 中文字幕奴隷色的舞台50| 五月精品丁香久久久久福利社| 老司机免费福利视频网| 含骚鸡巴玩逼逼视频| 福利午夜视频在线观看| av手机免费在线观看高潮| 午夜精品一区二区三区福利视频| 亚洲老熟妇日本老妇| 午夜精品亚洲精品五月色| 在线播放一区二区三区Av无码| 最新的中文字幕 亚洲| 综合精品久久久久97| 可以免费看的www视频你懂的| 欧美一级色视频美日韩| 欧美黑人性暴力猛交喷水| 黄页网视频在线免费观看| 日本韩国亚洲综合日韩欧美国产| 天天摸天天干天天操科普| 熟女少妇激情五十路| 蜜臀av久久久久蜜臀av麻豆| 91九色国产porny蝌蚪| 99久久成人日韩欧美精品| 午夜精品九一唐人麻豆嫩草成人| 国产成人精品av网站| 亚洲精品乱码久久久本| 天天综合天天综合天天网| 午夜大尺度无码福利视频| 日本人妻精品久久久久久| 自拍偷拍日韩欧美一区二区| 亚洲男人的天堂a在线| 国产高清精品一区二区三区| 国产真实乱子伦a视频| 日韩欧美一级黄片亚洲| 麻豆精品成人免费视频| 亚洲av日韩av网站| 99精品国产aⅴ在线观看| 精品久久久久久高潮| 亚洲av男人的天堂你懂的| 57pao国产一区二区| 蝴蝶伊人久久中文娱乐网| 国产91精品拍在线观看| 亚洲av无女神免非久久| 精品一区二区三区午夜| 久久久久久国产精品| 亚洲福利精品福利精品福利| 亚国产成人精品久久久| 亚洲综合乱码一区二区| 国产一区二区久久久裸臀| 成人精品视频99第一页| 国产精品一区二区久久久av| 动漫美女的小穴视频| 一色桃子人妻一区二区三区| 亚洲一区二区三区久久受| 婷婷午夜国产精品久久久| 日韩美女精品视频在线观看网站| 视频一区 视频二区 视频| 久久艹在线观看视频| 日本美女成人在线视频| 91啪国自产中文字幕在线| 中文字幕第三十八页久久| 丝袜亚洲另类欧美变态| 人人人妻人人澡人人| 91免费福利网91麻豆国产精品| 福利午夜视频在线合集| 黄色三级网站免费下载| 超黄超污网站在线观看| 日韩中文字幕在线播放第二页| 91老熟女连续高潮对白| 精品国产污污免费网站入口自| 国产精品视频一区在线播放| 成人蜜桃美臀九一一区二区三区| 国产午夜无码福利在线看| 丝袜美腿欧美另类 中文字幕| 一区二区在线视频中文字幕 | 国产片免费观看在线观看| 97国产在线av精品| 成人蜜桃美臀九一一区二区三区| 欧美黑人性猛交xxxxⅹooo| 又粗又硬又猛又黄免费30| 97小视频人妻一区二区| 日韩一区二区电国产精品| 超黄超污网站在线观看| 国产精品免费不卡av| 欧美日本在线视频一区| 伊人综合免费在线视频| 色狠狠av线不卡香蕉一区二区| 中国黄片视频一区91| 婷婷久久久综合中文字幕| 亚洲精品成人网久久久久久小说| 福利视频网久久91| 宅男噜噜噜666免费观看| 亚洲精品乱码久久久久久密桃明| 欧美3p在线观看一区二区三区| 日本www中文字幕| 97精品人妻一区二区三区精品| 在线视频这里只有精品自拍| 日本少妇在线视频大香蕉在线观看| 国产精品熟女久久久久浪潮| 一个人免费在线观看ww视频| 夜女神免费福利视频| 色爱av一区二区三区| 91九色porny蝌蚪国产成人| 亚洲综合另类欧美久久| 521精品视频在线观看| 久草视频中文字幕在线观看| 午夜毛片不卡在线看| 欧美女同性恋免费a| 这里只有精品双飞在线播放| 国产午夜激情福利小视频在线| 伊人开心婷婷国产av| 午夜久久久久久久99| 美女张开腿让男生操在线看| 亚洲av自拍偷拍综合| 激情人妻校园春色亚洲欧美 | 久久精品久久精品亚洲人| 国产高清女主播在线| 99精品国自产在线人| 涩爱综合久久五月蜜臀| 热99re69精品8在线播放| 日本免费一级黄色录像| 国产福利小视频二区| 超碰中文字幕免费观看| 亚洲超碰97人人做人人爱| 一区二区视频在线观看视频在线| 亚洲护士一区二区三区| 粉嫩av蜜乳av蜜臀| 偷拍美女一区二区三区| japanese五十路熟女熟妇| 日本免费午夜视频网站| 久久三久久三久久三久久| 国产伊人免费在线播放| 国产又粗又黄又硬又爽| 精品乱子伦一区二区三区免费播| 国产1区,2区,3区| 久草视频在线一区二区三区资源站 | 亚洲粉嫩av一区二区三区| japanese日本熟妇另类| 天天干天天操天天扣| av手机在线观播放网站| 亚洲美女美妇久久字幕组| 欧美精品中文字幕久久二区| 国产亚洲精品品视频在线| 偷青青国产精品青青在线观看| 中文字幕欧美日韩射射一| 久草视频福利在线首页| 国产在线拍揄自揄视频网站| 免费看国产av网站| 午夜精品亚洲精品五月色| 久久亚洲天堂中文对白| 老司机午夜精品视频资源| 91色网站免费在线观看| 国产av国片精品一区二区| 在线观看911精品国产 | 亚洲 中文 自拍 另类 欧美| 欧美精品亚洲精品日韩在线| 社区自拍揄拍尻屁你懂的| 开心 色 六月 婷婷| jul—619中文字幕在线| 可以在线观看的av中文字幕| 色狠狠av线不卡香蕉一区二区| 久久久91蜜桃精品ad| 美女张开两腿让男人桶av| 天天日天天添天天爽| 欧美黑人与人妻精品| 开心 色 六月 婷婷| aaa久久久久久久久| 天天插天天色天天日| 老熟妇凹凸淫老妇女av在线观看| 亚洲天堂第一页中文字幕| 男生舔女生逼逼的视频| 鸡巴操逼一级黄色气| aiss午夜免费视频| wwwxxx一级黄色片| 国产自拍黄片在线观看| 国产福利小视频大全| 国产精品人久久久久久| 亚洲 清纯 国产com| sejizz在线视频| 自拍偷拍一区二区三区图片| 黄色录像鸡巴插进去| 99精品免费久久久久久久久a| 日本五十路熟新垣里子| 77久久久久国产精产品| 成人高潮aa毛片免费| 最近中文字幕国产在线| 国产视频网站一区二区三区 | 国产内射中出在线观看| 精品国产成人亚洲午夜| 黄色视频在线观看高清无码| 亚洲免费成人a v| 少妇人妻二三区视频| 女同性ⅹxx女同hd| 丝袜亚洲另类欧美变态| 色婷婷综合激情五月免费观看| 好了av中文字幕在线| 在线观看日韩激情视频| 国产日韩一区二区在线看| sspd152中文字幕在线| 自拍偷拍亚洲欧美在线视频| 黑人进入丰满少妇视频| 中文字幕 人妻精品| 亚洲欧美激情中文字幕| 欧美80老妇人性视频| 伊人综合aⅴ在线网| 色综合久久五月色婷婷综合| 一区二区三区四区视频在线播放| 粉嫩小穴流水视频在线观看| 100%美女蜜桃视频| 亚洲欧美国产综合777| 大鸡吧插入女阴道黄色片| 天天干天天操天天插天天日| 农村胖女人操逼视频| 日韩精品中文字幕福利| 亚洲女人的天堂av| 又大又湿又爽又紧A视频| 日韩美女搞黄视频免费| 中文字幕一区二 区二三区四区 | 欧洲日韩亚洲一区二区三区| 一区二区三区久久久91| 亚洲av香蕉一区区二区三区犇| 国产97视频在线精品| 亚洲免费va在线播放| 久草电影免费在线观看| 亚洲 中文 自拍 无码| 一区二区视频视频视频| 日本最新一二三区不卡在线| 亚洲福利午夜久久久精品电影网| 欧美成人综合色在线噜噜| 97a片免费在线观看| 成人免费做爰高潮视频| 在线观看欧美黄片一区二区三区| 最新的中文字幕 亚洲| 最新的中文字幕 亚洲| 日比视频老公慢点好舒服啊| 亚洲国产在线精品国偷产拍| 国产刺激激情美女网站| 亚洲天堂成人在线观看视频网站| 在线免费91激情四射| 亚洲av琪琪男人的天堂| 亚洲一区二区激情在线| 亚洲最大黄 嗯色 操 啊| 亚洲精品乱码久久久本| 中文字幕在线免费第一页| 涩爱综合久久五月蜜臀| 99的爱精品免费视频| 午夜免费体验区在线观看| 婷婷午夜国产精品久久久| 日韩av中文在线免费观看| 亚洲2021av天堂| 中文字幕av男人天堂| 精品视频中文字幕在线播放| 最新97国产在线视频| 韩国亚洲欧美超一级在线播放视频| 男人在床上插女人视频| 超碰公开大香蕉97| 99亚洲美女一区二区三区| 亚洲人妻30pwc| AV无码一区二区三区不卡| 97人妻总资源视频| 自拍偷拍亚洲另类色图| eeuss鲁片一区二区三区| 青青青视频自偷自拍38碰| 大鸡吧插逼逼视频免费看| 日韩av有码一区二区三区4 | 色呦呦视频在线观看视频| 视频二区在线视频观看| 天天操天天操天天碰| 91破解版永久免费| 国产一级麻豆精品免费| 视频一区 二区 三区 综合| 精品亚洲在线免费观看| 色哟哟国产精品入口| 一区二区麻豆传媒黄片| 久久久久久久久久一区二区三区| 人妻另类专区欧美制服| 521精品视频在线观看| 亚洲国产中文字幕啊啊啊不行了| 91老熟女连续高潮对白| 国内资源最丰富的网站| 热99re69精品8在线播放| 中英文字幕av一区| 色哟哟在线网站入口| 老有所依在线观看完整版 | 亚洲av色图18p| 毛片一级完整版免费| 亚洲图片偷拍自拍区| brazzers欧熟精品系列| 黑人性生活视频免费看| 天天摸天天亲天天舔天天操天天爽| 国产精品黄大片在线播放| 秋霞午夜av福利经典影视| 大屁股熟女一区二区三区| 999九九久久久精品| 亚洲另类图片蜜臀av| 直接能看的国产av| 黄色片一级美女黄色片| 国产av一区2区3区| 国产精品福利小视频a| 在线观看视频污一区| 国产变态另类在线观看| 婷婷激情四射在线观看视频| 国产麻豆乱子伦午夜视频观看| 91快播视频在线观看| 欧美日韩一区二区电影在线观看| 亚洲区欧美区另类最新章节| 久久精品美女免费视频| 超级碰碰在线视频免费观看| 91色九色porny| av网址在线播放大全| 绝色少妇高潮3在线观看| 中文字幕中文字幕 亚洲国产| 欧美成人小视频在线免费看| 91精品资源免费观看| 精品91自产拍在线观看一区| 18禁无翼鸟成人在线| av资源中文字幕在线观看| 亚洲人妻30pwc| 亚洲精品在线资源站| 99婷婷在线观看视频| 2o22av在线视频| 日韩精品啪啪视频一道免费| 精品国产在线手机在线| 中文字幕一区二区人妻电影冢本 | 天天操天天干天天插| 最新中文字幕免费视频| 亚洲伊人久久精品影院一美女洗澡| 国产成人精品福利短视频| av高潮迭起在线观看| 中文亚洲欧美日韩无线码| 中文字幕高清免费在线人妻| 欧美成一区二区三区四区| 亚洲男人的天堂a在线| 亚洲欧美精品综合图片小说| 欧美亚洲一二三区蜜臀| 亚洲的电影一区二区三区| 视频啪啪啪免费观看| 国产精品人妻一区二区三区网站 | 亚洲国产美女一区二区三区软件| 日日夜夜狠狠干视频| 91久久人澡人人添人人爽乱| 亚洲欧美一卡二卡三卡| 免费黄页网站4188| 五十路老熟女码av| 亚洲中文精品字幕在线观看| 污污小视频91在线观看| 91精品激情五月婷婷在线| 在线制服丝袜中文字幕| 亚洲美女美妇久久字幕组| 97瑟瑟超碰在线香蕉| 久久一区二区三区人妻欧美| 班长撕开乳罩揉我胸好爽| 一区二区三区另类在线| 成人午夜电影在线观看 久久| 五十路av熟女松本翔子| 天天日天天鲁天天操| 92福利视频午夜1000看 | 欧美专区第八页一区在线播放| wwwxxx一级黄色片| 97资源人妻免费在线视频| 亚洲va天堂va国产va久| 婷婷激情四射在线观看视频| 亚洲区美熟妇久久久久| 免费在线观看视频啪啪| 亚洲中文精品人人免费| 国产剧情演绎系列丝袜高跟| 中文字幕亚洲中文字幕| 521精品视频在线观看| 青青草国内在线视频精选| 欧美黄片精彩在线免费观看| 亚洲人人妻一区二区三区| 视频久久久久久久人妻| 中文字幕 码 在线视频| 天天操天天污天天射| 亚洲国产精品免费在线观看| 日韩近亲视频在线观看| 93精品视频在线观看| 日本av在线一区二区三区| 亚洲图片欧美校园春色 | 亚洲1区2区3区精华液| 天码人妻一区二区三区在线看| 国产a级毛久久久久精品| 成人av中文字幕一区| 经典av尤物一区二区| 欧美成一区二区三区四区| 亚洲午夜福利中文乱码字幕| 国产超码片内射在线| 久久这里只有精彩视频免费| 岛国av高清在线成人在线| 成人国产影院在线观看| 亚洲av自拍天堂网| 日本午夜久久女同精女女| 国产美女精品福利在线| 国产亚州色婷婷久久99精品| 三级等保密码要求条款| 91色秘乱一区二区三区| 午夜在线观看一区视频| 亚洲国产第一页在线观看| 亚洲日本一区二区久久久精品| 综合一区二区三区蜜臀| 女生自摸在线观看一区二区三区| 免费一级黄色av网站| yy96视频在线观看| 亚洲欧美一区二区三区爱爱动图| 亚洲国产欧美一区二区丝袜黑人| 欧美亚洲一二三区蜜臀| 国产精品视频资源在线播放| 欧美激情精品在线观看| 加勒比视频在线免费观看| 爱有来生高清在线中文字幕| 亚洲美女高潮喷浆视频| aiss午夜免费视频| 午夜美女少妇福利视频| 中文字日产幕乱六区蜜桃| 国产揄拍高清国内精品对白| 日本女人一级免费片| 国产福利小视频免费观看| sw137 中文字幕 在线| 超pen在线观看视频公开97| 国产精品福利小视频a| 伊人情人综合成人久久网小说| 自拍偷拍亚洲精品第2页| 国产精品三级三级三级| 88成人免费av网站| 久久久91蜜桃精品ad| 天美传媒mv视频在线观看| 大鸡巴插入美女黑黑的阴毛| 国产日韩av一区二区在线| 姐姐的朋友2在线观看中文字幕| 人妻丝袜榨强中文字幕| 搡老妇人老女人老熟女| 黄色无码鸡吧操逼视频| 夜色福利视频在线观看| 天天干天天啪天天舔| 国产欧美精品不卡在线| 日韩欧美一级精品在线观看| av无限看熟女人妻另类av| 红桃av成人在线观看| 又粗又长 明星操逼小视频| 欧美专区日韩专区国产专区| 日日夜夜精品一二三| 亚洲专区激情在线观看视频| 最新国产精品拍在线观看| 91久久精品色伊人6882| 久草极品美女视频在线观看| 国产精品黄页网站视频| av网站色偷偷婷婷网男人的天堂| 激情综合治理六月婷婷| 四川五十路熟女av| 国产三级影院在线观看| 国产精品自拍偷拍a| 国产一区二区火爆视频 | 极品丝袜一区二区三区| 亚洲视频在线观看高清| 免费看国产av网站| 国产一区自拍黄视频免费观看| 日韩精品中文字幕福利| 欧美天堂av无线av欧美| 日本在线一区二区不卡视频| 国产实拍勾搭女技师av在线| 天天日夜夜操天天摸| 91麻豆精品久久久久| 日韩影片一区二区三区不卡免费| 亚洲一区二区人妻av| 国产精品一区二区三区蜜臀av| 欧美日本国产自视大全| 啪啪啪啪啪啪啪免费视频| 麻豆性色视频在线观看| 青青青国产免费视频| gay gay男男瑟瑟在线网站| 狠狠躁狠狠爱网站视频| 国产乱子伦一二三区| 亚洲一区二区三区精品乱码| 国产一线二线三线的区别在哪| 都市激情校园春色狠狠| 亚洲av日韩av第一区二区三区| 蜜臀av久久久久久久| 91 亚洲视频在线观看| 一区二区三区 自拍偷拍| 国产chinesehd精品麻豆| 成人18禁网站在线播放| 国产日本精品久久久久久久| 国产精品一区二区三区蜜臀av| 亚洲第一黄色在线观看| 瑟瑟视频在线观看免费视频| 成人蜜臀午夜久久一区| 视频二区在线视频观看| 日韩av免费观看一区| 香港一级特黄大片在线播放| 日本一二三区不卡无| 色噜噜噜噜18禁止观看| 日韩欧美一级aa大片| 偷拍自拍视频图片免费| 自拍偷拍亚洲精品第2页| 制服丝袜在线人妻中文字幕| 日韩三级电影华丽的外出| 国产 在线 免费 精品| 中文字幕免费在线免费| 超碰中文字幕免费观看| 黄片色呦呦视频免费看| 国产黄色a级三级三级三级| 大鸡巴插入美女黑黑的阴毛| 天堂女人av一区二区| av破解版在线观看| 黄色中文字幕在线播放| 国产丰满熟女成人视频| 日韩欧美高清免费在线| 日辽宁老肥女在线观看视频| 中国视频一区二区三区| 天美传媒mv视频在线观看| 欧美精产国品一二三区| 熟女人妻三十路四十路人妻斩| 偷拍自拍 中文字幕| 欧美视频综合第一页| 成熟熟女国产精品一区| 亚洲欧美人精品高清| 成人30分钟免费视频| 亚洲日产av一区二区在线| 亚洲va欧美va人人爽3p| 亚洲精品ww久久久久久| 骚逼被大屌狂草视频免费看| 欧美黑人巨大性xxxxx猛交| 欧美亚洲国产成人免费在线| 一区二区久久成人网| 久草免费人妻视频在线| 特大黑人巨大xxxx| 婷婷六月天中文字幕| 女同性ⅹxx女同h偷拍| 天堂女人av一区二区| 亚洲综合色在线免费观看| 国产一区自拍黄视频免费观看| 亚洲人成精品久久久久久久| 在线观看欧美黄片一区二区三区 | 一区二区久久成人网| 熟女91pooyn熟女| 男人的天堂一区二区在线观看| 91高清成人在线视频| 亚洲综合在线视频可播放| 91‖亚洲‖国产熟女| 天天日天天摸天天爱| 天天干狠狠干天天操| 天天日天天爽天天爽| 2018在线福利视频| 精品人妻伦一二三区久| av天堂中文免费在线| 66久久久久久久久久久| 亚洲自拍偷拍精品网| 夜夜嗨av蜜臀av| 一区二区久久成人网| 国产伦精品一区二区三区竹菊| 97人妻无码AV碰碰视频| 91精品综合久久久久3d动漫| 欧美日韩v中文在线| 2022国产精品视频| 人妻另类专区欧美制服| 青青青爽视频在线播放| 2021国产一区二区| 色97视频在线播放| 成人性黑人一级av| 91av精品视频在线| 国产av一区2区3区| 夜夜嗨av一区二区三区中文字幕| 精品一区二区三区在线观看| 清纯美女在线观看国产| 大胆亚洲av日韩av| 9色精品视频在线观看| 日本精品美女在线观看| 国产精品自拍在线视频| 天天日天天透天天操| 欧美综合婷婷欧美综合| 亚洲av第国产精品| 亚洲午夜高清在线观看| 中文字幕一区二 区二三区四区| 91精品激情五月婷婷在线| 91国内精品自线在拍白富美| 97黄网站在线观看| 和邻居少妇愉情中文字幕| 国产精品中文av在线播放| 中文字幕午夜免费福利视频| 国产普通话插插视频| 国产黄网站在线观看播放| 91精品综合久久久久3d动漫| 啪啪啪啪啪啪啪啪啪啪黄色| 日韩欧美一级精品在线观看| 一本久久精品一区二区| 桃色视频在线观看一区二区| 99人妻视频免费在线| 欧美 亚洲 另类综合| 福利在线视频网址导航 | 538精品在线观看视频| 人人爱人人妻人人澡39| 91精品一区二区三区站长推荐| 沈阳熟妇28厘米大战黑人| 国产亚洲精品视频合集| asmr福利视频在线观看| 中国无遮挡白丝袜二区精品| 2020久久躁狠狠躁夜夜躁| 日韩av有码一区二区三区4| 欧美视频中文一区二区三区| 国产日本欧美亚洲精品视| 欧美aa一级一区三区四区| 日本高清撒尿pissing| 精品黑人巨大在线一区| 亚洲人人妻一区二区三区| av乱码一区二区三区| 香蕉av影视在线观看| 狠狠躁夜夜躁人人爽天天久天啪| 大鸡八强奸视频在线观看| 婷婷久久一区二区字幕网址你懂得| 在线观看免费av网址大全| 亚洲自拍偷拍综合色| 免费在线看的黄片视频| 午夜精品一区二区三区更新| 国产精品自拍视频大全| 欧美熟妇一区二区三区仙踪林| 久久精品美女免费视频| 亚洲欧美日韩视频免费观看| 888欧美视频在线| 日韩精品激情在线观看| 又大又湿又爽又紧A视频| 亚洲国产中文字幕啊啊啊不行了| 欧美第一页在线免费观看视频| 色伦色伦777国产精品| 精彩视频99免费在线| 操人妻嗷嗷叫视频一区二区| 干逼又爽又黄又免费的视频| 亚洲av第国产精品| 亚洲图库另类图片区| 欧美亚洲少妇福利视频| 国产精品伦理片一区二区| 无套猛戳丰满少妇人妻| 亚洲欧美综合另类13p| 一区二区三区四区视频| 天天操,天天干,天天射| 自拍偷拍亚洲欧美在线视频| 3337p日本欧洲大胆色噜噜| 成年人黄色片免费网站| 一区二区久久成人网| 国产精品免费不卡av| 亚洲精品ww久久久久久| av手机在线免费观看日韩av| 大香蕉伊人中文字幕| 自拍偷拍日韩欧美亚洲| 蜜桃色婷婷久久久福利在线| 亚洲一区二区久久久人妻| 中文字幕欧美日韩射射一| 国产视频网站一区二区三区 | 国产熟妇一区二区三区av | 中国黄色av一级片| 中文字幕一区的人妻欧美日韩| 大鸡巴操娇小玲珑的女孩逼| 久久三久久三久久三久久| 孕妇奶水仑乱A级毛片免费看| 第一福利视频在线观看| 57pao国产一区二区| 亚洲免费福利一区二区三区| 日本裸体熟妇区二区欧美| 黄色在线观看免费观看在线| 国产精品系列在线观看一区二区| 做爰视频毛片下载蜜桃视频1| av资源中文字幕在线观看| 久久免费看少妇高潮完整版| 久草福利电影在线观看| 国产成人精品福利短视频| 国产在线91观看免费观看| 黑人巨大的吊bdsm| 亚洲国产第一页在线观看| 国产日韩一区二区在线看 | 美女大bxxxx内射| 国产精品人妻熟女毛片av久| 亚洲天天干 夜夜操| aⅴ精产国品一二三产品| 在线观看av亚洲情色| 九色精品视频在线播放| 欧美专区日韩专区国产专区| 亚洲欧美成人综合在线观看| 国产janese在线播放| 久久三久久三久久三久久| 国产+亚洲+欧美+另类| 国产一区二区神马久久| 日韩三级电影华丽的外出| 午夜久久久久久久精品熟女| 日本免费一级黄色录像| 中文字幕av一区在线观看| 国产变态另类在线观看| 日本人妻少妇18—xx| 午夜av一区二区三区| 欧美在线精品一区二区三区视频 | 亚洲一区二区人妻av| 欧美日本国产自视大全| 久草视频福利在线首页| 国产精品成人xxxx| 国产又粗又硬又猛的毛片视频| 日本一二三区不卡无| 日韩欧美高清免费在线| av中文字幕福利网| 欧美日韩亚洲国产无线码| 小泽玛利亚视频在线观看| 精品一区二区三区午夜| 瑟瑟视频在线观看免费视频| 日本乱人一区二区三区| 国产精品久久综合久久| 午夜福利资源综合激情午夜福利资 | 欧美80老妇人性视频| 天堂av狠狠操蜜桃| 欧美日韩熟女一区二区三区| 国产伊人免费在线播放| 中文字幕 人妻精品| 久久久久五月天丁香社区 | 91老师蜜桃臀大屁股| 丰满的继坶3中文在线观看| 国产亚洲欧美另类在线观看| 国产极品精品免费视频| 直接能看的国产av| 毛片一级完整版免费| 亚洲嫩模一区二区三区| 蜜桃专区一区二区在线观看| 日本后入视频在线观看| 夜夜骑夜夜操夜夜奸| 五十路熟女av天堂| 中文字幕午夜免费福利视频| 黑人3p华裔熟女普通话| 91九色国产porny蝌蚪| 亚洲成人av一区在线| 亚洲自拍偷拍综合色| 人妻素人精油按摩中出| 亚洲天天干 夜夜操| 久久久久久九九99精品| 大香蕉福利在线观看| gav成人免费播放| 欧美综合婷婷欧美综合| 亚洲精品亚洲人成在线导航| 91精品啪在线免费| 天天躁日日躁狠狠躁躁欧美av| 日本午夜福利免费视频| 成年人中文字幕在线观看| 91精品高清一区二区三区| 91av中文视频在线| 亚洲人人妻一区二区三区| 粗大的内捧猛烈进出爽大牛汉子 | 日本中文字幕一二区视频| 777奇米久久精品一区| 一区二区三区四区中文| 在线观看免费岛国av| 蜜桃精品久久久一区二区| 国产又粗又硬又猛的毛片视频| 日韩一区二区电国产精品| 日本男女操逼视频免费看| 久久综合老鸭窝色综合久久| 国产va在线观看精品| 亚洲黄色av网站免费播放| 日本在线一区二区不卡视频| 欧美日韩国产一区二区三区三州| 夜夜操,天天操,狠狠操| 日韩成人免费电影二区| 超碰97人人做人人爱| tube69日本少妇| 国产白嫩美女一区二区| 日本人妻少妇18—xx| 成人亚洲精品国产精品 | 99re6热在线精品| 专门看国产熟妇的网站| av线天堂在线观看| 黄色成年网站午夜在线观看| 中国产一级黄片免费视频播放| 少妇露脸深喉口爆吞精| 日韩三级黄色片网站| 国产成人午夜精品福利| 五十路人妻熟女av一区二区| 精品久久久久久久久久中文蒉| 日韩中文字幕福利av| 东京热男人的av天堂| 国产精品一区二区av国| 亚洲午夜电影在线观看| 久久久极品久久蜜桃| 亚洲欧美人精品高清| 亚洲熟妇x久久av久久| 国产使劲操在线播放| 91试看福利一分钟| 粗大的内捧猛烈进出爽大牛汉子| 日韩亚洲高清在线观看| 成人av亚洲一区二区| 欧美精品国产综合久久| 亚洲自拍偷拍综合色| 亚洲最大免费在线观看| 岛国毛片视频免费在线观看| 国产综合视频在线看片| avjpm亚洲伊人久久| 久久久久国产成人精品亚洲午夜| 亚洲无码一区在线影院| 亚洲图库另类图片区| av资源中文字幕在线观看| 夜夜嗨av一区二区三区中文字幕| 爱有来生高清在线中文字幕| 做爰视频毛片下载蜜桃视频1| 98视频精品在线观看| jiuse91九色视频| 青青青青视频在线播放| 又粗又长 明星操逼小视频| 97国产在线av精品| 91精品国产91久久自产久强| 日韩精品激情在线观看| 一区二区三区美女毛片| 欧美aa一级一区三区四区| 欧美色呦呦最新网址| av在线免费资源站| 少妇人妻真实精品视频| av手机在线观播放网站| 国产九色91在线视频| 夜夜躁狠狠躁日日躁麻豆内射 | 啊啊好大好爽啊啊操我啊啊视频| 午夜精品一区二区三区更新| 亚洲精品一区二区三区老狼| 97精品成人一区二区三区| 熟女人妻在线观看视频| 伊人情人综合成人久久网小说| 适合午夜一个人看的视频| www天堂在线久久| 国产乱子伦精品视频潮优女| 日韩在线视频观看有码在线| 亚洲激情av一区二区| 五十路在线观看完整版| 久久久久久久久久性潮| 熟女妇女老妇一二三区| 粉嫩av蜜乳av蜜臀| 日韩中文字幕福利av| 欧美日韩激情啪啪啪| 欲乱人妻少妇在线视频裸| 性感美女诱惑福利视频| 欧美特色aaa大片| 久久www免费人成一看片| 夜夜嗨av蜜臀av| 自拍偷拍亚洲欧美在线视频| 亚洲另类综合一区小说| 韩国黄色一级二级三级| 精品美女福利在线观看| 最近中文字幕国产在线| 国产内射中出在线观看| 又黄又刺激的午夜小视频| 亚洲国产精品美女在线观看| 老师让我插进去69AV| 天天日天天天天天天天天天天 | gogo国模私拍视频| 日韩精品一区二区三区在线播放| 丰满的继坶3中文在线观看| 精产国品久久一二三产区区别 | 超级碰碰在线视频免费观看| 伊人综合免费在线视频| 夜色福利视频在线观看| 天天色天天舔天天射天天爽 | 免费费一级特黄真人片| yy6080国产在线视频| 91麻豆精品传媒国产黄色片| 9色精品视频在线观看| 美女少妇亚洲精选av| 韩国三级aaaaa高清视频| 超碰97免费人妻麻豆| 极品粉嫩小泬白浆20p主播| aaa久久久久久久久| 一区二区三区毛片国产一区| 蜜桃专区一区二区在线观看| 中文字母永久播放1区2区3区 | 久久精品视频一区二区三区四区 | 免费观看污视频网站| 免费岛国喷水视频在线观看| 国产午夜无码福利在线看| 啊用力插好舒服视频| 国产亚洲欧美45p| 扒开腿挺进肉嫩小18禁视频| 55夜色66夜色国产精品站| 黄工厂精品视频在线观看| 91精品国产91久久自产久强| 青青青青青青青青青青草青青 | 亚洲人妻av毛片在线| av视屏免费在线播放| 一个人免费在线观看ww视频| 欧美黄色录像免费看的| 无忧传媒在线观看视频| 五十路熟女人妻一区二| 一区二区三区 自拍偷拍| 亚洲av一妻不如妾| 欧美特色aaa大片| 五十路息与子猛烈交尾视频| 骚逼被大屌狂草视频免费看| 婷婷久久一区二区字幕网址你懂得| 国产一区二区火爆视频| 美女福利视频导航网站| 性欧美日本大妈母与子| 亚洲精品国产久久久久久| 极品丝袜一区二区三区| 18禁网站一区二区三区四区| 毛片av在线免费看| 国产精品成久久久久三级蜜臀av | 100%美女蜜桃视频| 啪啪啪18禁一区二区三区| 男女第一次视频在线观看| 亚洲av黄色在线网站| 国产一级精品综合av| 亚洲欧美激情中文字幕| 日本三极片中文字幕| 深田咏美亚洲一区二区| 精品人妻每日一部精品| 国产中文字幕四区在线观看| 男女啪啪视频免费在线观看| 91免费观看国产免费| 亚洲一级av大片免费观看| 亚洲偷自拍高清视频| 亚洲va天堂va国产va久| 丝袜美腿欧美另类 中文字幕| 91国偷自产一区二区三区精品| 亚洲国产免费av一区二区三区| 果冻传媒av一区二区三区| 亚洲精品在线资源站| 欧美日本在线视频一区| 男人的天堂在线黄色| 亚洲高清自偷揄拍自拍| 非洲黑人一级特黄片| 玩弄人妻熟妇性色av少妇| 人妻3p真实偷拍一二区| 97人妻夜夜爽二区欧美极品| 97黄网站在线观看| 亚洲精品国产综合久久久久久久久 | 动色av一区二区三区| 黄色男人的天堂视频| 任你操视频免费在线观看| 亚洲av自拍偷拍综合| av一区二区三区人妻| 中文字幕一区的人妻欧美日韩| 亚洲精品国产久久久久久| 中文字幕—97超碰网| 日本特级片中文字幕| 一区二区三区毛片国产一区| 精品黑人一区二区三区久久国产| 黄色成年网站午夜在线观看| 好吊视频—区二区三区| 一区二区三区毛片国产一区| 日本欧美视频在线观看三区| 人妻少妇亚洲一区二区| 啪啪啪18禁一区二区三区 | 色天天天天射天天舔| 66久久久久久久久久久| 又色又爽又黄的美女裸体| 男人操女人逼逼视频网站| 日韩精品中文字幕播放| 欧美另类一区二区视频| 色av色婷婷人妻久久久精品高清| 91在线视频在线精品3| 操操网操操伊剧情片中文字幕网| 国产日韩av一区二区在线| 中文字幕av男人天堂| 亚洲av色图18p| 精产国品久久一二三产区区别| 日本成人不卡一区二区| 在线免费观看日本伦理| 国产九色91在线观看精品| 性色av一区二区三区久久久| 亚洲免费视频欧洲免费视频| 欧美精品亚洲精品日韩在线| 亚洲av无硬久久精品蜜桃| 99精品一区二区三区的区| yy6080国产在线视频| 天天干天天日天天谢综合156| 2020国产在线不卡视频| 性欧美激情久久久久久久| 中文 成人 在线 视频| 中文字幕中文字幕人妻| 天天干夜夜操天天舔| 中文字幕av熟女人妻| 成人av中文字幕一区| 国产高清精品极品美女| 丰满熟女午夜福利视频| AV无码一区二区三区不卡| 亚洲成人国产av在线| 亚洲1卡2卡三卡4卡在线观看 | 东京热男人的av天堂| 亚洲欧美综合在线探花| 在线观看日韩激情视频| 青青青青青手机视频| 国产97视频在线精品| 老有所依在线观看完整版| 中文字幕亚洲久久久| 国产日韩精品免费在线| 亚洲欧美综合在线探花| 啊用力插好舒服视频| 青青草精品在线视频观看| 这里只有精品双飞在线播放| 黄片三级三级三级在线观看| 姐姐的朋友2在线观看中文字幕 | 国产av欧美精品高潮网站| 欧美一区二区三区乱码在线播放| 在线观看免费视频色97| 少妇高潮一区二区三区| 早川濑里奈av黑人番号| 北条麻妃高跟丝袜啪啪| 在线视频这里只有精品自拍| 一色桃子久久精品亚洲| 国产亚洲四十路五十路| 欧美3p在线观看一区二区三区| 美女吃鸡巴操逼高潮视频| 青青伊人一精品视频| 欧美一区二区三区激情啪啪啪| 精品一区二区三区欧美| 人妻少妇亚洲一区二区| 在线观看日韩激情视频| 亚洲国产40页第21页| 日韩av熟妇在线观看| 人妻3p真实偷拍一二区| 亚洲狠狠婷婷综合久久app| 2021最新热播中文字幕| 欧美视频中文一区二区三区| 女生自摸在线观看一区二区三区| 男人插女人视频网站| 男女啪啪啪啪啪的网站| 色婷婷久久久久swag精品| 自拍 日韩 欧美激情| 欧美日韩亚洲国产无线码| 在线可以看的视频你懂的 | 国产成人午夜精品福利| 欧美黑人与人妻精品| 国产成人小视频在线观看无遮挡| 91香蕉成人app下载| 蜜臀av久久久久久久| 欧美视频中文一区二区三区| 在线国产精品一区二区三区| 欧美80老妇人性视频| 国产一区二区三免费视频| 偷拍自拍亚洲美腿丝袜| 在线观看国产网站资源| 啪啪啪18禁一区二区三区 | 好了av中文字幕在线| 欧美黄色录像免费看的| 亚洲欧美成人综合在线观看| 91久久国产成人免费网站| 午夜久久久久久久99| 揄拍成人国产精品免费看视频| 国产精品三级三级三级| 超碰在线中文字幕一区二区| japanese日本熟妇另类| 亚洲国产精品免费在线观看| 亚洲av香蕉一区区二区三区犇| 精品黑人一区二区三区久久国产 | 一区二区三区的久久的蜜桃的视频| 久久久久久久久久久久久97| 免费男阳茎伸入女阳道视频| 午夜国产福利在线观看| 亚洲欧洲一区二区在线观看| 久久机热/这里只有| 中文字幕人妻av在线观看| 在线观看国产免费麻豆| 福利视频网久久91| 99亚洲美女一区二区三区| 国产片免费观看在线观看| 2020av天堂网在线观看| 日本韩国免费福利精品| 久久免费看少妇高潮完整版| 欧美日韩一区二区电影在线观看| 手机看片福利盒子日韩在线播放| 欧美日韩熟女一区二区三区| 高潮视频在线快速观看国家快速| 精品老妇女久久9g国产| 欧美久久久久久三级网| 亚洲 清纯 国产com| 亚洲av日韩精品久久久| 亚洲精品乱码久久久久久密桃明| 人人妻人人爽人人澡人人精品| 亚洲av日韩精品久久久| 亚洲Av无码国产综合色区| 国产成人综合一区2区| 中文字幕中文字幕人妻| 青青青视频手机在线观看| 91九色porny国产蝌蚪视频| 欧美一区二区三区高清不卡tv| 天天日天天干天天插舔舔| 中文字幕欧美日韩射射一| 色婷婷精品大在线观看| 亚洲1卡2卡三卡4卡在线观看| 超级福利视频在线观看| 蜜桃精品久久久一区二区| 黄色中文字幕在线播放| av黄色成人在线观看| 男人插女人视频网站| 老司机你懂得福利视频| 任我爽精品视频在线播放| 老司机在线精品福利视频| 中文字幕—97超碰网| 国产精品一区二区av国| 人妻少妇中文有码精品| 精品成人啪啪18免费蜜臀| 久草视频在线一区二区三区资源站| 激情啪啪啪啪一区二区三区| 高潮喷水在线视频观看| 国产丰满熟女成人视频| 国产高清女主播在线| 亚国产成人精品久久久| 欧美精品一区二区三区xxxx| 青青色国产视频在线| 欧美精品一二三视频| 天天摸天天干天天操科普| 偷偷玩弄新婚人妻h视频| 国产91嫩草久久成人在线视频| 无码国产精品一区二区高潮久久4| 亚洲天堂av最新网址| 少妇高潮无套内谢麻豆| 人人妻人人爽人人添夜| av网址国产在线观看| 日本熟女精品一区二区三区| 亚洲日本一区二区三区 | 久久久久久久久久久免费女人| 一级黄色片夫妻性生活| 男大肉棒猛烈插女免费视频| 中文字日产幕乱六区蜜桃| 国产免费高清视频视频| 久久久91蜜桃精品ad| 亚洲国产在人线放午夜| 久久亚洲天堂中文对白| 亚洲欧美久久久久久久久| 午夜成午夜成年片在线观看| 天天想要天天操天天干| 丝袜美腿视频诱惑亚洲无| 日本后入视频在线观看| 欧美女同性恋免费a| 91精品国产黑色丝袜| 男人天堂最新地址av| 一区二区三区在线视频福利| 国产av国片精品一区二区| 午夜毛片不卡免费观看视频| 亚洲另类伦春色综合小| 欧美一区二区三区乱码在线播放 | 大陆胖女人与丈夫操b国语高清| 1区2区3区4区视频在线观看| 黄网十四区丁香社区激情五月天| 人妻久久久精品69系列| 亚洲成人av一区久久| 丝袜美腿视频诱惑亚洲无| 亚洲国产免费av一区二区三区| 在线观看视频污一区| 国产欧美精品不卡在线| 亚洲av可乐操首页| 色97视频在线播放| 青青青青青青草国产| 婷婷午夜国产精品久久久| 日本高清在线不卡一区二区| 青青草在观免费国产精品| 欧美黄片精彩在线免费观看| 欧美特色aaa大片| 加勒比视频在线免费观看| 天天干天天操天天爽天天摸 | 亚洲av黄色在线网站| 18禁网站一区二区三区四区| 无码国产精品一区二区高潮久久4| 啪啪啪啪啪啪啪免费视频| 免费手机黄页网址大全| 国产精品入口麻豆啊啊啊| 亚洲久久午夜av一区二区| 人妻3p真实偷拍一二区| 综合页自拍视频在线播放| 日韩影片一区二区三区不卡免费| 男人操女人的逼免费视频| 青青草成人福利电影| 很黄很污很色的午夜网站在线观看 | 国产乱弄免费视频观看| 二区中出在线观看老师| 欧美激情精品在线观看| 免费岛国喷水视频在线观看| 色狠狠av线不卡香蕉一区二区| 自拍偷拍一区二区三区图片| 国产亚洲四十路五十路| 98视频精品在线观看| 91中文字幕最新合集| 亚洲国产在线精品国偷产拍| 边摸边做超爽毛片18禁色戒 | 亚洲熟妇无码一区二区三区| 亚洲无码一区在线影院| 午夜美女少妇福利视频| 97成人免费在线观看网站| 精品成人午夜免费看| 2022国产精品视频| 人人妻人人澡欧美91精品| 38av一区二区三区| 国产精品亚洲在线观看| 2022中文字幕在线| 日韩影片一区二区三区不卡免费| 亚洲一级av无码一级久久精品| yy6080国产在线视频| 久久艹在线观看视频| 中文字幕午夜免费福利视频| 欧美成人黄片一区二区三区| 天天日天天日天天擦| 国产妇女自拍区在线观看| 日本美女性生活一级片| 加勒比视频在线免费观看| 自拍偷拍亚洲精品第2页| 成年人黄视频在线观看| 综合精品久久久久97| 亚洲欧美在线视频第一页| 激情国产小视频在线| 欧美精品资源在线观看| 亚洲自拍偷拍精品网| 人妻熟女在线一区二区| av在线免费中文字幕| 日韩加勒比东京热二区| 中文字幕av一区在线观看| 五十路熟女人妻一区二区9933| 亚洲公开视频在线观看| 人妻久久久精品69系列| 97人妻总资源视频| 中文字母永久播放1区2区3区| 硬鸡巴动态操女人逼视频| 少妇人妻久久久久视频黄片| 蜜桃色婷婷久久久福利在线| 中国无遮挡白丝袜二区精品| 亚洲综合图片20p| 国产美女午夜福利久久| 亚洲av日韩精品久久久| 亚洲免费va在线播放| lutube在线成人免费看| 国产无遮挡裸体免费直播视频| 亚洲一区制服丝袜美腿| 欧美一区二区三区四区性视频| 亚洲国产免费av一区二区三区| 91麻豆精品传媒国产黄色片| 狠狠地躁夜夜躁日日躁| 亚洲另类图片蜜臀av| 日韩av有码一区二区三区4| 日本午夜爽爽爽爽爽视频在线观看| 亚洲成人情色电影在线观看| 久草视频首页在线观看| 精品视频中文字幕在线播放| 亚洲午夜伦理视频在线| 天天做天天爽夜夜做少妇| 久久久91蜜桃精品ad| 91一区精品在线观看| 啪啪啪啪啪啪啪啪啪啪黄色| 人妻丝袜av在线播放网址| 久久三久久三久久三久久| 午夜的视频在线观看| 欧美香蕉人妻精品一区二区| 在线国产日韩欧美视频| 亚洲成av人无码不卡影片一| 国产亚洲国产av网站在线| 日本三极片视频网站观看| 中文字幕乱码人妻电影| 777奇米久久精品一区| 午夜在线一区二区免费| 国产女人被做到高潮免费视频| 自拍偷拍亚洲欧美在线视频| 亚洲女人的天堂av| 中文字幕av第1页中文字幕| 亚洲av成人免费网站| 成年人中文字幕在线观看| 国产精品女邻居小骚货| 在线免费观看视频一二区| 一级黄色片夫妻性生活| 在线观看日韩激情视频| 亚洲 欧美 精品 激情 偷拍| 91福利视频免费在线观看| 亚洲一区二区久久久人妻| 深田咏美亚洲一区二区| 男女第一次视频在线观看| 偷拍3456eee| 日本人竟这样玩学生妹| 国产精品久久久久久久精品视频| 国产女人叫床高潮大片视频| 人人妻人人爱人人草| 亚洲一区制服丝袜美腿| 国产精品视频资源在线播放| 九色精品视频在线播放| 非洲黑人一级特黄片| 夜夜嗨av一区二区三区中文字幕| 亚洲熟色妇av日韩熟色妇在线| 粉嫩欧美美人妻小视频| 成人动漫大肉棒插进去视频| 免费十精品十国产网站| 亚洲欧美激情人妻偷拍| 大香蕉大香蕉大香蕉大香蕉大香蕉 | 91中文字幕最新合集| 伊人综合aⅴ在线网| 中文字幕av熟女人妻| 国产精品人妻66p| 99re6热在线精品| 成人精品在线观看视频| 男人天堂色男人av| xxx日本hd高清| 粗大的内捧猛烈进出爽大牛汉子| 午夜激情久久不卡一区二区| 久久精品美女免费视频| 91亚洲手机在线视频播放| 午夜精品福利91av| 国产精品视频男人的天堂| 日韩av免费观看一区| 日韩三级电影华丽的外出| 美女小视频网站在线| 夫妻在线观看视频91| 青青草人人妻人人妻| 国产在线观看黄色视频| 欧美色呦呦最新网址| 欧美一区二区中文字幕电影| 中文字幕中文字幕人妻| 特级无码毛片免费视频播放| 98精产国品一二三产区区别| 91大屁股国产一区二区| 伊拉克及约旦宣布关闭领空| 国产精品久久久久久久女人18| 精品久久久久久久久久久99| 日本性感美女视频网站| 美女福利视频网址导航| 国产综合视频在线看片| 亚洲专区激情在线观看视频| 日本av熟女在线视频| 日韩欧美制服诱惑一区在线| 免费一级特黄特色大片在线观看| 日本性感美女视频网站| 桃色视频在线观看一区二区| 日本阿v视频在线免费观看| 日韩三级黄色片网站| 老司机99精品视频在线观看 | 亚洲一区二区三区久久受 | 免费人成黄页网站在线观看国产 | rct470中文字幕在线| 国产精品久久久久久久久福交| 99热久久这里只有精品8| 狠狠躁狠狠爱网站视频| 精品国产污污免费网站入口自| 粉嫩av懂色av蜜臀av| 黄色在线观看免费观看在线| av天堂中文字幕最新| 另类av十亚洲av| 成年女人免费播放视频| 午夜国产福利在线观看| 自拍偷拍 国产资源| 日本av在线一区二区三区| 中文字幕av一区在线观看| 欧美80老妇人性视频| 91国产在线视频免费观看| 日本精品一区二区三区在线视频。| 成人资源在线观看免费官网| 国产精品成人xxxx| jiuse91九色视频| 中文字幕av男人天堂| 久久久久久久久久久久久97| 中文字幕av一区在线观看| 人人妻人人爽人人澡人人精品| 精品国产在线手机在线| 91精品国产91青青碰| 中文字幕av熟女人妻| 93精品视频在线观看| 另类av十亚洲av| 婷婷五月亚洲综合在线| 免费大片在线观看视频网站| 2020久久躁狠狠躁夜夜躁| 首之国产AV医生和护士小芳| 精品人人人妻人人玩日产欧| 男大肉棒猛烈插女免费视频| 亚洲综合自拍视频一区| 黄色片一级美女黄色片| 大屁股熟女一区二区三区| 91www一区二区三区| 亚洲高清自偷揄拍自拍| 女同性ⅹxx女同hd| 综合激情网激情五月五月婷婷| 青青青青青青青青青青草青青| 美女福利视频导航网站| 精品国产亚洲av一淫| yy6080国产在线视频| 六月婷婷激情一区二区三区| 久久久久久性虐视频| 欧美精品 日韩国产| 亚洲一级av大片免费观看| 大香蕉大香蕉在线看| 97人妻人人澡爽人人精品| 视频在线免费观看你懂得| 超碰在线观看免费在线观看| 丰满的继坶3中文在线观看| 换爱交换乱高清大片| 激情啪啪啪啪一区二区三区| 久久精品久久精品亚洲人| 亚洲精品在线资源站| 日本一区精品视频在线观看| 国产亚洲视频在线观看| 国产超码片内射在线| 欧美精品激情在线最新观看视频| 亚洲精品成人网久久久久久小说 | av新中文天堂在线网址| 亚洲伊人色一综合网| 福利一二三在线视频观看| 老师啊太大了啊啊啊尻视频| 亚洲精品精品国产综合| 成人高潮aa毛片免费| 亚洲熟女女同志女同| 色综合久久五月色婷婷综合| 护士特殊服务久久久久久久| 亚洲人妻视频在线网| 2020av天堂网在线观看| 日韩美女精品视频在线观看网站| 老司机福利精品免费视频一区二区| 五十路人妻熟女av一区二区| 日本三极片中文字幕| 欧美爆乳肉感大码在线观看| 综合页自拍视频在线播放| 中文字幕第1页av一天堂网| 日本一二三区不卡无| weyvv5国产成人精品的视频| 日韩精品二区一区久久| 黑人变态深video特大巨大| 国产性感美女福利视频| 成熟丰满熟妇高潮xx×xx | 成人sm视频在线观看| 精品国产污污免费网站入口自| 中国无遮挡白丝袜二区精品| 最新97国产在线视频| 高清成人av一区三区| 在线国产日韩欧美视频| 人妻久久久精品69系列| 福利视频一区二区三区筱慧| 免费在线播放a级片| 亚洲欧美国产麻豆综合| 天天插天天色天天日| 亚洲av日韩高清hd| 少妇高潮一区二区三区| 国产使劲操在线播放| 国产高清在线在线视频| 亚洲av日韩av第一区二区三区| 18禁美女羞羞免费网站| 欧美日本国产自视大全| 蜜桃视频入口久久久| 黄色在线观看免费观看在线| 热99re69精品8在线播放| 熟妇一区二区三区高清版| 国产实拍勾搭女技师av在线| 18禁精品网站久久| 亚洲成人线上免费视频观看| 国产激情av网站在线观看| 欧美视频一区免费在线| 亚洲国产欧美一区二区三区久久| 51精品视频免费在线观看| 大陆av手机在线观看| 日本裸体熟妇区二区欧美| 国产真实灌醉下药美女av福利| 日本一二三中文字幕| 国产精品国产三级麻豆| 亚洲熟女久久久36d| 日本在线不卡免费视频| 青青青视频自偷自拍38碰| 国语对白xxxx乱大交| 国产精品黄页网站视频| 成人伊人精品色xxxx视频| 精品一区二区亚洲欧美| 亚洲免费福利一区二区三区| 青青草在观免费国产精品| 青青青青青青青青青青草青青 | 美女操逼免费短视频下载链接| 91精品国产91久久自产久强| 欧美亚洲中文字幕一区二区三区| 水蜜桃国产一区二区三区| 丝袜美腿欧美另类 中文字幕| 在线国产日韩欧美视频| 人人在线视频一区二区| 美女日逼视频免费观看| 天天爽夜夜爽人人爽QC| 亚洲精品ww久久久久久| 天天操天天弄天天射| 黑人变态深video特大巨大| 伊人成人综合开心网| 国内自拍第一页在线观看| 超碰在线观看免费在线观看| 国产一区二区神马久久| 国产污污污污网站在线| 国产麻豆精品人妻av| 青青伊人一精品视频| 成年美女黄网站18禁久久| 99精品国自产在线人| 色天天天天射天天舔| 777奇米久久精品一区| 亚洲综合在线视频可播放| 香蕉aⅴ一区二区三区| 2019av在线视频| 国产大学生援交正在播放| 成人蜜臀午夜久久一区| 日韩美女福利视频网| 日本乱人一区二区三区| 亚洲国产精品中文字幕网站| ka0ri在线视频| 亚洲欧美综合在线探花| 精品久久久久久久久久中文蒉| 夜夜骑夜夜操夜夜奸| 亚洲美女美妇久久字幕组| 日韩成人综艺在线播放| 欧美xxx成人在线| 亚洲免费av在线视频| av亚洲中文天堂字幕网| 亚洲一区制服丝袜美腿| 欧亚日韩一区二区三区观看视频| 亚洲综合自拍视频一区| 2020中文字幕在线播放| 夜色17s精品人妻熟女| 人妻丰满熟妇综合网| 久久99久久99精品影院| 六月婷婷激情一区二区三区| 馒头大胆亚洲一区二区| 一级黄片大鸡巴插入美女| 天码人妻一区二区三区在线看| 又粗又长 明星操逼小视频| 亚洲一区二区三区精品视频在线 | 成人av免费不卡在线观看| 日本性感美女写真视频| 9色精品视频在线观看| 福利视频一区二区三区筱慧| 91天堂天天日天天操| 首之国产AV医生和护士小芳| 一色桃子久久精品亚洲| yy6080国产在线视频| 75国产综合在线视频| 亚洲自拍偷拍综合色| 中文字幕人妻熟女在线电影| 少妇人妻二三区视频| 少妇高潮无套内谢麻豆| 91成人精品亚洲国产| 精品黑人一区二区三区久久国产| 888亚洲欧美国产va在线播放| 亚洲成人三级在线播放| 亚洲另类在线免费观看| 人人妻人人爱人人草| 55夜色66夜色国产精品站| 亚洲人一区二区中文字幕| 国产1区,2区,3区| 日本丰满熟妇大屁股久久| 天天日天天天天天天天天天天 | 老司机福利精品视频在线| 人妻少妇一区二区三区蜜桃| 日本熟女精品一区二区三区| 99re6热在线精品| 欧美80老妇人性视频| 亚洲成人av一区久久| 丰满的子国产在线观看| 91av精品视频在线| 91在线视频在线精品3| 黄片色呦呦视频免费看| 超碰在线中文字幕一区二区| 熟女人妻一区二区精品视频| 偷拍3456eee| 2019av在线视频| 男人插女人视频网站| 亚洲狠狠婷婷综合久久app| 中国产一级黄片免费视频播放| 男人操女人逼逼视频网站| 91大屁股国产一区二区| av天堂中文免费在线| 国产又大又黄免费观看| 欧美交性又色又爽又黄麻豆| 久久丁香花五月天色婷婷| japanese日本熟妇另类| 高潮喷水在线视频观看| 97香蕉碰碰人妻国产樱花| 一区二区三区麻豆福利视频| 少妇人妻100系列| 熟女视频一区,二区,三区| aiss午夜免费视频| 国产女人露脸高潮对白视频| 91在线免费观看成人| 最新的中文字幕 亚洲| 精品suv一区二区69| 中文字幕在线观看国产片| 香蕉91一区二区三区| 97人妻人人澡爽人人精品| 韩国女主播精品视频网站| 国产激情av网站在线观看| 国产av自拍偷拍盛宴| 天天摸天天亲天天舔天天操天天爽 | 人妻在线精品录音叫床| 老司机你懂得福利视频| 久草极品美女视频在线观看| av天堂资源最新版在线看| 女同久久精品秋霞网| 男人的天堂av日韩亚洲| 久久久久久cao我的性感人妻 | 韩国男女黄色在线观看| 青青草视频手机免费在线观看| 中字幕人妻熟女人妻a62v网 | 亚洲一区二区三区偷拍女厕91| av中文字幕网址在线| av俺也去在线播放| 欧美色婷婷综合在线| 亚洲成人国产综合一区| av男人天堂狠狠干| 啪啪啪18禁一区二区三区| 3344免费偷拍视频| 青草久久视频在线观看| 岛国青草视频在线观看| 成人蜜臀午夜久久一区| 国产午夜无码福利在线看| 黑人大几巴狂插日本少妇| 北条麻妃肉色丝袜视频| 亚洲少妇高潮免费观看| 国产janese在线播放| 青青草视频手机免费在线观看| 1024久久国产精品| 国产女孩喷水在线观看| 视频久久久久久久人妻| 老司机你懂得福利视频| 国产黑丝高跟鞋视频在线播放| 91人妻精品一区二区久久| av一本二本在线观看| 日本一区精品视频在线观看| 天堂va蜜桃一区入口| 91破解版永久免费| 啪啪啪啪啪啪啪免费视频| 人妻少妇中文有码精品| 一个色综合男人天堂| 欧美精品中文字幕久久二区| 免费黄高清无码国产| 2021天天色天天干| 最新中文字幕乱码在线| 粉嫩小穴流水视频在线观看| 自拍偷区二区三区麻豆| 精品91自产拍在线观看一区| 美女骚逼日出水来了| 成人av电影免费版| caoporm超碰国产| 91麻豆精品91久久久久同性 | 中文字幕午夜免费福利视频| 欧美爆乳肉感大码在线观看| 成人资源在线观看免费官网| 老司机99精品视频在线观看| 亚洲综合一区二区精品久久| 亚洲av色图18p| 狠狠鲁狠狠操天天晚上干干| 动漫黑丝美女的鸡巴| 偷拍自拍亚洲美腿丝袜| 99精品免费久久久久久久久a| 早川濑里奈av黑人番号| 亚洲一区二区三区久久受 | heyzo蜜桃熟女人妻| 亚洲精品国偷自产在线观看蜜桃 | 99久久中文字幕一本人| 桃色视频在线观看一区二区| 无码国产精品一区二区高潮久久4 日韩欧美一级精品在线观看 | 人人在线视频一区二区| 中文字幕日本人妻中出| 91大神福利视频网| 黄色黄色黄片78在线| 亚洲1区2区3区精华液| 天天干夜夜操天天舔| 亚洲欧美另类手机在线| av俺也去在线播放| 国产黄网站在线观看播放| 激情啪啪啪啪一区二区三区 | 边摸边做超爽毛片18禁色戒| 日本真人性生活视频免费看| 天天日天天透天天操| 国产真实乱子伦a视频| av欧美网站在线观看| 色哟哟在线网站入口| 国产密臀av一区二区三| 97人妻无码AV碰碰视频| 国产麻豆乱子伦午夜视频观看 | 色综合久久五月色婷婷综合| 91av精品视频在线| 视频二区在线视频观看 | 特黄老太婆aa毛毛片| 久草视频在线一区二区三区资源站| 精品人妻一二三区久久| 亚洲国产40页第21页| 欧美成人综合色在线噜噜| 成人国产影院在线观看| 免费手机黄页网址大全| 乱亲女秽乱长久久久| 亚洲福利精品视频在线免费观看| 午夜在线精品偷拍一区二| 精品国产在线手机在线| 极品丝袜一区二区三区| 成人sm视频在线观看| 国产日韩欧美视频在线导航| 青青青青操在线观看免费| 97精品成人一区二区三区| 日本18禁久久久久久| 99精品视频在线观看免费播放| 黄色大片免费观看网站| 天天日天天天天天天天天天天| 韩国女主播精品视频网站| 免费一级黄色av网站| 黄片大全在线观看观看| 国产亚洲精品欧洲在线观看| rct470中文字幕在线| 4个黑人操素人视频网站精品91| 插逼视频双插洞国产操逼插洞| 男人操女人的逼免费视频| 亚洲粉嫩av一区二区三区| 中文字幕欧美日韩射射一| 被大鸡吧操的好舒服视频免费| 狠狠的往里顶撞h百合| 中文字幕人妻av在线观看| 黄页网视频在线免费观看| 天堂av在线官网中文| 国产精品自拍偷拍a| 免费无毒热热热热热热久| free性日本少妇| 在线制服丝袜中文字幕| 热久久只有这里有精品| 日本三极片视频网站观看| 国产精品久久久久国产三级试频| 在线观看av2025| 人妻熟女中文字幕aⅴ在线| 超碰97人人澡人人| 国产精品国产三级麻豆| 人妻丝袜精品中文字幕| 国产清纯美女al在线| 青青青青青青草国产| 亚洲一区二区三区久久午夜 | 国际av大片在线免费观看| 午夜免费观看精品视频| 亚洲精品国产综合久久久久久久久| 懂色av之国产精品| 中国产一级黄片免费视频播放| 青青青青爽手机在线| 福利视频一区二区三区筱慧| 久草视频在线一区二区三区资源站 | 亚洲在线观看中文字幕av| 日本美女成人在线视频| 色av色婷婷人妻久久久精品高清| 午夜在线观看一区视频| 亚洲精品无码久久久久不卡| 91人妻人人做人人爽在线| 经典国语激情内射视频| 啪啪啪啪啪啪啪啪av| 日本一区精品视频在线观看| 亚洲国产成人无码麻豆艾秋| av成人在线观看一区| 黑人大几巴狂插日本少妇| 和邻居少妇愉情中文字幕| 国产精品系列在线观看一区二区| 国产日韩欧美美利坚蜜臀懂色| 老鸭窝在线观看一区| 天天爽夜夜爽人人爽QC| 国产黄色大片在线免费播放| 中文字幕奴隷色的舞台50| 欧美特级特黄a大片免费| xxx日本hd高清| 啪啪啪18禁一区二区三区 | 亚洲麻豆一区二区三区| 亚洲的电影一区二区三区| 中文字幕一区二区三区蜜月| av天堂加勒比在线| 亚洲日本一区二区三区 | 偷拍自拍国产在线视频| 精品老妇女久久9g国产| 久久久久久性虐视频| 亚洲狠狠婷婷综合久久app| 97欧洲一区二区精品免费| 精品91高清在线观看| 成人蜜臀午夜久久一区| 91精品国产黑色丝袜| 亚洲变态另类色图天堂网| 国产卡一卡二卡三乱码手机| 女同性ⅹxx女同hd| 国产亚洲精品品视频在线| 欧美综合婷婷欧美综合| 欧美国品一二三产区区别| 99精品国产aⅴ在线观看| 亚洲av极品精品在线观看| 在线观看的黄色免费网站| 大鸡吧插逼逼视频免费看| 91色网站免费在线观看| 宅男噜噜噜666国产| 男人在床上插女人视频| 久草极品美女视频在线观看| 午夜精品一区二区三区更新| 在线观看911精品国产| 少妇高潮无套内谢麻豆| 天天日天天爽天天爽| 任你操视频免费在线观看| 岳太深了紧紧的中文字幕| 日韩三级黄色片网站| 成人综合亚洲欧美一区| 日本裸体熟妇区二区欧美| av线天堂在线观看| 国产午夜亚洲精品不卡在线观看| 欧美黑人与人妻精品| 久久这里只有精彩视频免费| 爆乳骚货内射骚货内射在线| 亚洲国产精品黑丝美女| 99热久久这里只有精品8| 大胸性感美女羞爽操逼毛片| 香港三日本三韩国三欧美三级| yy6080国产在线视频| 亚洲一区二区三区五区| 中国黄片视频一区91| 偷拍自拍亚洲视频在线观看| 国产一区成人在线观看视频| 国产精品熟女久久久久浪潮| 操日韩美女视频在线免费看| 曰本无码人妻丰满熟妇啪啪| 亚洲欧美成人综合在线观看| 国产在线91观看免费观看| 中文字幕在线一区精品| 国产一区成人在线观看视频| 国产欧美精品免费观看视频| 黑人乱偷人妻中文字幕| 日本丰满熟妇大屁股久久| 自拍偷拍 国产资源| 欧美视频综合第一页| 大屁股熟女一区二区三区| 国产精品久久久久国产三级试频 | 亚洲福利精品视频在线免费观看| 女生自摸在线观看一区二区三区 | 国产一级麻豆精品免费| 日韩欧美在线观看不卡一区二区| 国产精品自拍在线视频| 免费观看国产综合视频| 亚洲欧美另类手机在线| 91精品国产黑色丝袜| 精品suv一区二区69| 亚洲一级av大片免费观看| 精品一区二区亚洲欧美| 国产精品中文av在线播放| 亚洲熟女女同志女同| 硬鸡巴动态操女人逼视频| 精品日产卡一卡二卡国色天香| 亚洲成人激情av在线| 老熟妇凹凸淫老妇女av在线观看| 中文 成人 在线 视频| 精品一区二区亚洲欧美| 国产中文字幕四区在线观看| 人妻素人精油按摩中出| 黑人变态深video特大巨大| 粉嫩欧美美人妻小视频| 中字幕人妻熟女人妻a62v网| 中文字幕在线欧美精品| 一区二区视频在线观看免费观看 | 天天日天天干天天爱| 久久久精品欧洲亚洲av| 北条麻妃肉色丝袜视频| www日韩毛片av| 风流唐伯虎电视剧在线观看| 丰满的继坶3中文在线观看| 日韩欧美一级aa大片| 91快播视频在线观看| 老司机99精品视频在线观看| 一区二区三区四区视频在线播放| 手机看片福利盒子日韩在线播放| 一区二区在线观看少妇| 75国产综合在线视频| 亚洲成人av一区在线| 久久精品国产亚洲精品166m| 日本欧美视频在线观看三区| 综合一区二区三区蜜臀| 欧美性感尤物人妻在线免费看| 国产av欧美精品高潮网站| 亚洲午夜电影之麻豆 | 97人人模人人爽人人喊 | 日韩av免费观看一区| 成人免费做爰高潮视频| 国产精品视频一区在线播放| 亚洲精品国产久久久久久| 亚洲国产精品黑丝美女| 日本xx片在线观看| lutube在线成人免费看| 成人av免费不卡在线观看| 91在线免费观看成人| 免费一级特黄特色大片在线观看| 一区二区三区的久久的蜜桃的视频| 最近中文字幕国产在线| 色综合天天综合网国产成人| 午夜久久久久久久精品熟女| 青春草视频在线免费播放| 亚洲熟女女同志女同| 亚洲人妻30pwc| 亚洲免费在线视频网站| 瑟瑟视频在线观看免费视频| 少妇高潮无套内谢麻豆| av无限看熟女人妻另类av| 国产精品午夜国产小视频| 国产麻豆精品人妻av| 欧美成人一二三在线网| 成人蜜臀午夜久久一区| 日韩av中文在线免费观看| 搡老熟女一区二区在线观看| 日本美女成人在线视频| 亚洲激情唯美亚洲激情图片| 女警官打开双腿沦为性奴| 亚洲人成精品久久久久久久| 一区二区在线视频中文字幕 | 色噜噜噜噜18禁止观看| 亚洲视频乱码在线观看| 色在线观看视频免费的| 美女福利视频网址导航| 红杏久久av人妻一区| 久久久久久久99精品| 久久这里只有精品热视频| 成人性黑人一级av| 欧美黑人性猛交xxxxⅹooo| 经典国语激情内射视频| 中文字幕人妻熟女在线电影| 中文字幕在线一区精品| 欧美偷拍自拍色图片| 亚洲福利午夜久久久精品电影网| 岛国免费大片在线观看| 不卡一区一区三区在线| 91色老99久久九九爱精品| 青青青激情在线观看视频| 2021最新热播中文字幕| 美女福利视频网址导航| 伊人日日日草夜夜草| 精品一区二区三四区| 国产黄色片在线收看| 日韩精品啪啪视频一道免费| 五十路熟女人妻一区二| 色哟哟国产精品入口| 亚洲成人三级在线播放| 欧美viboss性丰满| 青青草精品在线视频观看| 在线免费观看国产精品黄色| 亚洲欧美久久久久久久久| 天天躁日日躁狠狠躁av麻豆| 午夜在线精品偷拍一区二| 在线观看免费视频色97| 福利视频一区二区三区筱慧| 青青草精品在线视频观看| 国产视频网站国产视频| 亚洲国产精品久久久久久6| 好吊视频—区二区三区| 欧美日韩激情啪啪啪| 久久三久久三久久三久久| 日本熟妇一区二区x x| 精品国产成人亚洲午夜| 在线免费91激情四射| 精品亚洲在线免费观看| 久草电影免费在线观看| 国产三级精品三级在线不卡| 粉嫩av蜜乳av蜜臀| 亚洲一区二区三区精品乱码| 黄网十四区丁香社区激情五月天| 午夜蜜桃一区二区三区| 老熟妇凹凸淫老妇女av在线观看| 精品国产污污免费网站入口自| 国产高潮无码喷水AV片在线观看| 欧美国产亚洲中英文字幕| 视频一区 视频二区 视频| 香蕉片在线观看av| 啊啊啊想要被插进去视频| 精品国产污污免费网站入口自| 欧美va亚洲va天堂va| avjpm亚洲伊人久久| 全国亚洲男人的天堂| 午夜婷婷在线观看视频| 在线免费观看日本伦理| 成人性爱在线看四区| 女生自摸在线观看一区二区三区 | 人人超碰国字幕观看97| 欧美亚洲中文字幕一区二区三区| 综合国产成人在线观看| 人人妻人人澡人人爽人人dvl| 性欧美激情久久久久久久| 美日韩在线视频免费看| 天堂中文字幕翔田av| 欧美天堂av无线av欧美| 日本熟女精品一区二区三区| 可以在线观看的av中文字幕| 97年大学生大白天操逼| 欧美精产国品一二三产品价格| 欧美特色aaa大片| 国产第一美女一区二区三区四区| 久久国产精品精品美女| 97精品成人一区二区三区| 乱亲女秽乱长久久久| 在线不卡日韩视频播放| 一级黄片久久久久久久久| 初美沙希中文字幕在线| 少妇系列一区二区三区视频| 青草久久视频在线观看| 国产精品3p和黑人大战| 日韩激情文学在线视频| 初美沙希中文字幕在线| 亚洲欧美综合另类13p| 1区2区3区不卡视频| 18禁免费av网站| 一区二区三区四区视频| 欧美va不卡视频在线观看| 午夜福利资源综合激情午夜福利资| 黄色三级网站免费下载| 亚洲va天堂va国产va久| 欧美地区一二三专区| 国产极品美女久久久久久| 亚洲女人的天堂av| 久久亚洲天堂中文对白| 在线视频免费观看网| 五十路老熟女码av| 激情啪啪啪啪一区二区三区| 青青青青青青草国产| 亚洲中文字幕校园春色| 91精品视频在线观看免费| 鸡巴操逼一级黄色气| gogo国模私拍视频| 偷青青国产精品青青在线观看| 五十路熟女av天堂| 人妻素人精油按摩中出| 国产麻豆国语对白露脸剧情| 国产精品久久9999| 青青青国产片免费观看视频| 日韩亚洲高清在线观看| 狠狠的往里顶撞h百合| 91国内视频在线观看| 摧残蹂躏av一二三区| 亚洲成人熟妇一区二区三区| 欧美精品激情在线最新观看视频| 欧美亚洲少妇福利视频| 国产精品入口麻豆啊啊啊| 成人午夜电影在线观看 久久| 91香蕉成人app下载| 国产黄网站在线观看播放| 日本又色又爽又黄又粗| 中文字幕一区的人妻欧美日韩| 久草视频在线一区二区三区资源站| 国产日韩欧美视频在线导航| 偷拍自拍福利视频在线观看| 欧美精产国品一二三产品区别大吗| 日本三极片中文字幕| 噜噜色噜噜噜久色超碰| 亚洲综合另类欧美久久| 成人亚洲精品国产精品| 中文字幕 亚洲av| 中文字幕无码一区二区免费 | 日比视频老公慢点好舒服啊| 久草视频在线免播放| 中文字幕乱码人妻电影| 三级黄色亚洲成人av| 国产精品成人xxxx| 在线免费观看黄页视频| 婷婷午夜国产精品久久久| 日韩少妇人妻精品无码专区| 亚洲欧美综合另类13p| 中文字幕在线观看国产片| 久久精品国产亚洲精品166m| 中国熟女@视频91| 在线免费观看靠比视频的网站| 黑人解禁人妻叶爱071| 欧美少妇性一区二区三区| 天天日天天做天天日天天做| 日韩一区二区三区三州| 首之国产AV医生和护士小芳| 国产精品自拍视频大全| 自拍偷拍vs一区二区三区| 91麻豆精品91久久久久同性| 中文字幕,亚洲人妻| 四川五十路熟女av| 午夜在线一区二区免费| 99re6热在线精品| 91人妻人人做人人爽在线| 粉嫩欧美美人妻小视频| 任你操任你干精品在线视频| 天天操天天爽天天干| 91免费观看国产免费| 91国内精品自线在拍白富美| 成人亚洲国产综合精品| 天干天天天色天天日天天射| 伊人成人在线综合网| 夜色17s精品人妻熟女| 97青青青手机在线视频| 97香蕉碰碰人妻国产樱花| 在线观看911精品国产| 亚洲国产欧美国产综合在线| 精品黑人一区二区三区久久国产 | 天天日夜夜操天天摸| 午夜青青草原网在线观看| 黑人大几巴狂插日本少妇| 综合一区二区三区蜜臀| asmr福利视频在线观看| 在线视频国产欧美日韩| 大黑人性xxxxbbbb| 40道精品招牌菜特色| 午夜美女少妇福利视频| 男人操女人的逼免费视频| 99精品视频在线观看免费播放 | 精品人妻伦一二三区久| 美女大bxxxx内射| 三级黄色亚洲成人av| 一区二区熟女人妻视频| 夜夜操,天天操,狠狠操| 国产久久久精品毛片| 女警官打开双腿沦为性奴| 亚洲午夜福利中文乱码字幕| 欧美性感尤物人妻在线免费看| 亚洲 欧美 精品 激情 偷拍 | 日韩三级黄色片网站| 日本午夜福利免费视频| 精品日产卡一卡二卡国色天香 | 国内自拍第一页在线观看| 淫秽激情视频免费观看| 57pao国产一区二区| 特黄老太婆aa毛毛片| 成年人免费看在线视频| 婷婷激情四射在线观看视频| 国产精品三级三级三级| 亚洲一区二区三区精品视频在线| 亚洲一区二区三区五区| 中文字幕人妻被公上司喝醉在线| 中文字幕,亚洲人妻| 亚洲精品国产久久久久久| 国产1区,2区,3区| 一个色综合男人天堂| 人妻3p真实偷拍一二区| 久久久久久久99精品| 人妻少妇亚洲一区二区| 欧美一区二区三区四区性视频| 1769国产精品视频免费观看| 精品91高清在线观看| 成人免费毛片aaaa| 直接能看的国产av| 久久久久久性虐视频| 专门看国产熟妇的网站| 天天日天天日天天射天天干| 99精品视频在线观看免费播放| 在线观看免费岛国av| 超碰公开大香蕉97| 婷婷久久久久深爱网| 2022精品久久久久久中文字幕| 亚洲第17页国产精品| 亚洲av在线观看尤物| 一区国内二区日韩三区欧美| 久久久久久性虐视频| mm131美女午夜爽爽爽| 亚洲成av人无码不卡影片一| 天天干天天操天天爽天天摸 | 美女张开两腿让男人桶av| 视频在线免费观看你懂得| 欧美偷拍亚洲一区二区| 熟女视频一区,二区,三区| chinese国产盗摄一区二区| 熟妇一区二区三区高清版| 熟女人妻在线中出观看完整版 | 91免费观看在线网站| 一区二区三区蜜臀在线| 午夜久久久久久久精品熟女| av手机免费在线观看高潮| av久久精品北条麻妃av观看| 黄色在线观看免费观看在线| 国产精品精品精品999| 亚洲成av人无码不卡影片一| 夜色福利视频在线观看| 日本真人性生活视频免费看| 日本欧美视频在线观看三区| 深夜男人福利在线观看| 青青青视频自偷自拍38碰| 午夜精品福利91av| rct470中文字幕在线| 一本一本久久a久久精品综合不卡| 亚洲av自拍偷拍综合| 巨乳人妻日下部加奈被邻居中出 | 亚洲少妇高潮免费观看| 97精品成人一区二区三区 | 一区二区三区四区视频| 成人H精品动漫在线无码播放| 全国亚洲男人的天堂| 亚洲av香蕉一区区二区三区犇| 日韩成人性色生活片| 亚洲av日韩av网站| 91啪国自产中文字幕在线| 亚洲精品欧美日韩在线播放| 亚洲成人熟妇一区二区三区| 日本熟妇一区二区x x| 亚洲熟妇无码一区二区三区| 天天操天天操天天碰| 成人动漫大肉棒插进去视频| 国产精品熟女久久久久浪潮| av天堂中文字幕最新| 亚洲熟妇久久无码精品| 久久一区二区三区人妻欧美| 99的爱精品免费视频| 色综合久久无码中文字幕波多| 在线观看的a站 最新| av中文字幕在线观看第三页| 二区中出在线观看老师| 超级av免费观看一区二区三区| 男女啪啪啪啪啪的网站| 噜噜色噜噜噜久色超碰| 搡老熟女一区二区在线观看| 成人免费公开视频无毒 | 黄色资源视频网站日韩| 岳太深了紧紧的中文字幕| 亚洲国产欧美国产综合在线| 久久精品国产23696| 国产成人精品福利短视频| 97人妻夜夜爽二区欧美极品| 播放日本一区二区三区电影|