国产无遮挡裸体免费直播视频,久久精品国产蜜臀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)文章

最新評論

中文字幕最新久久久| 久久99久久99精品影院| 在线免费91激情四射| 国产剧情演绎系列丝袜高跟| av天堂加勒比在线| 91精品资源免费观看| 久草极品美女视频在线观看| 偷拍3456eee| 国产揄拍高清国内精品对白| 亚洲欧美国产综合777| 青青青爽视频在线播放| 伊人成人在线综合网| 国产乱子伦一二三区| 91福利视频免费在线观看| 精产国品久久一二三产区区别 | 黄色黄色黄片78在线| 97人人妻人人澡人人爽人人精品| 亚洲av自拍天堂网| 婷婷久久一区二区字幕网址你懂得| 亚洲精品ww久久久久久| 国产自拍黄片在线观看| 免费av岛国天堂网站| 亚洲国产成人在线一区| 国产变态另类在线观看| 亚洲自拍偷拍综合色| 91快播视频在线观看| 中文字幕午夜免费福利视频| 91久久人澡人人添人人爽乱| 精品一区二区三区在线观看| 欧美日韩不卡一区不区二区| 区一区二区三国产中文字幕| 亚洲av日韩av第一区二区三区| 中国熟女@视频91| 久久久久久国产精品| 超碰97免费人妻麻豆| av成人在线观看一区| 日本免费一级黄色录像| 成年人黄视频在线观看| 国产老熟女伦老熟妇ⅹ| 大陆胖女人与丈夫操b国语高清| 日噜噜噜夜夜噜噜噜天天噜噜噜| 78色精品一区二区三区| 搞黄色在线免费观看| 一区二区三区国产精选在线播放| 自拍 日韩 欧美激情| 密臀av一区在线观看| 大屁股熟女一区二区三区| 狠狠躁夜夜躁人人爽天天天天97| 久久久久久性虐视频| 国产综合视频在线看片| asmr福利视频在线观看| 美女 午夜 在线视频| 久久久超爽一二三av| 黄色的网站在线免费看| 亚洲 欧美 精品 激情 偷拍| 男女啪啪视频免费在线观看| 激情人妻校园春色亚洲欧美| 亚洲狠狠婷婷综合久久app| 女同互舔一区二区三区| 亚洲区美熟妇久久久久| 男女之间激情网午夜在线| 国产精品午夜国产小视频| mm131美女午夜爽爽爽| 日韩激情文学在线视频| 中字幕人妻熟女人妻a62v网| av中文字幕在线观看第三页 | 特黄老太婆aa毛毛片| 成人性黑人一级av| 午夜婷婷在线观看视频| 亚洲欧美一区二区三区电影| 久久综合老鸭窝色综合久久| 久久久精品国产亚洲AV一| 女人精品内射国产99| 97精品视频在线观看| 中文亚洲欧美日韩无线码| 日本人妻精品久久久久久| 亚洲欧美一区二区三区爱爱动图| 国产使劲操在线播放| 在线免费观看国产精品黄色| 午夜精品一区二区三区福利视频| 九一传媒制片厂视频在线免费观看| 一区二区三区四区中文| 宅男噜噜噜666国产| 青草亚洲视频在线观看| 在线观看av2025| 99热这里只有精品中文| 中文字幕人妻一区二区视频| 欧美成人小视频在线免费看| 国产av一区2区3区| 久久久久久国产精品| caoporm超碰国产| 特级欧美插插插插插bbbbb| 亚洲一区二区三区五区| 熟女人妻一区二区精品视频| 久久精品在线观看一区二区| 五色婷婷综合狠狠爱| 美女av色播在线播放| 日韩欧美高清免费在线| 亚洲麻豆一区二区三区| 黄片三级三级三级在线观看| 女同性ⅹxx女同hd| 午夜在线一区二区免费| av天堂加勒比在线| 日本成人一区二区不卡免费在线| 动漫美女的小穴视频| 手机看片福利盒子日韩在线播放| 91九色porny蝌蚪国产成人| 日本后入视频在线观看| 熟女人妻三十路四十路人妻斩| 日本女人一级免费片| 亚洲嫩模一区二区三区| 一二三中文乱码亚洲乱码one | 亚洲精品一区二区三区老狼| 国产性色生活片毛片春晓精品| 国产精品久久综合久久| 美女福利写真在线观看视频| 天堂av在线最新版在线| okirakuhuhu在线观看| jiujiure精品视频在线| 午夜场射精嗯嗯啊啊视频| 91精品国产麻豆国产| 免费十精品十国产网站| 狠狠地躁夜夜躁日日躁| 亚洲高清免费在线观看视频| eeuss鲁片一区二区三区| 天天干天天操天天摸天天射| 美洲精品一二三产区区别| 性欧美激情久久久久久久| 亚洲免费成人a v| 91老熟女连续高潮对白| 国产中文精品在线观看| 青青青青爽手机在线| 一区二区三区久久久91| 91免费观看国产免费| 免费在线观看污污视频网站| 日本免费视频午夜福利视频| 5528327男人天堂| 97a片免费在线观看| 一区二区三区欧美日韩高清播放| 中文字幕综合一区二区| 亚洲欧美成人综合视频| 国产一级精品综合av| 又大又湿又爽又紧A视频| 日韩伦理短片在线观看| 精品日产卡一卡二卡国色天香 | tube69日本少妇| 亚洲免费成人a v| 天天色天天操天天透| 91www一区二区三区| 精品成人午夜免费看| 国产欧美精品一区二区高清 | 天天操天天插天天色| 亚洲精品午夜久久久久| 青青青青青手机视频| 亚洲日产av一区二区在线| 国产黄色片在线收看| 亚洲码av无色中文| 日韩欧美一级aa大片| 国产精品人妻66p| 偷拍自拍亚洲视频在线观看| 亚洲欧美综合另类13p| 欧美国产亚洲中英文字幕| 五色婷婷综合狠狠爱| 中文字幕中文字幕 亚洲国产| 啊啊啊视频试看人妻| 国产精品视频男人的天堂| 久久精品在线观看一区二区| 2019av在线视频| 欧美日韩亚洲国产无线码| 青青青青爽手机在线| 国产精品自偷自拍啪啪啪| 国产亚洲精品欧洲在线观看| 播放日本一区二区三区电影| 99热99re在线播放| 国产高清精品极品美女| 日韩美av高清在线| 国产在线拍揄自揄视频网站| 唐人色亚洲av嫩草| 制服丝袜在线人妻中文字幕| 女人精品内射国产99| huangse网站在线观看| 91小伙伴中女熟女高潮| 亚洲第一伊人天堂网| 久久精品视频一区二区三区四区| 亚洲av天堂在线播放| 亚洲精品乱码久久久久久密桃明| 自拍偷拍一区二区三区图片| 三级等保密码要求条款| 国产精品入口麻豆啊啊啊| 大骚逼91抽插出水视频| 日韩近亲视频在线观看| 天天操天天插天天色| 国产内射中出在线观看| 在线免费观看视频一二区| 亚洲av天堂在线播放| 日本丰满熟妇大屁股久久| 大鸡吧插逼逼视频免费看| 色婷婷综合激情五月免费观看| 国产 在线 免费 精品| 97精品人妻一区二区三区精品| 91久久国产成人免费网站| av在线观看网址av| 中文字幕一区二区三区蜜月| 女同互舔一区二区三区| 欧美精产国品一二三产品价格| 又粗又长 明星操逼小视频| 2020久久躁狠狠躁夜夜躁| 一色桃子久久精品亚洲| 阴茎插到阴道里面的视频| 青青草成人福利电影| 清纯美女在线观看国产| 特级欧美插插插插插bbbbb| 亚洲国际青青操综合网站| 人妻少妇中文有码精品| 人妻少妇亚洲精品中文字幕| 中文人妻AV久久人妻水| 日本a级视频老女人| 成人高潮aa毛片免费| 国产午夜亚洲精品不卡在线观看| 91麻豆精品91久久久久同性| 黄色在线观看免费观看在线| 少妇深喉口爆吞精韩国| 天天躁日日躁狠狠躁av麻豆| 国产精品精品精品999| ka0ri在线视频| av一区二区三区人妻| 成人影片高清在线观看| 欧美另类z0z变态| 91麻豆精品91久久久久同性| 大香蕉伊人国产在线| 日韩一区二区电国产精品| 日本少妇的秘密免费视频| 丝袜肉丝一区二区三区四区在线看| av中文字幕在线观看第三页| 日本性感美女写真视频| 国产精品国产三级国产精东| 亚洲欧美国产综合777| 日本少妇人妻xxxxx18| 中文字幕一区二区三区人妻大片| 亚洲国产欧美国产综合在线| 午夜av一区二区三区| 亚洲午夜电影之麻豆| 经典av尤物一区二区| 啊啊啊视频试看人妻| www,久久久,com| 亚洲熟女久久久36d| 天天色天天操天天舔| 欧美精品 日韩国产| 视频久久久久久久人妻| 久精品人妻一区二区三区| 99亚洲美女一区二区三区| av天堂加勒比在线| 亚洲一区二区三区久久受| 日日日日日日日日夜夜夜夜夜夜| 红杏久久av人妻一区| 超碰97免费人妻麻豆| 2022国产精品视频| 国产高清在线观看1区2区| 国产不卡av在线免费| japanese日本熟妇另类| 18禁美女羞羞免费网站| 精品人妻一二三区久久| 亚洲av一妻不如妾| 黑人乱偷人妻中文字幕| 天天摸天天亲天天舔天天操天天爽| av成人在线观看一区| 国产黄色片蝌蚪九色91| 人人人妻人人澡人人| 青青青青青操视频在线观看| 99av国产精品欲麻豆| 精品人妻每日一部精品| wwwxxx一级黄色片| 欧美老鸡巴日小嫩逼| 亚洲在线免费h观看网站| 无码国产精品一区二区高潮久久4| 粉嫩av懂色av蜜臀av| 久久农村老妇乱69系列| 揄拍成人国产精品免费看视频| 亚洲福利午夜久久久精品电影网| 国产黄色a级三级三级三级| tube69日本少妇| 全国亚洲男人的天堂| 含骚鸡巴玩逼逼视频| 中文字幕第三十八页久久| 国产精品久久久久网| 天天爽夜夜爽人人爽QC| 国产麻豆精品人妻av| 国产精品久久久久国产三级试频| 欧美日韩不卡一区不区二区| 日本午夜久久女同精女女| 国产夫妻视频在线观看免费| 天天操天天干天天艹| 一级A一级a爰片免费免会员| 密臀av一区在线观看| 91久久人澡人人添人人爽乱| 91‖亚洲‖国产熟女| 2017亚洲男人天堂| 极品性荡少妇一区二区色欲| 黄色中文字幕在线播放| 日本午夜爽爽爽爽爽视频在线观看 | 三级等保密码要求条款| 自拍偷拍vs一区二区三区| 大香蕉福利在线观看| 红杏久久av人妻一区| 国产又色又刺激在线视频| 欧洲日韩亚洲一区二区三区| 五十路在线观看完整版| 国产精品人妻66p| 欧美日韩高清午夜蜜桃大香蕉| 在线 中文字幕 一区| 激情五月婷婷免费视频| 中国熟女@视频91| 亚国产成人精品久久久| 偷拍美女一区二区三区| 欧美中文字幕一区最新网址| 日本男女操逼视频免费看| 涩爱综合久久五月蜜臀| 免费在线看的黄片视频| 色综合色综合色综合色| 欧洲欧美日韩国产在线| 日本美女性生活一级片| 超碰在线观看免费在线观看| 极品粉嫩小泬白浆20p主播| 中国黄片视频一区91| 日韩近亲视频在线观看| 青青在线视频性感少妇和隔壁黑丝| 97国产在线av精品| 一区二区免费高清黄色视频| 成人av天堂丝袜在线观看| 中出中文字幕在线观看 | 同居了嫂子在线播高清中文| 麻豆精品成人免费视频| 可以免费看的www视频你懂的| 日本在线不卡免费视频| 绝色少妇高潮3在线观看| 综合一区二区三区蜜臀| 在线免费观看日本伦理| 亚洲国产美女一区二区三区软件 | 老鸭窝在线观看一区| japanese五十路熟女熟妇| 亚洲男人在线天堂网| 国产妇女自拍区在线观看| 91在线视频在线精品3| 75国产综合在线视频| 91极品大一女神正在播放| 一区二区三区另类在线| 人人爱人人妻人人澡39| 九九视频在线精品播放| 首之国产AV医生和护士小芳| 欧美精品久久久久久影院| 青娱乐最新视频在线| 福利一二三在线视频观看| 熟女少妇激情五十路| 中文字幕之无码色多多| 午夜精品一区二区三区更新| 精品高潮呻吟久久av| 女同性ⅹxx女同h偷拍| 国产精品视频欧美一区二区| 天天操天天干天天日狠狠插| 91片黄在线观看喷潮| 国产在线免费观看成人| 天天插天天狠天天操| 色哟哟在线网站入口| 中文字日产幕乱六区蜜桃| 在线视频自拍第三页| 极品粉嫩小泬白浆20p主播| 操日韩美女视频在线免费看 | 亚洲男人在线天堂网| 成年人该看的视频黄免费| 干逼又爽又黄又免费的视频| 精品亚洲中文字幕av| 亚洲欧美综合在线探花| 中文字幕av一区在线观看| 66久久久久久久久久久| 国产精品一区二区三区蜜臀av | 欲满人妻中文字幕在线| 黑人乱偷人妻中文字幕| 好吊视频—区二区三区| 久久这里有免费精品| 美女小视频网站在线| 国产污污污污网站在线| 国产精品久久久久网| 久久久久久cao我的性感人妻| 3344免费偷拍视频| 日本三极片视频网站观看| 国产在线一区二区三区麻酥酥| 日本在线不卡免费视频| 日本性感美女写真视频| 国产亚洲视频在线二区| 大胸性感美女羞爽操逼毛片| 免费无毒热热热热热热久| 中国把吊插入阴蒂的视频| 人人爱人人妻人人澡39| 亚洲欧洲一区二区在线观看| 在线免费观看日本片| 91一区精品在线观看| 91色九色porny| 国产高清在线观看1区2区| 亚洲精品 日韩电影| 亚洲免费国产在线日韩| 欧洲黄页网免费观看| 亚洲欧美福利在线观看| 91www一区二区三区| 亚洲Av无码国产综合色区| 五月天色婷婷在线观看视频免费| 97超碰人人搞人人| 国产亚洲欧美45p| 一区二区三区另类在线| 可以在线观看的av中文字幕| 大香蕉伊人中文字幕| 东京热男人的av天堂| 久久久久久久精品成人热| 中文字幕 码 在线视频| 精品老妇女久久9g国产| 在线观看视频一区麻豆| 成人资源在线观看免费官网| 中文字幕中文字幕人妻| 夜夜嗨av蜜臀av| 玖玖一区二区在线观看| 成人伊人精品色xxxx视频| 2018在线福利视频| 国产精品自偷自拍啪啪啪| 国产白嫩美女一区二区| 精品国产成人亚洲午夜| 亚洲人妻30pwc| 国产日韩精品免费在线| 亚洲精品无码色午夜福利理论片| 日本丰满熟妇BBXBBXHD| 人妻久久久精品69系列| 午夜精品福利91av| 91久久国产成人免费网站| 亚洲精品午夜aaa久久| 不卡日韩av在线观看| 涩爱综合久久五月蜜臀| 天天草天天色天天干| 超级福利视频在线观看| 一区二区免费高清黄色视频| 色呦呦视频在线观看视频| 日美女屁股黄邑视频| 熟女少妇激情五十路| 国产高清在线在线视频| 玖玖一区二区在线观看| 丝袜亚洲另类欧美变态| 亚洲一区制服丝袜美腿| 十八禁在线观看地址免费| 人妻激情图片视频小说| 97年大学生大白天操逼| 91天堂天天日天天操| 国产黄色a级三级三级三级| 久久久久五月天丁香社区| av网站色偷偷婷婷网男人的天堂| 国产精品免费不卡av| 开心 色 六月 婷婷| 天干天天天色天天日天天射| 91p0rny九色露脸熟女| 岛国av高清在线成人在线| 丝袜美腿视频诱惑亚洲无| 中文字幕+中文字幕| 久久久噜噜噜久久熟女av| 中字幕人妻熟女人妻a62v网| 人妻久久久精品69系列| 国产中文精品在线观看| 少妇被强干到高潮视频在线观看| 青青伊人一精品视频| 美日韩在线视频免费看| 日韩剧情片电影在线收看| 亚洲天堂精品久久久| 青草亚洲视频在线观看| 亚洲成高清a人片在线观看| 欧亚日韩一区二区三区观看视频| 国产自拍在线观看成人| 在线免费91激情四射 | 18禁美女羞羞免费网站| 国产伦精品一区二区三区竹菊| 欧美aa一级一区三区四区| 91www一区二区三区| 黄色片年轻人在线观看| 好男人视频在线免费观看网站| 中文字幕熟女人妻久久久| 天天综合天天综合天天网| 99热碰碰热精品a中文| 久久精品在线观看一区二区| 91国产在线视频免费观看| 91色网站免费在线观看| 天堂av在线官网中文| 国产视频一区二区午夜| 亚洲午夜电影在线观看| 天天摸天天干天天操科普| 亚洲综合图片20p| 亚洲午夜伦理视频在线| 亚洲成人精品女人久久久| 扒开腿挺进肉嫩小18禁视频| 女同互舔一区二区三区| 被大鸡吧操的好舒服视频免费| 欧美精品激情在线最新观看视频| 国产va在线观看精品| 视频啪啪啪免费观看| 亚洲欧美成人综合视频| 懂色av之国产精品| 中文字幕日韩精品就在这里| 国产视频一区在线观看| 色婷婷精品大在线观看| 午夜青青草原网在线观看| 精彩视频99免费在线| 好吊操视频这里只有精品| 日韩精品二区一区久久| 人人妻人人澡人人爽人人dvl| 性色av一区二区三区久久久| 偷拍美女一区二区三区| 国产欧美精品不卡在线| 38av一区二区三区| 亚国产成人精品久久久| 日韩欧美制服诱惑一区在线| 久草视频首页在线观看| aⅴ五十路av熟女中出| 国产亚洲欧美另类在线观看| 91国语爽死我了不卡| 亚洲精品 日韩电影| 欧美日韩情色在线观看| 欧美视频中文一区二区三区| 红桃av成人在线观看| 男生用鸡操女生视频动漫| 人妻激情图片视频小说| 激情五月婷婷免费视频| 玩弄人妻熟妇性色av少妇| 亚洲男人在线天堂网| 999久久久久999| 亚洲区美熟妇久久久久| 在线观看视频网站麻豆| 51国产偷自视频在线播放| 午夜婷婷在线观看视频| 成人影片高清在线观看| 亚洲天天干 夜夜操| 97欧洲一区二区精品免费| 视频在线免费观看你懂得| 国产午夜无码福利在线看| 中文字幕av男人天堂| 国产欧美日韩在线观看不卡| 黄色av网站免费在线| 一区二区三区毛片国产一区| 91免费黄片可看视频| 91国内精品自线在拍白富美| 美洲精品一二三产区区别| 91桃色成人网络在线观看| 亚洲午夜高清在线观看| 绝色少妇高潮3在线观看| 久久久精品欧洲亚洲av| 最新日韩av传媒在线| caoporm超碰国产| 成人蜜桃美臀九一一区二区三区| 婷婷五月亚洲综合在线| 精品国产亚洲av一淫| 2021最新热播中文字幕| 一本久久精品一区二区| wwwxxx一级黄色片| 久久香蕉国产免费天天| 黄色成人在线中文字幕| 91九色国产porny蝌蚪| 成人蜜臀午夜久久一区| 天天日天天干天天插舔舔| 91国内视频在线观看| 国产欧美日韩在线观看不卡| 2020久久躁狠狠躁夜夜躁| 国产高清精品一区二区三区| 亚洲Av无码国产综合色区| 美女福利视频网址导航| 91精品视频在线观看免费| 精品首页在线观看视频| 亚洲av色香蕉一区二区三区 | 精品一线二线三线日本| 亚洲一级美女啪啪啪| 婷婷综合蜜桃av在线| 日韩美在线观看视频黄| 香港三日本三韩国三欧美三级| 日韩视频一区二区免费观看| 午夜免费体验区在线观看| www,久久久,com| 成人18禁网站在线播放| 97资源人妻免费在线视频| 一区二区三区四区五区性感视频| 青青青青青青青青青国产精品视频| 日本三极片视频网站观看| 端庄人妻堕落挣扎沉沦| 都市家庭人妻激情自拍视频| 人妻久久久精品69系列| 人妻少妇av在线观看| 欧亚乱色一区二区三区| 91国内精品久久久久精品一| 中文字幕av熟女人妻| 欧美色呦呦最新网址| 护士特殊服务久久久久久久| 亚洲久久午夜av一区二区| 欧美黑人巨大性xxxxx猛交| 加勒比视频在线免费观看| 欧美在线一二三视频| 91国产资源在线视频| 青娱乐最新视频在线| 亚洲美女美妇久久字幕组| 日曰摸日日碰夜夜爽歪歪| 好了av中文字幕在线| 国产极品精品免费视频| 久久精品国产亚洲精品166m| 91快播视频在线观看| 好了av中文字幕在线| 在线免费观看日本片| 亚洲天堂第一页中文字幕| 青青青青青青青青青国产精品视频| 精品av国产一区二区三区四区| 性欧美激情久久久久久久| 亚洲欧美色一区二区| 午夜毛片不卡免费观看视频| 人妻久久无码中文成人| 91综合久久亚洲综合| 欧美地区一二三专区| 色秀欧美视频第一页| 57pao国产一区二区| 精品91自产拍在线观看一区| 日本免费视频午夜福利视频| 天堂av在线最新版在线| 日韩美女综合中文字幕pp| 日本一本午夜在线播放| 亚洲一区二区激情在线| 久久久91蜜桃精品ad| gogo国模私拍视频| 丰满少妇翘臀后进式| 最新日韩av传媒在线| 91九色porny国产蝌蚪视频| 国产欧美精品不卡在线| 老鸭窝在线观看一区| 天天干天天操天天玩天天射 | 亚洲欧美综合另类13p| 精彩视频99免费在线| 国产三级影院在线观看| 日韩欧美国产精品91| 自拍偷拍 国产资源| 在线免费视频 自拍| 99国内小视频在现欢看| 97欧洲一区二区精品免费| 国产高清97在线观看视频| 91九色porny蝌蚪国产成人| 国产无遮挡裸体免费直播视频| 国产精品伦理片一区二区| 欧美少妇性一区二区三区| 中文字幕1卡1区2区3区| 亚洲精品久久综合久| 久久h视频在线观看| 1024久久国产精品| 最近的中文字幕在线mv视频| 大肉大捧一进一出好爽在线视频| 亚洲日产av一区二区在线 | 成人亚洲精品国产精品 | 在线亚洲天堂色播av电影| 亚洲人妻30pwc| 91www一区二区三区| 日本乱人一区二区三区| 国产一区二区火爆视频| 日本人妻欲求不满中文字幕| 亚洲免费国产在线日韩| 超碰公开大香蕉97| 欧美一区二区三区激情啪啪啪| 亚洲国产精品久久久久蜜桃| 黄色在线观看免费观看在线| 色噜噜噜噜18禁止观看| 亚洲区欧美区另类最新章节| 成熟熟女国产精品一区| 桃色视频在线观看一区二区| 亚洲午夜福利中文乱码字幕| brazzers欧熟精品系列| 天天日天天摸天天爱| 啪啪啪啪啪啪啪啪啪啪黄色| 韩国男女黄色在线观看| 国产高潮无码喷水AV片在线观看| 加勒比视频在线免费观看| 绝色少妇高潮3在线观看| 亚洲免费成人a v| 成人在线欧美日韩国产| 午夜影院在线观看视频羞羞羞| 动漫黑丝美女的鸡巴| 九九热99视频在线观看97| 午夜精品久久久久麻豆影视| 一区国内二区日韩三区欧美| 在线免费观看日本伦理| 国产成人午夜精品福利| 啊啊好大好爽啊啊操我啊啊视频 | brazzers欧熟精品系列| 97资源人妻免费在线视频| 3344免费偷拍视频| av新中文天堂在线网址| 久久三久久三久久三久久| 白嫩白嫩美女极品国产在线观看| 欧美日韩亚洲国产无线码| 亚洲成人av一区久久| 免费观看成年人视频在线观看| 伊人情人综合成人久久网小说 | 一色桃子久久精品亚洲| 欧美va不卡视频在线观看| 精品国产污污免费网站入口自 | 亚洲国产欧美国产综合在线| 亚洲一区制服丝袜美腿 | 精品欧美一区二区vr在线观看 | 最新激情中文字幕视频| 亚洲精品一区二区三区老狼| 久久综合老鸭窝色综合久久| 欧美精品激情在线最新观看视频| 青娱乐蜜桃臀av色| 成年人免费看在线视频| 91快播视频在线观看| 日本av在线一区二区三区| tube69日本少妇| 在线免费观看99视频| 亚洲av黄色在线网站| www天堂在线久久| 中文字幕一区二区三区蜜月| 欧美成人黄片一区二区三区 | 成人性爱在线看四区| 日韩国产乱码中文字幕| 人妻丝袜av在线播放网址| 91亚洲精品干熟女蜜桃频道| 内射久久久久综合网| 黄色片黄色片wyaa| 99精品视频在线观看婷婷| 天天干天天操天天玩天天射| 久久久制服丝袜中文字幕| 久久艹在线观看视频| 99久久超碰人妻国产| 久久久精品国产亚洲AV一| 爆乳骚货内射骚货内射在线| 婷婷色中文亚洲网68| 岛国免费大片在线观看| 亚洲欧美在线视频第一页| www日韩a级s片av| 真实国模和老外性视频| 91久久综合男人天堂| 欧美一区二区三区四区性视频| 亚洲 人妻 激情 中文| 99精品亚洲av无码国产另类| 久久精品国产亚洲精品166m| aⅴ精产国品一二三产品| 粗大的内捧猛烈进出爽大牛汉子| 日本美女成人在线视频| 免费看国产又粗又猛又爽又黄视频| 99久久激情婷婷综合五月天| 福利视频网久久91| 老师啊太大了啊啊啊尻视频| 日韩欧美一级黄片亚洲| 国产大鸡巴大鸡巴操小骚逼小骚逼| 欧美va不卡视频在线观看| 91国内视频在线观看| 久久精品亚洲成在人线a| 亚洲第17页国产精品| 国产又粗又黄又硬又爽| 黑人巨大精品欧美视频| 99精品视频之69精品视频 | 亚洲 欧美 自拍 偷拍 在线| chinese国产盗摄一区二区| 2021久久免费视频| 天天躁夜夜躁日日躁a麻豆| 538精品在线观看视频| 青青伊人一精品视频| 国产chinesehd精品麻豆| 天天躁夜夜躁日日躁a麻豆| 国产三级片久久久久久久 | 青青草人人妻人人妻| 国产精品自拍视频大全| 福利片区一区二体验区| 亚洲精品无码色午夜福利理论片| 天天躁日日躁狠狠躁躁欧美av| 亚洲伊人久久精品影院一美女洗澡| 精品久久婷婷免费视频| 任你操任你干精品在线视频| 国产久久久精品毛片| 初美沙希中文字幕在线| 中国老熟女偷拍第一页| 好太好爽好想要免费| 国产变态另类在线观看| 天天做天天爽夜夜做少妇| 亚洲区欧美区另类最新章节| av日韩在线观看大全| 日本又色又爽又黄又粗| 美女被肏内射视频网站| 国产亚洲精品视频合集| 一区国内二区日韩三区欧美| 日本一区精品视频在线观看| 香蕉av影视在线观看| 人妻少妇亚洲一区二区| 亚国产成人精品久久久| 日韩欧美国产一区ab| 欧美男同性恋69视频| 欧美日韩精品永久免费网址| 40道精品招牌菜特色| 日本成人不卡一区二区| 自拍 日韩 欧美激情| 天天躁日日躁狠狠躁av麻豆| 自拍偷区二区三区麻豆| 老鸭窝日韩精品视频观看| 51国产成人精品视频| 欧洲黄页网免费观看| 五十路人妻熟女av一区二区| 精品黑人一区二区三区久久国产| 亚洲成人情色电影在线观看| 经典亚洲伊人第一页| gay gay男男瑟瑟在线网站| 一级A一级a爰片免费免会员| 精品91自产拍在线观看一区| 黄色三级网站免费下载| 亚洲中文精品人人免费| 中文字幕 人妻精品| 97超碰国语国产97超碰| 青青青青青青青青青国产精品视频| 久久精品亚洲国产av香蕉| 一区二区三区的久久的蜜桃的视频 | 中文字幕在线视频一区二区三区| 护士特殊服务久久久久久久| 亚洲一区二区人妻av| 日本一区精品视频在线观看| 亚洲福利天堂久久久久久 | 亚洲欧美色一区二区| 蜜臀成人av在线播放| 欧美日韩高清午夜蜜桃大香蕉| 成人av电影免费版| 亚洲天堂精品久久久| 99热国产精品666| 欧美偷拍亚洲一区二区| 精内国产乱码久久久久久| 成人蜜桃美臀九一一区二区三区| 色综合久久久久久久久中文| 三级等保密码要求条款| 色呦呦视频在线观看视频| 国产伊人免费在线播放| 91成人精品亚洲国产| 亚洲国产第一页在线观看| 人妻久久久精品69系列| 国产精品黄大片在线播放| 国产精品久久久黄网站| 熟女在线视频一区二区三区| 91精品免费久久久久久| 亚洲欧美清纯唯美另类| 欧美日韩不卡一区不区二区| 五十路av熟女松本翔子| 久久久精品国产亚洲AV一| 欧洲日韩亚洲一区二区三区 | 91自产国产精品视频| 五十路熟女人妻一区二| 亚洲精品av在线观看| av在线免费观看亚洲天堂| 狠狠操操操操操操操操操| 91精品激情五月婷婷在线| av在线免费资源站| av男人天堂狠狠干| 神马午夜在线观看视频| 亚洲一区二区三区五区| 日韩成人综艺在线播放| 无码精品一区二区三区人| 亚欧在线视频你懂的| 欧美日韩一级黄片免费观看| 97瑟瑟超碰在线香蕉| 国产露脸对白在线观看| 欧美日韩情色在线观看| 岛国黄色大片在线观看| 2020国产在线不卡视频| 丝袜肉丝一区二区三区四区在线看| 日本一二三中文字幕| 亚洲在线一区二区欧美| 2018最新中文字幕在线观看| 青青在线视频性感少妇和隔壁黑丝 | 99久久99久国产黄毛片| 亚洲2021av天堂| 亚洲一区制服丝袜美腿| 激情国产小视频在线| 天天爽夜夜爽人人爽QC| 亚洲一区二区久久久人妻| 日本丰满熟妇大屁股久久| 五十路av熟女松本翔子| 欧美成人小视频在线免费看| 91精品高清一区二区三区| 天天躁日日躁狠狠躁躁欧美av| 大陆胖女人与丈夫操b国语高清| 93视频一区二区三区| 欧美一区二区三区激情啪啪啪| 亚洲少妇人妻无码精品| av老司机精品在线观看| av天堂中文字幕最新| 免费费一级特黄真人片| 成人精品视频99第一页| 中文字幕—97超碰网| 青青青青青操视频在线观看| 亚洲高清一区二区三区视频在线| 亚洲日本一区二区三区| 亚洲av在线观看尤物| 亚洲成人av在线一区二区| 欧美日韩熟女一区二区三区| 人人超碰国字幕观看97| 日韩成人免费电影二区| 又大又湿又爽又紧A视频| 视频一区二区综合精品| 国产精品久久久久久美女校花| 98视频精品在线观看| 亚洲公开视频在线观看| 人人妻人人爽人人澡人人精品| 性感美女福利视频网站| 国语对白xxxx乱大交| 2021国产一区二区| 日韩av有码中文字幕| 久久精品久久精品亚洲人| 国产97视频在线精品| 国产自拍在线观看成人| 日曰摸日日碰夜夜爽歪歪| 亚洲国产欧美国产综合在线| 综合色区亚洲熟妇shxstz| 狠狠鲁狠狠操天天晚上干干| 欧美色婷婷综合在线| 91久久综合男人天堂| 午夜在线精品偷拍一区二| 2020国产在线不卡视频 | 国产使劲操在线播放| 日韩不卡中文在线视频网站| 亚洲最大黄了色网站| 色综合久久无码中文字幕波多| 19一区二区三区在线播放| 亚洲天堂成人在线观看视频网站| 美女福利视频网址导航| 成人av电影免费版| 日曰摸日日碰夜夜爽歪歪| 日韩无码国产精品强奸乱伦| 国产精品久久久久久久久福交 | 日韩成人综艺在线播放| 偷拍3456eee| 一区二区三区欧美日韩高清播放| 国产片免费观看在线观看| 在线免费观看视频一二区| 人妻素人精油按摩中出| 日本性感美女写真视频| 一区二区三区欧美日韩高清播放| 好男人视频在线免费观看网站| 亚洲第一黄色在线观看| 亚洲成人情色电影在线观看| 亚洲精品 欧美日韩| 亚洲精品欧美日韩在线播放| 中文字幕在线第一页成人| 水蜜桃一区二区三区在线观看视频| 亚洲综合一区成人在线| 免费av岛国天堂网站| 一区二区三区麻豆福利视频| 国产精品3p和黑人大战| 日韩影片一区二区三区不卡免费| 国产综合精品久久久久蜜臀| xxx日本hd高清| ka0ri在线视频| 91亚洲手机在线视频播放| 91麻豆精品久久久久| 亚洲一级av大片免费观看| 日本高清在线不卡一区二区| 日韩亚洲高清在线观看| 在线播放 日韩 av| 4个黑人操素人视频网站精品91| 晚上一个人看操B片| 一级a看免费观看网站| 干逼又爽又黄又免费的视频| 大鸡巴插入美女黑黑的阴毛| 青青青爽视频在线播放| 欧美viboss性丰满| 亚洲精品欧美日韩在线播放| 欧美成人小视频在线免费看| 欧洲日韩亚洲一区二区三区| 激情国产小视频在线| 888亚洲欧美国产va在线播放| 亚洲av香蕉一区区二区三区犇| 青青热久免费精品视频在线观看 | 在线国产精品一区二区三区| 日本韩国在线观看一区二区| 啊啊好慢点插舔我逼啊啊啊视频| 亚洲成人熟妇一区二区三区 | 在线制服丝袜中文字幕| 成人国产影院在线观看| 激情伦理欧美日韩中文字幕| 精品久久婷婷免费视频| 五十路熟女人妻一区二| 天天爽夜夜爽人人爽QC| 摧残蹂躏av一二三区| 久久久久久9999久久久久| 大鸡吧插入女阴道黄色片| 2018最新中文字幕在线观看| 在线视频免费观看网| 91大神福利视频网| 91精品一区二区三区站长推荐| 5528327男人天堂| 一区二区三区日本伦理| 亚洲一区二区激情在线| 99久久超碰人妻国产| 91老师蜜桃臀大屁股| 国产露脸对白在线观看| 日本熟女精品一区二区三区| 国产精品国产三级国产午| 亚洲午夜福利中文乱码字幕| 99久久中文字幕一本人| 和邻居少妇愉情中文字幕| 国产高清在线观看1区2区| 97精品成人一区二区三区| 人妻无码中文字幕专区| 欧美成人黄片一区二区三区 | 国产精品三级三级三级| 9l人妻人人爽人人爽| 天天爽夜夜爽人人爽QC| 天天日天天透天天操| 91国产在线视频免费观看| 少妇人妻100系列| 精品亚洲中文字幕av | 青草久久视频在线观看| 在线免费91激情四射| 亚洲午夜电影之麻豆| 老鸭窝日韩精品视频观看| 99国内小视频在现欢看| 日韩一区二区三区三州| 国产乱子伦一二三区| 久久久久只精品国产三级| 第一福利视频在线观看| 日视频免费在线观看| 国产视频在线视频播放| 大香蕉福利在线观看| 在线观看免费视频网| 国产欧美精品一区二区高清| 日本熟女精品一区二区三区| 国产一区二区在线欧美| 中文字幕亚洲中文字幕| 色婷婷久久久久swag精品| 亚洲一区二区久久久人妻| 婷婷色中文亚洲网68| aaa久久久久久久久| 北条麻妃肉色丝袜视频| 又色又爽又黄又刺激av网站| 五十路在线观看完整版| 免费高清自慰一区二区三区网站| 亚洲精品高清自拍av| 亚洲国产香蕉视频在线播放| 久久久制服丝袜中文字幕| 91精品一区二区三区站长推荐| 天天操天天干天天艹| 国产亚洲视频在线观看| 三级黄色亚洲成人av| 国产高清女主播在线| 亚洲一区二区三区偷拍女厕91| 777奇米久久精品一区| 偷拍自拍福利视频在线观看| 人妻少妇av在线观看| 又粗又硬又猛又爽又黄的| 经典国语激情内射视频| 国产高清97在线观看视频| 亚洲熟女久久久36d| 日本真人性生活视频免费看| 中文字幕在线一区精品| 精品亚洲国产中文自在线| av中文字幕国产在线观看| 小穴多水久久精品免费看| 一区二区三区综合视频| 被大鸡吧操的好舒服视频免费| 色婷婷精品大在线观看| 最新激情中文字幕视频| 操的小逼流水的文章| 日本午夜福利免费视频| 亚洲美女美妇久久字幕组| 直接观看免费黄网站| 国产亚洲视频在线二区| 国产精品3p和黑人大战| 中文字幕av一区在线观看| 成人亚洲精品国产精品| 久久丁香花五月天色婷婷| 91精品视频在线观看免费| 99精品国产aⅴ在线观看| 久久久久久久精品老熟妇| 青青伊人一精品视频| mm131美女午夜爽爽爽| 精品一区二区亚洲欧美| 97精品综合久久在线| 伊人日日日草夜夜草| 欧美黑人与人妻精品| 欧美怡红院视频在线观看| 综合精品久久久久97| 夜鲁夜鲁狠鲁天天在线| 国产av自拍偷拍盛宴| 99久久激情婷婷综合五月天| 91麻豆精品91久久久久同性| 成人伊人精品色xxxx视频| 青青草视频手机免费在线观看| 国产欧美日韩在线观看不卡| 亚洲欧美在线视频第一页| 韩国黄色一级二级三级| 国产午夜男女爽爽爽爽爽视频 | 中文字幕在线第一页成人| 日本少妇高清视频xxxxx| 国产+亚洲+欧美+另类| 噜噜色噜噜噜久色超碰| 自拍偷拍亚洲另类色图| 快点插进来操我逼啊视频| 免费高清自慰一区二区三区网站| 亚洲黄色av网站免费播放| 亚洲 中文字幕在线 日韩| 成人30分钟免费视频| 成人av电影免费版| 大胆亚洲av日韩av| 国产女人叫床高潮大片视频| 久久www免费人成一看片| 一区二区三区美女毛片| 水蜜桃一区二区三区在线观看视频| 动漫美女的小穴视频| 区一区二区三国产中文字幕| 午夜国产福利在线观看| 亚洲欧美国产麻豆综合| av中文字幕在线导航| 欧洲国产成人精品91铁牛tv| 日本乱人一区二区三区| 国产麻豆剧传媒精品国产av蜜桃| 传媒在线播放国产精品一区| 国产成人午夜精品福利| 99热国产精品666| 亚洲欧美综合另类13p| 东京热男人的av天堂| 中文字幕av一区在线观看| 精品av国产一区二区三区四区| www久久久久久久久久久| 亚洲欧美激情中文字幕| 久久久久久久99精品| 狠狠的往里顶撞h百合| 一区二区三区美女毛片| 在线观看欧美黄片一区二区三区| 喷水视频在线观看这里只有精品 | 亚洲国产中文字幕啊啊啊不行了| 偷青青国产精品青青在线观看| 久久这里只有精彩视频免费| 一区二区在线观看少妇| yy96视频在线观看| 色呦呦视频在线观看视频| 超碰97人人澡人人| 不卡一不卡二不卡三| 91九色国产porny蝌蚪| av俺也去在线播放| 亚洲精品欧美日韩在线播放 | 亚洲va国产va欧美精品88| 国产精品午夜国产小视频| 色综合色综合色综合色| 亚洲另类综合一区小说| 国产超码片内射在线| 一区二区三区四区中文| 四虎永久在线精品免费区二区| 哥哥姐姐综合激情小说| 在线免费观看靠比视频的网站| 日本后入视频在线观看| 午夜在线一区二区免费| 欧美成人精品在线观看| 亚洲伊人av天堂有码在线| 99精品视频在线观看免费播放| 婷婷午夜国产精品久久久| 99精品一区二区三区的区| 国产精选一区在线播放| 日韩美女精品视频在线观看网站 | 欧美国产亚洲中英文字幕| 91欧美在线免费观看| 国产超码片内射在线| 成年人该看的视频黄免费| 亚洲欧美激情中文字幕| 国产 在线 免费 精品| 国产精品自拍在线视频| 亚洲视频在线观看高清| 97超碰免费在线视频| 中英文字幕av一区| 成人免费公开视频无毒| 国产伦精品一区二区三区竹菊| 888亚洲欧美国产va在线播放| 97成人免费在线观看网站| 懂色av之国产精品| av无限看熟女人妻另类av| 天天操天天射天天操天天天| 国产精品伦理片一区二区| 色婷婷久久久久swag精品| 日韩在线中文字幕色| 亚洲熟女综合色一区二区三区四区| 欲乱人妻少妇在线视频裸| 免费费一级特黄真人片| 2021最新热播中文字幕| 91精品激情五月婷婷在线| 1024久久国产精品| 成人影片高清在线观看| 999热精品视频在线| 国产丰满熟女成人视频| 日本精品视频不卡一二三| 精品久久久久久久久久久99| av男人天堂狠狠干| 久久艹在线观看视频| 精品久久久久久久久久中文蒉| 换爱交换乱高清大片| 亚洲欧美福利在线观看| 91av中文视频在线| 玩弄人妻熟妇性色av少妇| 蜜臀成人av在线播放| 国产精品久久久久久久久福交| 欧美地区一二三专区| 日韩午夜福利精品试看| 中文字母永久播放1区2区3区 | 一区二区三区另类在线| 国产精品黄色的av| 国产成人综合一区2区| av视屏免费在线播放| 91片黄在线观看喷潮| 熟女少妇激情五十路| av中文字幕国产在线观看| av亚洲中文天堂字幕网| 国产高清在线在线视频| 亚洲av自拍偷拍综合| 日本少妇高清视频xxxxx| 中文字幕一区二区亚洲一区| 91极品新人『兔兔』精品新作| 福利一二三在线视频观看| 老司机深夜免费福利视频在线观看| 亚洲国产欧美一区二区三区…| 在线不卡成人黄色精品| 久久机热/这里只有| 青青色国产视频在线| 亚洲熟色妇av日韩熟色妇在线| 日本精品一区二区三区在线视频。| yy96视频在线观看| 青青青青青青青青青国产精品视频| 亚洲午夜在线视频福利| 日本韩国亚洲综合日韩欧美国产| 午夜免费观看精品视频| 午夜在线一区二区免费| 国产亚洲欧美另类在线观看| 在线免费视频 自拍| 中文字幕视频一区二区在线观看| 国产妇女自拍区在线观看| 青青在线视频性感少妇和隔壁黑丝| 91精品国产麻豆国产| 人妻丝袜av在线播放网址| 在线观看av亚洲情色| 少妇高潮一区二区三区| 特级无码毛片免费视频播放| 91精品综合久久久久3d动漫| 亚洲 中文字幕在线 日韩| 成人网18免费视频版国产| 久久永久免费精品人妻专区| 国产精品亚洲在线观看| 青青青青青青草国产| 午夜精品福利91av| 中文字幕之无码色多多| 日本少妇在线视频大香蕉在线观看 | 午夜激情高清在线观看| 一区二区三区av高清免费| 激情小视频国产在线| 人妻少妇中文有码精品| 东京热男人的av天堂| 中文 成人 在线 视频| 日韩av免费观看一区| av日韩在线观看大全| 边摸边做超爽毛片18禁色戒 | 美日韩在线视频免费看| 亚洲av日韩高清hd| 超污视频在线观看污污污 | 在线观看免费视频色97| 99的爱精品免费视频| 青青青青在线视频免费观看| 高清一区二区欧美系列| 自拍偷区二区三区麻豆| 青青在线视频性感少妇和隔壁黑丝 | 91啪国自产中文字幕在线| 岛国黄色大片在线观看| 亚洲狠狠婷婷综合久久app| 国产高清在线观看1区2区| 性色蜜臀av一区二区三区| 91色网站免费在线观看| 精品国产成人亚洲午夜| 亚洲综合在线视频可播放| 精品老妇女久久9g国产| 日韩欧美一级精品在线观看| 中文乱理伦片在线观看| 后入美女人妻高清在线| 中文字幕在线乱码一区二区| 国产欧美精品一区二区高清| 欧美精品一区二区三区xxxx| 在线播放一区二区三区Av无码| 国产乱子伦一二三区| 2018在线福利视频| 一区二区麻豆传媒黄片| yy6080国产在线视频| 日韩欧美一级精品在线观看| 不卡精品视频在线观看| 国产精品精品精品999| 亚洲熟妇无码一区二区三区| 日本三极片视频网站观看| 亚洲蜜臀av一区二区三区九色| 一区二区视频在线观看免费观看| 99久久超碰人妻国产| 丰满的子国产在线观看| 天天操天天干天天插| 亚洲精品麻豆免费在线观看| 丰满熟女午夜福利视频| 欧美视频中文一区二区三区| 在线观看日韩激情视频| 人人爽亚洲av人人爽av| 美女视频福利免费看| 欧美日韩情色在线观看| 热久久只有这里有精品| 国产亚洲精品品视频在线| brazzers欧熟精品系列| 97少妇精品在线观看| 成人区人妻精品一区二视频| 五十路在线观看完整版| 亚洲一区二区三区av网站| 亚洲精品麻豆免费在线观看| 免费观看成年人视频在线观看| 日本韩国免费福利精品| 中英文字幕av一区| 黄片大全在线观看观看| 午夜国产免费福利av| 1区2区3区4区视频在线观看| 色97视频在线播放| 精品亚洲在线免费观看| 精品久久久久久久久久中文蒉| 亚洲中文字字幕乱码| 岛国毛片视频免费在线观看| www,久久久,com| 亚洲一区久久免费视频| 污污小视频91在线观看| 亚洲欧美成人综合视频| 亚洲高清国产自产av| 又大又湿又爽又紧A视频| 在线播放一区二区三区Av无码| 美女福利视频网址导航| 日本美女性生活一级片| 亚洲av人人澡人人爽人人爱| 亚洲熟妇x久久av久久| 美洲精品一二三产区区别| 2021年国产精品自拍| 青青青青青青青在线播放视频| 99精品国自产在线人| 天天草天天色天天干| 五十路丰满人妻熟妇| 亚洲粉嫩av一区二区三区| 日本午夜久久女同精女女| 黄色录像鸡巴插进去| 加勒比视频在线免费观看| 黑人乱偷人妻中文字幕| 2o22av在线视频| 91在线视频在线精品3| 91九色porny国产蝌蚪视频| 美女骚逼日出水来了| 91精品国产综合久久久蜜| 国产精品久久久黄网站| 亚洲天堂成人在线观看视频网站| 亚洲一级美女啪啪啪| 日韩影片一区二区三区不卡免费| av手机免费在线观看高潮| 日本av高清免费网站| 国产福利在线视频一区| 18禁美女无遮挡免费| 亚洲中文字幕校园春色| 可以免费看的www视频你懂的| 黑人3p华裔熟女普通话| 日美女屁股黄邑视频| 天堂资源网av中文字幕| 国产精品中文av在线播放| 色综合久久五月色婷婷综合| av网址在线播放大全| 大胆亚洲av日韩av| 91中文字幕最新合集| 亚洲成人三级在线播放 | 国产在线免费观看成人| 护士特殊服务久久久久久久| 92福利视频午夜1000看| 天天干天天操天天玩天天射| 久久综合老鸭窝色综合久久| 中文字幕最新久久久| 欧美日韩亚洲国产无线码| 中文字幕无码日韩专区免费| 亚洲中文字幕国产日韩| 女同互舔一区二区三区| 美味人妻2在线播放| 可以在线观看的av中文字幕| 国产激情av网站在线观看| 国产成人午夜精品福利| 天天日夜夜操天天摸| 成人影片高清在线观看| 97欧洲一区二区精品免费| 老熟妇凹凸淫老妇女av在线观看| 国产妇女自拍区在线观看| 亚洲精品高清自拍av| 国产一区二区火爆视频| 91在线视频在线精品3| 久久久久五月天丁香社区| 97精品视频在线观看| 国产黄色片蝌蚪九色91| 熟女少妇激情五十路| 57pao国产一区二区| 国产大学生援交正在播放| 好吊操视频这里只有精品| 边摸边做超爽毛片18禁色戒| 9久在线视频只有精品| 国产精品久久久久久久久福交| 大鸡吧插逼逼视频免费看 | 亚洲精品麻豆免费在线观看 | 91精品一区二区三区站长推荐| 国产在线观看免费人成短视频| 性生活第二下硬不起来| 亚洲男人在线天堂网| 亚洲综合一区成人在线| 少妇ww搡性bbb91| 在线成人日韩av电影| 亚洲人一区二区中文字幕| 婷婷午夜国产精品久久久| 国产中文精品在线观看| 免费成人va在线观看| 在线亚洲天堂色播av电影| 在线免费观看99视频| 久久久久久久一区二区三| 亚洲欧美久久久久久久久| 青青青青青免费视频| 在线观看911精品国产| 偷拍自拍国产在线视频| 天天爽夜夜爽人人爽QC| 天天干天天操天天爽天天摸| 青青色国产视频在线| 女同久久精品秋霞网| 日本韩国在线观看一区二区| 亚洲一级av无码一级久久精品| 久久丁香婷婷六月天| 老司机免费福利视频网| 2o22av在线视频| 精品91高清在线观看| 99的爱精品免费视频| 青青青青青免费视频| 少妇人妻100系列| 亚洲视频乱码在线观看| 少妇露脸深喉口爆吞精| 成年人啪啪视频在线观看| 宅男噜噜噜666免费观看| 2020韩国午夜女主播在线| 伊人综合免费在线视频| 在线视频国产欧美日韩| 成人网18免费视频版国产| 人人妻人人澡人人爽人人dvl| 日本脱亚入欧是指什么| 亚洲天堂精品福利成人av| 欧美乱妇无乱码一区二区| 91福利在线视频免费观看| 男生舔女生逼逼视频| 国产高潮无码喷水AV片在线观看| 在线观看国产网站资源| 日韩特级黄片高清在线看| 国产va精品免费观看 | 国产V亚洲V天堂无码欠欠| 国产女孩喷水在线观看| 日韩三级电影华丽的外出| 久碰精品少妇中文字幕av| 国产日韩欧美视频在线导航| 国产精品伦理片一区二区| 98视频精品在线观看| 成年人中文字幕在线观看| 神马午夜在线观看视频| 福利视频一区二区三区筱慧 | 538精品在线观看视频| 人人妻人人人操人人人爽| 欧美黑人与人妻精品| 亚洲一区二区三区精品乱码| 2022精品久久久久久中文字幕| 天天爽夜夜爽人人爽QC| 好吊操视频这里只有精品| 99精品视频在线观看免费播放 | 端庄人妻堕落挣扎沉沦| 国产精品入口麻豆啊啊啊| 五月激情婷婷久久综合网| 一区二区熟女人妻视频| 天天摸天天干天天操科普| 成年人黄色片免费网站| 成人区人妻精品一区二视频| 首之国产AV医生和护士小芳| 成人影片高清在线观看| 熟女国产一区亚洲中文字幕| 国产欧美日韩第三页| 欧亚日韩一区二区三区观看视频| 天天日天天做天天日天天做| 精品一区二区三区午夜| 99av国产精品欲麻豆| 亚洲中文字幕国产日韩| 二区中出在线观看老师| 中文字幕高清资源站| 久久这里只有精彩视频免费| 可以在线观看的av中文字幕| 97青青青手机在线视频 | 婷婷久久久综合中文字幕| 天天色天天操天天舔| 啪啪啪操人视频在线播放| 亚洲av无乱一区二区三区性色| 亚洲图片偷拍自拍区| 成人性黑人一级av| 天堂v男人视频在线观看| 97精品成人一区二区三区| 制丝袜业一区二区三区| 天天干天天日天天干天天操| 大骚逼91抽插出水视频| 99热久久这里只有精品8| 91在线视频在线精品3| 偷青青国产精品青青在线观看| 亚洲国产最大av综合| 动色av一区二区三区| 开心 色 六月 婷婷| 欧美乱妇无乱码一区二区| 亚洲熟妇久久无码精品| 91 亚洲视频在线观看| 性感美女福利视频网站| 视频久久久久久久人妻| 亚洲熟妇久久无码精品| 日视频免费在线观看| 91老师蜜桃臀大屁股| 91大屁股国产一区二区| 中文字幕最新久久久| 久久久久久99国产精品| 欧美亚洲国产成人免费在线| 最新的中文字幕 亚洲 | 午夜激情高清在线观看| 一本久久精品一区二区| 国产视频网站国产视频| 黑人巨大精品欧美视频| 亚洲熟色妇av日韩熟色妇在线| 欧美成人黄片一区二区三区| 天天干天天日天天谢综合156| 久久精品视频一区二区三区四区 | 偷拍自拍 中文字幕| 一区二区在线视频中文字幕| 含骚鸡巴玩逼逼视频| 亚洲av黄色在线网站| 北条麻妃av在线免费观看| caoporm超碰国产| 国产福利小视频免费观看| 色噜噜噜噜18禁止观看| 国产精品自拍偷拍a| 做爰视频毛片下载蜜桃视频1| 国产实拍勾搭女技师av在线| 女人精品内射国产99| 无套猛戳丰满少妇人妻| 黄片色呦呦视频免费看| 五十路人妻熟女av一区二区| 久草福利电影在线观看| 天天日天天爽天天干| 国产成人一区二区三区电影网站| 在线观看欧美黄片一区二区三区 | 亚洲最大黄 嗯色 操 啊| 成人av在线资源网站| brazzers欧熟精品系列| 亚洲一区二区三区偷拍女厕91| 在线免费91激情四射| 欧美精品欧美极品欧美视频| 国产aⅴ一线在线观看| av中文字幕电影在线看| 国产a级毛久久久久精品| 98精产国品一二三产区区别| 91亚洲国产成人精品性色| 人妻另类专区欧美制服| 班长撕开乳罩揉我胸好爽| 欧洲亚洲欧美日韩综合| 亚洲变态另类色图天堂网| 少妇系列一区二区三区视频| 色吉吉影音天天干天天操 | 亚洲熟女综合色一区二区三区四区| 国产av一区2区3区| 93精品视频在线观看| 女蜜桃臀紧身瑜伽裤| 国产高清精品一区二区三区| 欧美视频一区免费在线| 人妻无码色噜噜狠狠狠狠色| 97国产在线av精品| 熟女人妻在线观看视频| 久久久久久国产精品| 男大肉棒猛烈插女免费视频| 97人妻总资源视频| 免费十精品十国产网站| 999久久久久999| 亚洲国产在线精品国偷产拍| 免费福利av在线一区二区三区| 亚洲日本一区二区三区| 懂色av之国产精品| 精品国产污污免费网站入口自 | 最新97国产在线视频| 天堂av在线播放免费| 久久久久久久亚洲午夜综合福利| 热思思国产99re| 一区二区三区av高清免费| 成人高潮aa毛片免费| 九九热99视频在线观看97| 男女之间激情网午夜在线| 888亚洲欧美国产va在线播放| 青青草原色片网站在线观看| 天天日天天爽天天爽| 国产夫妻视频在线观看免费| 夏目彩春在线中文字幕| 熟女人妻在线观看视频| 国际av大片在线免费观看| 国产美女午夜福利久久| 欧美精品亚洲精品日韩在线| 婷婷色国产黑丝少妇勾搭AV| 日本免费一级黄色录像| 亚洲成人情色电影在线观看| 伊人开心婷婷国产av | 亚洲卡1卡2卡三卡四老狼| 国产成人精品av网站| 一区二区在线视频中文字幕| 亚洲欧洲一区二区在线观看| 懂色av蜜桃a v| 日韩三级电影华丽的外出| 久久麻豆亚洲精品av| 国产午夜无码福利在线看| 在线观看欧美黄片一区二区三区| 日韩亚国产欧美三级涩爱| 视频一区 视频二区 视频| 在线视频自拍第三页| 欧美精品国产综合久久| 国产午夜无码福利在线看| 狠狠躁狠狠爱网站视频| 亚洲精品久久综合久| 免费在线福利小视频| 亚洲精品一区二区三区老狼| 欧美亚洲自偷自拍 在线| 欧美在线一二三视频| 一色桃子久久精品亚洲| 日本女大学生的黄色小视频| 亚洲另类在线免费观看| 无套猛戳丰满少妇人妻| 18禁美女羞羞免费网站| 精品人人人妻人人玩日产欧| 亚洲综合自拍视频一区| 亚洲伊人久久精品影院一美女洗澡 | 亚洲综合自拍视频一区| 在线观看av2025| 久久久人妻一区二区| 中出中文字幕在线观看| 亚洲青青操骚货在线视频| 天天干天天操天天插天天日| 91精品视频在线观看免费| 四川五十路熟女av| 亚洲福利精品视频在线免费观看| 午夜在线观看一区视频| 社区自拍揄拍尻屁你懂的| 国产三级精品三级在线不卡| 99久久99一区二区三区| 久久久久久九九99精品| 精品91高清在线观看| 国产又粗又硬又猛的毛片视频| 亚洲第一黄色在线观看| 2018最新中文字幕在线观看| 男大肉棒猛烈插女免费视频 | 国产欧美精品一区二区高清 | 亚洲激情偷拍一区二区| 午夜精品一区二区三区4| 操日韩美女视频在线免费看| 爆乳骚货内射骚货内射在线| 国产精品成人xxxx| 38av一区二区三区| 国产精品自拍在线视频| av手机免费在线观看高潮| 成年人该看的视频黄免费| 2020av天堂网在线观看| 亚洲一区二区三区久久受| 美女骚逼日出水来了| 大香蕉福利在线观看| 亚洲av极品精品在线观看| 亚洲av色图18p| 天天操天天干天天插| 欧美日韩人妻久久精品高清国产| 国产黄色片在线收看| 美女被肏内射视频网站| 大白屁股精品视频国产| 久久99久久99精品影院| 亚洲一级特黄特黄黄色录像片| 又粗又长 明星操逼小视频| 欧美日韩不卡一区不区二区| 国产欧美精品一区二区高清| 中文字幕人妻熟女在线电影| 晚上一个人看操B片| 中文字幕免费在线免费| 欧洲国产成人精品91铁牛tv| 视频在线亚洲一区二区| 在线观看av2025| 亚洲精品欧美日韩在线播放 | 欧美老妇精品另类不卡片| 亚洲视频乱码在线观看| 黑人乱偷人妻中文字幕| 中出中文字幕在线观看| 日本韩国免费福利精品| 最后99天全集在线观看| 91国内视频在线观看| 懂色av蜜桃a v| 日韩欧美高清免费在线| 午夜精品福利91av| 午夜频道成人在线91| 午夜免费体验区在线观看| 绯色av蜜臀vs少妇| www日韩毛片av| 岛国免费大片在线观看| 美女张开两腿让男人桶av| 亚洲精品国产综合久久久久久久久| 成人av在线资源网站| 久久久久五月天丁香社区| 97国产福利小视频合集| 国产V亚洲V天堂无码欠欠| 国产一级精品综合av| 91精品视频在线观看免费| 国产精品自拍在线视频| 午夜精品九一唐人麻豆嫩草成人| 在线视频免费观看网| 国产高清精品一区二区三区| 久久www免费人成一看片| av老司机精品在线观看| 人妻丝袜av在线播放网址| 五十路熟女人妻一区二| 欧美天堂av无线av欧美| 亚洲美女美妇久久字幕组| 不卡日韩av在线观看| 91色秘乱一区二区三区| 2020av天堂网在线观看| 最新国产精品网址在线观看| 久久丁香婷婷六月天| 亚洲免费福利一区二区三区| 欧洲亚洲欧美日韩综合| 激情五月婷婷综合色啪| 国产va在线观看精品| www日韩毛片av| 国产91精品拍在线观看| 57pao国产一区二区| 大香蕉福利在线观看| 91小伙伴中女熟女高潮| 亚洲国产美女一区二区三区软件 | 人妻丝袜精品中文字幕| 又黄又刺激的午夜小视频| av网址国产在线观看| 天天插天天狠天天操| 亚洲久久午夜av一区二区| 秋霞午夜av福利经典影视| 美女大bxxxx内射| 亚洲中文字字幕乱码| 少妇人妻100系列| 大胸性感美女羞爽操逼毛片| 92福利视频午夜1000看| gay gay男男瑟瑟在线网站| 五月天色婷婷在线观看视频免费| 国产精品国色综合久久| 9国产精品久久久久老师| av网站色偷偷婷婷网男人的天堂| 国产午夜福利av导航| avjpm亚洲伊人久久| 欧美性受xx黑人性猛交| 国产精品人妻66p| 伊人网中文字幕在线视频| 日韩中文字幕在线播放第二页| 黄色在线观看免费观看在线| 亚洲国产成人最新资源| 男人操女人逼逼视频网站| 欧美精品中文字幕久久二区| 中文字幕av第1页中文字幕| 国产麻豆国语对白露脸剧情| 午夜精品一区二区三区城中村| 欧美一区二区三区久久久aaa| 青青操免费日综合视频观看| 玖玖一区二区在线观看| 亚洲av成人网在线观看| 男人天堂最新地址av| 男人的天堂一区二区在线观看| 啊啊好慢点插舔我逼啊啊啊视频| 好男人视频在线免费观看网站| 首之国产AV医生和护士小芳| 91精品免费久久久久久| 性感美女高潮视频久久久| 亚洲在线免费h观看网站| 亚洲免费av在线视频| 欧美黑人巨大性xxxxx猛交| 制丝袜业一区二区三区| 国产精品一区二区久久久av| 男人天堂色男人av| 久久人人做人人妻人人玩精品vr| 喷水视频在线观看这里只有精品 | 老司机福利精品视频在线| 久草视频在线免播放| av乱码一区二区三区| 欧美一区二区三区久久久aaa| 中文字幕av男人天堂| 亚洲无线观看国产高清在线| 成人国产影院在线观看| 自拍偷拍日韩欧美亚洲| 91国产在线视频免费观看| 97香蕉碰碰人妻国产樱花| 大鸡巴后入爆操大屁股美女| 一区二区三区久久久91| 天天草天天色天天干| av中文字幕福利网| 在线观看欧美黄片一区二区三区| 成人综合亚洲欧美一区| 大香蕉大香蕉在线看| 青青青青青青草国产| 国产黄网站在线观看播放| 蜜桃臀av蜜桃臀av| 天堂av在线官网中文| 欧美视频一区免费在线| 亚洲成av人无码不卡影片一| 九一传媒制片厂视频在线免费观看| 蜜桃臀av蜜桃臀av| 又大又湿又爽又紧A视频| 亚洲精品精品国产综合| 性欧美激情久久久久久久| 午夜精品福利91av| 国产精品久久综合久久| 18禁无翼鸟成人在线| 99国内精品永久免费视频| 国产品国产三级国产普通话三级| 91精品国产91久久自产久强| 天天干夜夜操啊啊啊| 97年大学生大白天操逼| 日视频免费在线观看| 日韩欧美国产一区不卡| 色av色婷婷人妻久久久精品高清 | 精品人妻伦一二三区久| 国产成人无码精品久久久电影 | 红桃av成人在线观看| 亚洲精品午夜aaa久久| 国产精品久久久久国产三级试频| 风流唐伯虎电视剧在线观看| 五十路熟女人妻一区二区9933| 亚洲av无码成人精品区辽| 日本在线一区二区不卡视频| 国产乱子伦一二三区| 小穴多水久久精品免费看| huangse网站在线观看| 农村胖女人操逼视频| 在线观看成人国产电影| 欧美精品黑人性xxxx| 成年午夜影片国产片| 亚洲一区制服丝袜美腿| 精品一区二区三四区| 一级黄色片夫妻性生活| 亚洲最大黄 嗯色 操 啊| 黄色片年轻人在线观看| 免费黄页网站4188| 亚洲视频在线观看高清| 国产三级影院在线观看| 在线播放一区二区三区Av无码| 亚洲成人av一区在线| 中文字幕av一区在线观看| 欧美日韩一区二区电影在线观看| 日本少妇人妻xxxxx18| 偷拍自拍视频图片免费| 欧美亚洲免费视频观看| 人人妻人人爽人人澡人人精品| 亚洲中文精品人人免费| 国产品国产三级国产普通话三级| 黄色中文字幕在线播放| 亚洲一区自拍高清免费视频| 这里只有精品双飞在线播放| 适合午夜一个人看的视频| 亚洲免费视频欧洲免费视频| 国产chinesehd精品麻豆| 久久免费看少妇高潮完整版| 在线观看的a站 最新| 欧美地区一二三专区| 啊用力插好舒服视频| 日本乱人一区二区三区| 97精品综合久久在线| 中文人妻AV久久人妻水| gav成人免费播放| 三上悠亚和黑人665番号| 欧美精品久久久久久影院| 一二三中文乱码亚洲乱码one| 中文字幕在线第一页成人| 亚洲午夜高清在线观看| 亚洲熟妇x久久av久久| 日视频免费在线观看| 中文字幕人妻av在线观看| 大鸡巴操b视频在线| 一区二区三区精品日本| 亚洲人人妻一区二区三区| 中文字幕国产专区欧美激情| 岳太深了紧紧的中文字幕| 啊用力插好舒服视频| 最近中文2019年在线看| 国产又大又黄免费观看| 午夜91一区二区三区| 亚洲综合一区成人在线| 午夜极品美女福利视频| 亚洲一级美女啪啪啪| 国产又粗又黄又硬又爽| 91免费福利网91麻豆国产精品| 中文字幕+中文字幕| 视频二区在线视频观看| 黄色黄色黄片78在线| 97青青青手机在线视频| 久久久久久久精品成人热| 一区二区熟女人妻视频| 天天日天天干天天舔天天射| 亚洲av无乱一区二区三区性色| av森泽佳奈在线观看| 精品久久久久久久久久久99| 91chinese在线视频| av在线shipin| 国产精选一区在线播放| 天天干天天插天天谢| 99精品视频之69精品视频| 国产亚洲国产av网站在线| 大鸡吧插入女阴道黄色片| 成年人黄色片免费网站| 国产日本精品久久久久久久| 开心 色 六月 婷婷| 青青社区2国产视频| 亚洲第17页国产精品| 亚洲一区av中文字幕在线观看| 大黑人性xxxxbbbb| 免费成人va在线观看| 狠狠的往里顶撞h百合| 在线 中文字幕 一区| av中文字幕国产在线观看| 中文字幕午夜免费福利视频| 一区二区三区四区视频| 天天综合天天综合天天网| 久久久久久性虐视频| 国产麻豆91在线视频| 一区二区三区久久中文字幕| 欧美精品伦理三区四区| 中国老熟女偷拍第一页| 色天天天天射天天舔| 亚洲视频在线观看高清| 欧洲黄页网免费观看| 欧美乱妇无乱码一区二区| 五月婷婷在线观看视频免费| 馒头大胆亚洲一区二区| 快点插进来操我逼啊视频| 亚洲精品久久综合久| 99久久99久国产黄毛片| 欧美 亚洲 另类综合| 久草视频在线看免费| 啊啊啊视频试看人妻| 日韩a级精品一区二区| 91人妻人人做人人爽在线| 夜色撩人久久7777| 美味人妻2在线播放| 91久久综合男人天堂| 国产黄色a级三级三级三级| 国产黄色大片在线免费播放| 在线视频自拍第三页| 亚洲嫩模一区二区三区| 国产内射中出在线观看| 免费一级黄色av网站| 精品国产在线手机在线| 国产亚州色婷婷久久99精品| 啊慢点鸡巴太大了啊舒服视频| 国产三级影院在线观看| 北条麻妃肉色丝袜视频| 欧洲日韩亚洲一区二区三区| 中文亚洲欧美日韩无线码| 天天日天天舔天天射进去| 国产视频一区在线观看| 午夜美女少妇福利视频| 日日夜夜精品一二三| 欧美一级片免费在线成人观看| 男生舔女生逼逼的视频| av新中文天堂在线网址| 国产欧美精品一区二区高清| 成年女人免费播放视频| 亚洲国产精品美女在线观看| 日韩北条麻妃一区在线| 国产极品美女久久久久久| 亚洲 欧美 精品 激情 偷拍| 天天摸天天亲天天舔天天操天天爽 | 天天艹天天干天天操| 黄色av网站免费在线| 阿v天堂2014 一区亚洲| 欧美黑人性猛交xxxxⅹooo| 天天草天天色天天干| 少妇高潮无套内谢麻豆| 国产黄色a级三级三级三级| 人妻凌辱欧美丰满熟妇| 蜜桃专区一区二区在线观看| 日韩伦理短片在线观看| 韩国女主播精品视频网站| 午夜在线观看一区视频| 一区二区三区久久久91| 国产精品一区二区三区蜜臀av| 白白操白白色在线免费视频| 国产高潮无码喷水AV片在线观看| 国产一区二区神马久久| 久草极品美女视频在线观看| 扒开让我视频在线观看| 亚洲成人三级在线播放| 亚洲视频乱码在线观看| 瑟瑟视频在线观看免费视频| 亚洲av可乐操首页| 韩国AV无码不卡在线播放| 国产日韩精品电影7777| 日本av高清免费网站| 国产欧美日韩在线观看不卡| 亚洲一级特黄特黄黄色录像片| 少妇人妻久久久久视频黄片| 青草亚洲视频在线观看| 国产日韩欧美视频在线导航| 97人妻无码AV碰碰视频| 不戴胸罩引我诱的隔壁的人妻| 99精品久久久久久久91蜜桃| 中文字幕 人妻精品| 人妻另类专区欧美制服| 精品人人人妻人人玩日产欧| 18禁美女黄网站色大片下载| 蜜桃精品久久久一区二区| 欧美中国日韩久久精品| 天堂v男人视频在线观看| av手机免费在线观看高潮| 国产日韩欧美美利坚蜜臀懂色| 熟女俱乐部一二三区| 91成人精品亚洲国产| 啪啪啪啪啪啪啪免费视频| 97资源人妻免费在线视频| 日韩人妻丝袜中文字幕| 嫩草aⅴ一区二区三区| 最新激情中文字幕视频| 国产精品国色综合久久 | 大鸡巴操b视频在线| 婷婷午夜国产精品久久久| 天天摸天天干天天操科普| 青青青视频自偷自拍38碰| 久久热这里这里只有精品| 男生用鸡操女生视频动漫 | 亚洲美女自偷自拍11页| 日韩欧美中文国产在线| 日本熟妇丰满厨房55| 亚洲精品一区二区三区老狼| 五十路熟女人妻一区二区9933| 亚洲欧洲av天堂综合| 国产一级精品综合av| 天天操天天干天天插| 偷拍自拍 中文字幕| 午夜精品一区二区三区福利视频| 一区二区三区日本伦理| 国产一区二区火爆视频| 91福利在线视频免费观看| 欧美黑人与人妻精品| 欲乱人妻少妇在线视频裸| 亚欧在线视频你懂的| 欧美一区二区中文字幕电影| 国产黑丝高跟鞋视频在线播放| 91久久人澡人人添人人爽乱| 国产成人精品av网站| 涩涩的视频在线观看视频| 亚洲综合一区二区精品久久| 视频一区 二区 三区 综合| 国产丰满熟女成人视频| 国产高清在线在线视频| 精品乱子伦一区二区三区免费播| 国产激情av网站在线观看| 国产精品黄片免费在线观看| 欧美日韩不卡一区不区二区| 搡老熟女一区二区在线观看| 亚洲高清一区二区三区视频在线| 香蕉aⅴ一区二区三区| 水蜜桃一区二区三区在线观看视频| 欧美日韩人妻久久精品高清国产 | 国产亚洲精品品视频在线| 午夜成午夜成年片在线观看 | 国产综合高清在线观看| 亚洲偷自拍高清视频| 久草视频在线一区二区三区资源站 | 91快播视频在线观看| 动漫黑丝美女的鸡巴| 精品欧美一区二区vr在线观看| 在线制服丝袜中文字幕| 免费在线看的黄网站| 亚洲 图片 欧美 图片| 婷婷激情四射在线观看视频| 久久这里有免费精品| 免费在线黄色观看网站| 青青青青青青青青青青草青青| 国产污污污污网站在线| 天堂va蜜桃一区入口| 啪啪啪18禁一区二区三区| 中文字幕一区二区人妻电影冢本| 亚洲av黄色在线网站| 亚洲综合一区成人在线| 免费av岛国天堂网站| 国产V亚洲V天堂无码欠欠| 92福利视频午夜1000看| 国产精品手机在线看片| 国产精品黄色的av| 日本a级视频老女人| 99精品视频之69精品视频| AV天堂一区二区免费试看| 在线免费观看视频一二区| 99一区二区在线观看| 绝色少妇高潮3在线观看| 久久久91蜜桃精品ad| 国产视频网站国产视频| 少妇一区二区三区久久久| 全国亚洲男人的天堂| 天天日天天鲁天天操| 亚洲欧美自拍另类图片| 五十路人妻熟女av一区二区| 岛国毛片视频免费在线观看| 在线观看黄色成年人网站| 后入美女人妻高清在线| 国产一区二区三免费视频| 精品老妇女久久9g国产| 亚洲2021av天堂| 成人av电影免费版| 亚洲成人国产综合一区| 国产97视频在线精品| 国产在线一区二区三区麻酥酥| 亚洲乱码中文字幕在线| 在线观看欧美黄片一区二区三区| 五月天中文字幕内射| 午夜精品福利91av| 在线观看欧美黄片一区二区三区 | 91 亚洲视频在线观看| 国产九色91在线视频| 91中文字幕免费在线观看| 亚洲高清自偷揄拍自拍| 美女视频福利免费看| 肏插流水妹子在线乐播下载| 2018在线福利视频| 懂色av之国产精品| 91九色国产porny蝌蚪| av无限看熟女人妻另类av| 天天操天天干天天艹| 欧美xxx成人在线| 国产日韩精品一二三区久久久| 亚洲天天干 夜夜操| 国产美女午夜福利久久| 久久艹在线观看视频| 天堂av在线最新版在线| 日本女大学生的黄色小视频| 97成人免费在线观看网站| 国产一区二区火爆视频| 欧美精品 日韩国产| 日韩亚洲高清在线观看| 五十路息与子猛烈交尾视频| 国产熟妇一区二区三区av | 黄页网视频在线免费观看| 青青青爽视频在线播放| 日本免费午夜视频网站| 国产va在线观看精品| 亚洲国产在人线放午夜| 亚洲欧美另类手机在线| 亚洲欧美成人综合在线观看| 337p日本大胆欧美人| 亚洲的电影一区二区三区| 沙月文乃人妻侵犯中文字幕在线| 四川乱子伦视频国产vip| 日本性感美女视频网站| 在线观看一区二区三级| 午夜精品亚洲精品五月色| 国产日韩精品电影7777| 国产日韩一区二区在线看| 97精品综合久久在线| 日韩欧美中文国产在线| japanese五十路熟女熟妇| 久久久久只精品国产三级| 黄色视频在线观看高清无码| 在线观看国产网站资源| 精品久久久久久久久久久a√国产 日本女大学生的黄色小视频 | 精品欧美一区二区vr在线观看| 天天日天天添天天爽| 亚洲成人精品女人久久久| 高清一区二区欧美系列| 黄色无码鸡吧操逼视频| 哥哥姐姐综合激情小说| 国产一区二区三免费视频| 小穴多水久久精品免费看| 91免费黄片可看视频| 老司机免费福利视频网| 国产片免费观看在线观看| 精品suv一区二区69| 中文字幕在线观看极品视频| 国产免费av一区二区凹凸四季| 亚洲国产中文字幕啊啊啊不行了 | 狠狠躁狠狠爱网站视频| 国产精品久久久久久美女校花| 少妇被强干到高潮视频在线观看| 91九色porny国产蝌蚪视频| 国产va在线观看精品| 最后99天全集在线观看| 成人av亚洲一区二区| av天堂资源最新版在线看| 中文字幕免费福利视频6| 亚洲美女自偷自拍11页| 毛片av在线免费看| 亚洲综合一区二区精品久久| 美洲精品一二三产区区别 | 在线观看免费视频网| 国产又粗又硬又大视频| 日本成人不卡一区二区| av中文字幕电影在线看| 亚洲成人国产av在线| sw137 中文字幕 在线| 日韩成人免费电影二区| 国产又粗又猛又爽又黄的视频在线| 亚洲精品乱码久久久本| 国产精品久久9999| 中文字幕无码一区二区免费| 97瑟瑟超碰在线香蕉| 久青青草视频手机在线免费观看| 六月婷婷激情一区二区三区| 国产精选一区在线播放| 免费观看国产综合视频| 可以免费看的www视频你懂的| 亚洲激情,偷拍视频| 亚洲午夜在线视频福利| 秋霞午夜av福利经典影视| 少妇人妻久久久久视频黄片| 欧美视频一区免费在线| 国产麻豆91在线视频| 视频啪啪啪免费观看| 大学生A级毛片免费视频| 在线不卡成人黄色精品| 玖玖一区二区在线观看| weyvv5国产成人精品的视频| 97青青青手机在线视频| 日日夜夜狠狠干视频| 日本特级片中文字幕| 青草久久视频在线观看| 欧美精品一区二区三区xxxx| 亚洲欧美另类手机在线| 3337p日本欧洲大胆色噜噜| 免费观看国产综合视频| 亚洲久久午夜av一区二区| 沈阳熟妇28厘米大战黑人| 亚洲 中文字幕在线 日韩| 国产精品黄大片在线播放| 青青在线视频性感少妇和隔壁黑丝| 看一级特黄a大片日本片黑人| 天天躁日日躁狠狠躁av麻豆| 国产精品视频一区在线播放| 人妻少妇精品久久久久久| 欧美精品欧美极品欧美视频| 国产清纯美女al在线| 中文字幕第三十八页久久| 天天日天天干天天舔天天射| 大鸡吧插入女阴道黄色片| 国产污污污污网站在线| 国产密臀av一区二区三| 日韩欧美在线观看不卡一区二区| 国产男女视频在线播放| 国产综合高清在线观看| 黄色片黄色片wyaa| 国产高清女主播在线| 红杏久久av人妻一区| av中文字幕福利网| 五十路老熟女码av| 青青青国产免费视频| 又黄又刺激的午夜小视频| 韩国爱爱视频中文字幕| 日韩少妇人妻精品无码专区| 欧美乱妇无乱码一区二区| 伊拉克及约旦宣布关闭领空| 天天操夜夜骑日日摸| 日本熟妇色熟妇在线观看| 视频一区 视频二区 视频| 国产中文字幕四区在线观看| 大鸡巴操b视频在线| 国产污污污污网站在线| 不卡一不卡二不卡三| 大鸡吧插入女阴道黄色片| 在线观看欧美黄片一区二区三区| 一区二区三区国产精选在线播放| 天天干夜夜操天天舔| 色婷婷久久久久swag精品| 日韩美女精品视频在线观看网站 | 天天操天天弄天天射| 狠狠躁狠狠爱网站视频| 欧美中文字幕一区最新网址| 日韩美在线观看视频黄| 乱亲女秽乱长久久久| 久久久久久久亚洲午夜综合福利| 在线观看国产网站资源| 91精品国产黑色丝袜| 黄色三级网站免费下载| 91成人在线观看免费视频| 91极品新人『兔兔』精品新作| av久久精品北条麻妃av观看| 午夜在线精品偷拍一区二| 日本性感美女写真视频| 国产黄色大片在线免费播放 | 青青青青在线视频免费观看| 欧美80老妇人性视频| 中国熟女一区二区性xx| 4个黑人操素人视频网站精品91| 99国产精品窥熟女精品| 亚洲1069综合男同| 亚洲一区自拍高清免费视频| free性日本少妇| 综合精品久久久久97| 男人天堂色男人av| 亚洲成人午夜电影在线观看| av中文字幕电影在线看| 久久久久久国产精品| 精品国产在线手机在线| 中文字幕AV在线免费看 | 自拍偷拍日韩欧美一区二区| 亚洲精品国产综合久久久久久久久| 懂色av之国产精品| 日本三极片中文字幕| 青青青aaaa免费| 91老熟女连续高潮对白| aiss午夜免费视频| 亚洲自拍偷拍综合色| 亚洲一区久久免费视频| 偷拍自拍视频图片免费| 老鸭窝日韩精品视频观看| 国产精品福利小视频a| 日韩人妻在线视频免费| 老司机在线精品福利视频| 久久久久久9999久久久久| 亚洲欧美综合在线探花| 99精品亚洲av无码国产另类 | 国产黄色片在线收看| 99re国产在线精品| 99热99这里精品6国产| 一区二区免费高清黄色视频| 美女骚逼日出水来了| 亚洲另类综合一区小说| av森泽佳奈在线观看| 天天干狠狠干天天操 | 精品久久久久久高潮| 亚洲精品国产综合久久久久久久久| 国产视频网站国产视频| 国产aⅴ一线在线观看| 亚洲午夜精品小视频| 色偷偷伊人大杳蕉综合网| 黑人借宿ntr人妻的沦陷2| 精品视频中文字幕在线播放| 国产真实乱子伦a视频| 国际av大片在线免费观看| 9l人妻人人爽人人爽| 亚洲图片偷拍自拍区| 免费69视频在线看| 日韩国产乱码中文字幕| 大黑人性xxxxbbbb| 激情人妻校园春色亚洲欧美| 精品久久久久久久久久久99| 天天操天天干天天艹| 视频一区二区在线免费播放| 国产男女视频在线播放| 国际av大片在线免费观看| 久草视频在线看免费| 人妻3p真实偷拍一二区| 亚洲国产香蕉视频在线播放| 国产一区成人在线观看视频| 蜜臀av久久久久久久| 亚洲精品无码色午夜福利理论片| 黑人巨大精品欧美视频| 自拍 日韩 欧美激情| 黄色片年轻人在线观看| 亚洲粉嫩av一区二区三区| 强行扒开双腿猛烈进入免费版 | 丝袜肉丝一区二区三区四区在线 | 国产女人被做到高潮免费视频| 欧美黑人性猛交xxxxⅹooo| 天天日天天爽天天干| 亚洲欧美一卡二卡三卡| 人妻素人精油按摩中出| 免费在线播放a级片| 午夜精品亚洲精品五月色| 性欧美日本大妈母与子| 欧美激情电影免费在线| 黄色视频在线观看高清无码| 久久久久五月天丁香社区| 欧美偷拍亚洲一区二区| av在线免费资源站| 超碰在线观看免费在线观看| 中文字幕 码 在线视频| 国产精品中文av在线播放| 日韩欧美一级aa大片| 韩国一级特黄大片做受| 成年人该看的视频黄免费| 日韩熟女系列一区二区三区| 91免费福利网91麻豆国产精品| 绯色av蜜臀vs少妇| 国产91久久精品一区二区字幕 | 色吉吉影音天天干天天操| 亚洲1卡2卡三卡4卡在线观看 | yellow在线播放av啊啊啊| 夜夜嗨av蜜臀av| 任你操视频免费在线观看| 国产亚洲视频在线观看| 伊人日日日草夜夜草| 18禁无翼鸟成人在线| 一区国内二区日韩三区欧美| 午夜91一区二区三区| 欧美日韩在线精品一区二区三| 操人妻嗷嗷叫视频一区二区| 国产精品自偷自拍啪啪啪| 青青青aaaa免费| 日本少妇的秘密免费视频| 色在线观看视频免费的| 91在线免费观看成人| 天天日天天鲁天天操| 日本三极片视频网站观看| 老司机免费福利视频网| 北条麻妃av在线免费观看| av日韩在线观看大全| 2018在线福利视频| av一区二区三区人妻| 日本在线一区二区不卡视频| 91九色porny蝌蚪国产成人| 亚洲国产成人最新资源| 国产福利小视频大全| 十八禁在线观看地址免费| 久久丁香花五月天色婷婷| 综合色区亚洲熟妇shxstz| 成年美女黄网站18禁久久| 91社福利《在线观看| 国产V亚洲V天堂无码欠欠 | 国产熟妇一区二区三区av | 国产精品黄色的av| 天天插天天狠天天操| 视频一区 二区 三区 综合| 在线免费91激情四射 | 日韩一区二区三区三州| 亚洲第一伊人天堂网| av男人天堂狠狠干| 97年大学生大白天操逼| 男生舔女生逼逼视频| 插逼视频双插洞国产操逼插洞| 日韩一区二区三区三州| 亚洲 色图 偷拍 欧美| 国产精品国产精品一区二区| 韩国一级特黄大片做受| 最新中文字幕免费视频| 国产之丝袜脚在线一区二区三区 | 成年人的在线免费视频| jiujiure精品视频在线| 国产精品一区二区三区蜜臀av | 亚洲图片欧美校园春色 |