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

歡迎訪問 生活随笔!

生活随笔

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

数据库

腐蚀rust服务器命令_【使用 Rust 写 Parser】2. 解析Redis协议

發布時間:2025/3/8 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 腐蚀rust服务器命令_【使用 Rust 写 Parser】2. 解析Redis协议 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

系列所有文章

https://zhuanlan.zhihu.com/p/115017849?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/139387293?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/146455601?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/186217695?zhuanlan.zhihu.com

在基本熟悉 nom 之后, 這次我們準備用 nom 實現一個 redis 通信協議的解析器. 選擇 redis 是因為 redis 的通信協議易讀且比較簡單.

準備

如果你對 redis 通信協議不熟悉的話可以查閱 通信協議(protocol). 簡單來說 redis 通信協議分為統一請求協議(這里只討論新版請求協議)和回復協議, 請求協議可以方便地通過 Rust 內置的 format! 拼接構成, 而通信協議則使用 nom 解析. redis 協議非常簡單, 這里不再贅述.

首先我們需要一個 redis 服務器, 這里我在開發的機器上用 docker 啟動一個 redis 服務器:

docker run -d --name redis -p 6379:6379 redis redis-server --appendonly yes

測試下 redis 服務

telnet localhost 6379 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. ping +PONG

出現 +PONG 說明服務器已正常運行

實現基本功能

首先創建項目

cargo new rcli && cd rcli

添加如下依賴

[dependencies] tokio = { version = "0.2", features = ["full"]} nom = "5" bytes = "0.5.4" structopt = "0.3.14"

structopt 可以幫助我們快速構建命令行工具輸入 redis 命令幫助測試, bytes 則可以幫助我們處理字節, tokio 依賴是上個測試代碼遺留的依賴, 剛好新代碼也需要 tcp 連接, 索性使用 tokio 處理 tcp 連接, nom 自然是用于解析回復.

首先我們需要創建 tcp 連接與 redis 通信, 并且寫入一些數據看看協議是否管用:

use bytes::{BufMut, BytesMut}; use std::error::Error; use tokio::net::TcpStream; use tokio::prelude::*;#[tokio::main] async fn main() -> Result<(), Box<dyn Error>> {let mut stream = TcpStream::connect("127.0.0.1:6379").await?;let mut buf = [0u8; 1024];let mut resp = BytesMut::with_capacity(1024);let (mut reader, mut writer) = stream.split();// 向服務器發送 PINGwriter.write(b"*1rn$4rnPINGrn").await?;let n = reader.read(&mut buf).await?;resp.put(&buf[0..n]);// 返回結果應該是 PONGprintln!("{:?}", resp);Ok(()) }

如上面代碼展示的, 我們創建一個 tcp 連接和一個緩沖 buf, 在成功連接后根據協議嘗試寫入 *1rn$4rnPINGrn, 預期結果是服務器返回 "+PONGrn".

現在我們可以創建 CLI 實現幾個常用的 redis 命令, 方便我們向服務器發送命令. 創建 commands.rs 文件, 記得在 main.rs 中導入它.

以 rpush 為例, rpush 命令用法為 RPUSH key value [value …]

使用 structopt 可以這樣定義一個枚舉(使用結構體也可以, 但因為將來有很多子命令, 所以枚舉更合適)

use structopt::StructOpt;#[derive(Debug, Clone, StructOpt)] pub enum Commands {/// push value to listRpush {/// redis keykey: String,/// valuevalues: Vec<String>,}, }

接著在 main.rs 中使用 Commands 解析命令行

use structopt::StructOpt; mod commands;#[tokio::main] async fn main() -> Result<(), Box<dyn Error>> {// 創建 tcp 連接, buf 等...let com = commands::Commands::from_args();// 發送命令 ... }

運行項目看下效果

cargo run -- helppush value to listUSAGE:rrdis-cli rpush <key> [values]...FLAGS:-h, --help Prints help information-V, --version Prints version informationARGS:<key> redis key<values>... value

接下來要把從命令行傳來的參數轉換為 redis 統一請求. redis 以 rn 為分隔符, redis 請求格式以 *argc 開頭, argc 是此次請求的參數個數, 每個參數先以 $<參數長度> 聲明參數長度, 接著 rn 分割符, 然后是參數數據, 若有多個參數則重復此步驟. 最后以 rn 結尾.

比如上面的 PING 轉換為 *1rn$4rnPINGrn, 而 GET 轉換為 *2rn$3rnGETrn$3rnkeyrn.

可以使用一個 builder 幫助我們轉換:

use bytes::{BufMut, BytesMut};#[derive(Debug, Clone)] struct CmdBuilder {args: Vec<String>, }impl CmdBuilder {fn new() -> Self {CmdBuilder { args: vec![] }}fn arg(mut self, arg: &str) -> Self {self.args.push(format!("${}", arg.len()));self.args.push(arg.to_string());self}fn add_arg(&mut self, arg: &str) {self.args.push(format!("${}", arg.len()));self.args.push(arg.to_string());}fn to_bytes(&self) -> BytesMut {let mut bytes = BytesMut::new();bytes.put(&format!("*{}rn", self.args.len() / 2).into_bytes()[..]);bytes.put(&self.args.join("rn").into_bytes()[..]);bytes.put(&b"rn"[..]);bytes} }

CmdBuilder 做的很簡單, 保存通過 arg 或 add_arg 傳入的參數, 在 to_bytes 方法中拼接這些參數為有效的請求.

例如可以通過如下方式構建一個 GET 命令

let cmd = CmdBuilder::new().arg("GET").arg("key").to_bytes()

接下來使用 CmdBuilder 為 Commands 實現 to_bytes 方法

impl Commands {pub fn to_bytes(&self) -> bytes::BytesMut {let cmd = match self {Commands::Rpush { key, values } => {let mut builder = CmdBuilder::new().arg("RPUSH").arg(key);values.iter().for_each(|v| builder.add_arg(v));builder.to_bytes()}};cmd} }

改寫 main 函數發送構建的請求

// ... 省略 let com = commands::Commands::from_args(); writer.write(&com.to_bytes()).await?; cargo run -- rpush list a b c d# redis 成功返回響應 :3rn

All is well, 對于其他命令可以通過相同方法實現, 可以在 rrdis-cli/src/commands.rs 看到完整實現.

解析回復

現在終于到 nom 出場了. 新建 reply.rs 文件, 并在 main.rs 導入. 首先導入需要使用的 nom 方法, 接著定義 Reply, 因為 redis 回復種類有限, 所以用一個枚舉是非常合適的.

use nom::branch::alt; use nom::bytes::complete::tag; use nom::bytes::complete::{take_while, take_while1, take_while_m_n}; use nom::combinator::map; use nom::multi::many_m_n; use nom::sequence::delimited; use nom::IResult;#[derive(Debug)] pub enum Reply {// 狀態回復或單行回復SingleLine(String),// 錯誤回復Err(String),// 整數回復Int(i64),// 批量回復Batch(Option<String>),// 多條批量回復MultiBatch(Option<Vec<Reply>>),// 回復中沒有, 這里是為了方便進行錯誤處理添加的BadReply(String), }

單行回復

協議中單行回復定義如下:

一個狀態回復(或者單行回復,single line reply)是一段以 "+" 開始、 "rn" 結尾的單行字符串。

所以解析思路是: 如果回復以"+"開頭, 則讀取余下字節存作為回復, 直到 "rn", 偽代碼如下

take_if("+"), take_util_new_line, take_if("rn")

nom 中的 tag 可以完美實現偽代碼中的 take_if 功能, 令人驚喜的是對于"消耗輸入直到不符合某種條件"這個常見解析模式, nom 提供了 take_while 函數, 所以我們的解析函數可以寫成:

fn parse_single_line(i: &str) -> IResult<&str, Reply> {let (i, _) = tag("+")(i)?;let (i, resp) = take_while(|c| c != 'r' && c != 'n')(i)?;let (i, _) = tag("rn")(i)?;Ok((i, Reply::SingleLine(resp.to_string()))) }

tag 和 take_while 讓解析函數的功能非常直觀地展現出來, 這讓它看著想偽代碼, 但它真的能運行!

在函數中只有 take_while 返回的結果是我們想要的, 但兩個 tag 又是不可或缺, 對于這一常見解析模式 nom 提供了 delimited 這個組合子函數, 這個組合子函數接受三個類似 tag("xx") 這樣的基本函數, 依次應用這三個函數, 如果成功, 則返回第二個函數解析的結果.

所以我們的函數可以這樣寫:

fn parse_single_line(i: &str) -> IResult<&str, Reply> {let (i, resp) = delimited(tag("+"),take_while(|c| c != 'r' && c != 'n'),tag("rn"),)(i)?;Ok((i, Reply::SingleLine(String::from(resp)))) }

錯誤回復

錯誤回復定義:

錯誤回復和狀態回復非常相似, 它們之間的唯一區別是, 錯誤回復的第一個字節是 "-" , 而狀態回復的第一個字節是 "+"

所以錯誤回復解析函數和上面的差不多:

fn parse_err(i: &str) -> IResult<&str, Reply> {let (i, resp) = delimited(tag("-"),// take_while1 與 take_while 類似, 但要求至少一個字符符合條件take_while1(|c| c != 'r' && c != 'n'),tag("rn"),)(i)?;Ok((i, Reply::Err(String::from(resp)))) }

整數回復

整數回復就是一個以 ":" 開頭, CRLF 結尾的字符串表示的整數,

整數回復結構與前兩種類似, 區別在于中間是整數, 需要將 take_while1 的返回值轉換為整數.

如果沒有進行類型轉換解析函數可以這樣實現:

fn parse_int(i: &str) -> IResult<&str, Reply> {let (i, int) = delimited(tag(":"),// 注意負數前綴take_while1(|c: char| c.is_digit(10) || c == '-'),tag("rn"),)(i)?;// ... 類型轉換Ok((i, Reply::Int(int))) }

注意到 nom 提供的基本解析工廠函數如 tag 創建的解析函數返回值都是 IResult, 它與 Result 類似, 可以應用 map 運算子, 不過這個 map 需使用 nom 提供的

map(take_while1(|c: char| c.is_digit(10) || c == '-'), |int: &str| int.parse::<i64>().unwrap())

通過 nom 的 map 函數可以把返回值從 IResult<&str, &str> 映射為 IResult<&str, i64>, 最后解析函數可以寫成

fn parse_int(i: &str) -> IResult<&str, Reply> {let (i, int) = delimited(tag(":"),map(take_while1(|c: char| c.is_digit(10) || c == '-'),|int: &str| int.parse::<i64>().unwrap(),),tag("rn"),)(i)?;Ok((i, Reply::Int(int))) }

批量回復

服務器發送的內容中: - 第一字節為 "$" 符號 - 接下來跟著的是表示實際回復長度的數字值 - 之后跟著一個 CRLF - 再后面跟著的是實際回復數據 - 最末尾是另一個 CRLF

同時批量回復還有特殊情況

如果被請求的值不存在, 那么批量回復會將特殊值 -1 用作回復的長度值, 這種回復稱為空批量回復(NULL Bulk Reply)

此時協議要求客戶端返回空對象, 對于 Rust 則是 None, 所以 BatchReply 才會被定義為 BatchReply<Option<String>>.

所以這個函數的解析可能稍微復雜點, 但方法與上面沒有太大差異, 除了新的 take_while_m_n, take_while_m_n 與 take_while 類似, 不同的是它可以指定消耗輸入最小數和最大數m, n.

如果是空回復則嘗試匹配 rn, 如果成功, 直接返回, 否則根據拿到的回復長度, 獲取那么多長度的字符, 接著應該碰到 rn.

fn parse_batch(i: &str) -> IResult<&str, Reply> {let (i, _) = tag("$")(i)?;let (i, len) = (take_while1(|c: char| c.is_digit(10) || c == '-'))(i)?;if len == "-1" {let (i, _) = tag("rn")(i)?;Ok((i, Reply::Batch(None)))} else {let len = len.parse::<usize>().unwrap();let (i, resp) = delimited(tag("rn"), take_while_m_n(len, len, |_| true), tag("rn"))(i)?;Ok((i, Reply::Batch(Some(String::from(resp)))))} }

多條批量回復

多條批量回復是由多個回復組成的數組, 數組中的每個元素都可以是任意類型的回復, 包括多條批量回復本身。 多條批量回復的第一個字節為 "*" , 后跟一個字符串表示的整數值, 這個值記錄了多條批量回復所包含的回復數量, 再后面是一個 CRLF

多條批量回復其實是對上面四種回復的嵌套, 但需要注意"空白多條批量回復"和"無內容多條批量回復"這兩種特殊情況.

空白多條回復為 "*0rn", 無內容多條批量回復為 "*-1rn", 在解析時需要對這兩種特殊情況進行處理. 在其他情況則可以應用 nom 提供的 alt 組合子服用之前的四個解析函數; alt 即"可選的", 它接受多個解析函數元組, 依次嘗試應用每個函數, 返回第一個成功解析結果或拋出錯誤.

同時對于重復應用某個解析函數 m 到 n 次這種模式, nom 提供了 many_m_n 組合子, 對于 fn parse_item(&str) -> IResult<&str, Reply> 這樣的函數, many_m_n(parse_item, 0, 12) 返回值為 IResult<&str, Vec<Reply>>.

理清邏輯后解析多條批量回復的解析函數雖然有些長但還是很清晰的:

fn parse_multi_batch(i: &str) -> IResult<&str, Reply> {let (i, count) = delimited(tag("*"),take_while1(|c: char| c.is_digit(10) || c == '-'),tag("rn"),)(i)?;if count == "-1" {let (i, _) = tag("rn")(i)?;Ok((i, Reply::MultiBatch(None)))} else {let count = count.parse::<usize>().unwrap();let (i, responses) = many_m_n(count,count,alt((parse_single_line, parse_err, parse_int, parse_batch)),)(i)?;// 做個嚴格檢查, 檢查解析到的個數與預期的是否一致if responses.len() != count {Ok((i,Reply::BadReply(format!("expect {} items, got {}", count, responses.len())),))} else {Ok((i, Reply::MultiBatch(Some(responses))))}} }

最后用 alt 做個"匯總"

fn parse(i: &str) -> IResult<&str, Reply> {alt((parse_single_line,parse_err,parse_int,parse_batch,parse_multi_batch,))(i) }

至此我們我們的解析函數到完成了, 為 Reply 實現 Display 特性后對 redis 返回的消息應用 parse 然后把解析結果打印出來即可驗證解析函數正確性. 完整代碼在

rrdis-cli/src/reply.rs?github.com

匯總

完整代碼可以在我的 rrdis-cli 查看. 不知道大家對 nom 的評價如何, 我覺得使用 nom 提供的基本函數和一系列組合子從最小元素出發, 搭積木似的構建出更復雜的解析函數, 即降低了開發難度, 熟悉之后代碼邏輯還挺清晰的.

整個 rrdis-cli 項目實現 set, get, incr, lrange, rpush 和 ping 這基本命令, 實現其他命令也是非常簡單; 并且實現了絕大部分(還有一些特殊錯誤情況沒處理)協議解析, 整個項目代碼量如下

tokei . -------------------------------------------------------------------------------Language Files Lines Code Comments Blanks -------------------------------------------------------------------------------Markdown 1 4 4 0 0Rust 3 332 284 20 28TOML 1 15 12 1 2 -------------------------------------------------------------------------------Total 5 351 300 21 30 -------------------------------------------------------------------------------

Rust 代碼只有 332 行, 挺簡潔的, 估計比我用 Python 實現都少.

下一篇使用 nom 寫什么還不確定, 隨緣更新吧~

怎么說也是萬字長文, 如果覺得文章可以, 請點個贊, 謝謝~

總結

以上是生活随笔為你收集整理的腐蚀rust服务器命令_【使用 Rust 写 Parser】2. 解析Redis协议的全部內容,希望文章能夠幫你解決所遇到的問題。

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

日韩欧美一区二区不卡 | 国产手机av在线 | 丁香花在线观看视频在线 | 狠狠艹夜夜干 | 波多野结衣在线中文字幕 | a视频在线观看 | 国产区网址 | 91九色视频导航 | 午夜精品剧场 | 免费看在线看www777 | www.91av在线| 99电影456麻豆 | 国产日本高清 | 黄色毛片在线观看 | 五月天综合婷婷 | 亚洲区另类春色综合小说校园片 | 91天天视频 | 狠狠的操| aaa免费毛片 | 国产在线免费 | 国产日韩中文字幕 | av高清免费在线 | 亚洲视频 中文字幕 | 毛片网在线观看 | 91香蕉视频好色先生 | 亚洲视频第一页 | 三上悠亚在线免费 | 亚洲毛片在线观看. | 国产精品久久久久av免费 | 色噜噜日韩精品欧美一区二区 | 亚洲理论视频 | 欧美日韩18| 天天射天天干天天 | 国产成人三级一区二区在线观看一 | 国产精品久久一区二区三区, | 久久中文欧美 | 97色se| 99精品一区二区 | 九九在线国产视频 | 九九热在线视频免费观看 | 99精品欧美一区二区三区黑人哦 | 九九免费在线观看 | 亚州精品在线视频 | 九九视频精品在线 | 久草在线观看视频免费 | 色网址99 | 91高清在线 | 四虎在线视频 | 在线观看国产高清视频 | 成人黄色电影免费观看 | 国产高清不卡一区二区三区 | 久久综合九色综合久99 | 9999免费视频 | 一区二区丝袜 | 久久免费福利 | 国产亚洲精品成人av久久影院 | 久久久国产毛片 | 91福利视频免费观看 | 国产又粗又猛又黄 | 成人在线免费av | 欧美一级黄大片 | 久久精品日产第一区二区三区乱码 | 97在线免费观看视频 | 免费看三级网站 | 手机av资源 | 97视频成人 | 色网址99 | 天天干干| 国产成人精品一区二区三区免费 | 一区二区三区四区五区在线视频 | 99久久久久久国产精品 | 国产高清免费视频 | 国产人成在线视频 | 国产裸体视频bbbbb | 亚洲三级黄色 | 激情欧美日韩一区二区 | 久草免费福利在线观看 | 国内精品视频在线播放 | 国产精品麻豆欧美日韩ww | 玖玖在线免费视频 | 中文字幕永久在线 | 国产在线v| 97视频在线观看网址 | 欧美中文字幕久久 | 亚洲精品中文字幕视频 | www.xxxx欧美 | 欧美精品免费在线观看 | 狠狠色丁香婷婷综合久久片 | 中文欧美字幕免费 | 激情视频免费在线 | 99这里只有精品视频 | 成人在线观看影院 | 黄色小说在线观看视频 | 国产色婷婷| 国产99久久久久 | 中文在线中文a | 天天婷婷 | 亚洲国产精品第一区二区 | 91亚洲精品久久久久图片蜜桃 | 午夜成人免费影院 | 午夜精品久久久久久久99无限制 | 夜色资源网| 在线免费黄色av | 国产在线播放一区二区三区 | 国产伦精品一区二区三区四区视频 | www黄| 91综合久久一区二区 | 国产精品久久综合 | 日韩免费在线一区 | 亚洲 欧洲av | 欧美va日韩va | 久精品视频 | 免费a v观看 | 草久电影 | 免费人人干 | 国产喷水在线 | 一区二区三区在线免费观看视频 | 国产一级片观看 | 国产成人av免费在线观看 | 天天色综合天天 | 中文字幕在线一二 | 国产精品久久99综合免费观看尤物 | 久久成熟| 揉bbb玩bbb少妇bbb | 国产精品资源在线 | 久久最新网址 | 99色网站| 亚洲黄色在线观看 | 伊人婷婷综合 | 国产高清福利在线 | 首页国产精品 | 国产色爽| 欧美另类一二三四区 | 久久国产精品99久久久久 | 中国一级特黄毛片大片久久 | 国产中文在线字幕 | 国产精品久久久久一区二区国产 | 亚洲免费资源 | 中文字幕第一页在线播放 | 久久综合亚洲鲁鲁五月久久 | 99看视频在线观看 | 国产69精品久久99不卡的观看体验 | 日韩精品亚洲专区在线观看 | 17videosex性欧美 | 久久久在线 | 国产99精品在线观看 | 超碰人人射 | 99性视频| 久久久久久久久久久久久久免费看 | 日韩av影片在线观看 | 在线国产小视频 | 在线观看视频一区二区三区 | 五月婷香蕉久色在线看 | 精品成人免费 | 婷婷视频| 国产又粗又猛又黄又爽视频 | 日本久久精品视频 | 在线观看日韩视频 | 亚洲成人av片在线观看 | 一级做a视频| 丰满少妇高潮在线观看 | 亚洲另类视频在线观看 | 天天操天天干天天摸 | 最近在线中文字幕 | 日韩黄色软件 | 中文字幕永久 | 欧美精品乱码久久久久久按摩 | 欧美日韩中文国产一区发布 | 美女网站一区 | 成 人 黄 色 免费播放 | 国产高清专区 | 欧美va在线观看 | 欧美精品一区在线发布 | 免费久久网 | 狠狠躁夜夜a产精品视频 | 四虎最新入口 | 色97在线| 天天干天天插伊人网 | 精品国产一区二 | 日韩欧美综合在线视频 | 国产日韩视频在线观看 | 久久久国产精品一区二区三区 | 97综合网| 国产区久久 | 国产在线免费av | 97超碰在线播放 | 国产黄色av影视 | 亚洲在线免费视频 | 亚洲视频精品在线 | 国产精品九九九九九九 | 亚洲日本一区二区在线 | 不卡av在线免费观看 | 99精品在线 | 久久精品男人的天堂 | www.香蕉视频在线观看 | 丁香六月五月婷婷 | 婷婷综合导航 | 欧美做受高潮 | 久青草国产在线 | 92中文资源在线 | 婷婷在线资源 | 麻豆精品视频在线观看免费 | 国产自产高清不卡 | 狠狠干天天射 | 国产一卡二卡在线 | 波多野结衣电影久久 | 99在线热播精品免费99热 | 狠狠的干狠狠的操 | 中文字幕韩在线第一页 | 99视频在线精品免费观看2 | 免费在线播放 | 激情伊人 | 午夜精品久久久久久久久久久久 | 国产精品美乳一区二区免费 | 中文字幕亚洲精品在线观看 | av在线中文 | av亚洲产国偷v产偷v自拍小说 | 国产高清在线精品 | 亚洲欧洲精品久久 | 亚洲码国产日韩欧美高潮在线播放 | 在线成人免费电影 | av在线免费观看网站 | 九九综合九九 | 免费亚洲婷婷 | 一区二区三区av在线 | 美女激情影院 | 国产明星视频三级a三级点| 天堂在线视频免费观看 | 成人超碰在线 | 99在线热播精品免费99热 | 一区二区三区免费在线观看 | 国产啊v在线观看 | 亚洲精品五月天 | 麻豆av一区二区三区在线观看 | 深夜国产在线 | 免费黄色av. | 亚洲国产免费看 | 天天操夜夜逼 | 亚洲精品一区中文字幕乱码 | 国产精品久久久99 | 国产馆在线播放 | 又粗又长又大又爽又黄少妇毛片 | 欧美日韩国产精品一区二区亚洲 | 精品一区二区av | 日本在线观看视频一区 | 精品一区二区免费 | 久久精品这里都是精品 | 麻豆成人精品视频 | 91精品国产三级a在线观看 | 91手机视频在线 | 国产成人久久av | 久操伊人 | 韩国av一区二区三区在线观看 | x99av成人免费 | 色姑娘综合网 | 91一区啪爱嗯打偷拍欧美 | 六月色婷婷 | 午夜视频在线观看欧美 | 日韩电影在线观看中文字幕 | 99国产在线观看 | 狠狠婷婷 | 天干啦夜天干天干在线线 | 大型av综合网站 | 亚洲视频免费 | 一级c片 | 亚洲精品456在线播放第一页 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 激情婷婷综合网 | 波多野结衣理论片 | 欧美精品一级视频 | 欧美大香线蕉线伊人久久 | 久久久99国产精品免费 | 中文字幕高清免费日韩视频在线 | 黄色在线网站噜噜噜 | 久久精品99国产精品 | a级一a一级在线观看 | 怡红院av | 亚洲精品小区久久久久久 | 国产麻豆精品久久 | 国产在线一区二区 | 免费看黄色毛片 | 国产成人精品国内自产拍免费看 | 99热在线国产精品 | 午夜久久福利影院 | 伊人国产在线播放 | 久久夜夜操 | 在线小视频 | 日操干| av电影中文字幕在线观看 | 51精品国自产在线 | 国产精品 9999 | 国内精品久久久久久久影视麻豆 | 中文av网站 | 午夜丁香视频在线观看 | 热99在线视频 | 国产精品福利视频 | 91手机电影| 亚洲欧洲在线视频 | 永久免费的啪啪网站免费观看浪潮 | 欧美做受69| 欧美日韩在线精品 | 中文字幕视频三区 | 特级西西人体444是什么意思 | 成人av在线播放网站 | 97品白浆高清久久久久久 | 欧美日韩xx| 国产精品区免费视频 | 日韩美在线观看 | www.黄色小说.com| av电影中文 | 91精品一区二区三区蜜臀 | 四虎www| 很污的网站 | 国产91精品高清一区二区三区 | 国产一二三四在线观看视频 | 亚洲美女免费精品视频在线观看 | 麻豆av一区二区三区在线观看 | 婷婷久草| 色欧美88888久久久久久影院 | 黄污污网站 | 夜色.com| 欧美高清成人 | 欧美一级片免费在线观看 | 久久在线精品视频 | 免费在线国产精品 | 亚洲成av人电影 | 激情久久久久久久久久久久久久久久 | 日韩在线观看a | 亚州视频在线 | 中文字幕乱码在线播放 | 亚洲精品综合一二三区在线观看 | 97在线视频免费播放 | av黄色在线观看 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 精品无人国产偷自产在线 | 久久一二三四 | 91精品免费看 | av看片在线 | 国产91区| 国产亚洲精品久久久久久久久久 | 99这里都是精品 | 欧美精品少妇xxxxx喷水 | 亚洲综合五月天 | 天天添夜夜操 | 亚洲91中文字幕无线码三区 | 欧美伦理一区二区三区 | 亚洲精品午夜视频 | 国产高清 不卡 | 又黄又刺激的视频 | 国产亚洲精品bv在线观看 | 亚洲成a人片77777潘金莲 | 久久久wwww | 91影视成人 | 国产精品综合久久久久久 | 高清国产午夜精品久久久久久 | 久久免费视频在线观看6 | 精品国产区 | 国内精品久久久久久久久久 | 亚洲精品黄色 | 中文字幕在线观看视频一区 | 亚洲一区二区视频 | 久久久www成人免费精品张筱雨 | 亚洲激情视频 | 欧美一级电影片 | 久久午夜羞羞影院 | 色午夜影院 | 中文字幕在线观看视频一区 | 亚洲国产精品女人久久久 | 成人在线网站观看 | 中文在线亚洲 | 欧洲一区二区三区精品 | 免费亚洲电影 | 国产亚洲婷婷 | 精品视频免费久久久看 | av电影在线不卡 | 国产不卡视频在线 | 成人免费xxx在线观看 | 一区二区三区污 | 中文字幕av免费在线观看 | 久久在线视频精品 | 伊人久操| 欧美成人精品三级在线观看播放 | 天天干夜夜想 | 久久天堂亚洲 | 日韩av高清在线观看 | 日韩精品一区二 | 看毛片网站 | 天天综合91 | 国产精品久久久一区二区 | 精品久久免费 | 久久国语露脸国产精品电影 | www.久久久久| 美女黄网站视频免费 | 不卡的av电影在线观看 | 五月天婷亚洲天综合网精品偷 | av在线免费观看不卡 | 我爱av激情网 | www.在线看片.com | 中文不卡视频在线 | 欧美一区二区免费在线观看 | 永久免费的啪啪网站免费观看浪潮 | 黄网站污 | 911精品视频 | 成 人 黄 色 视频播放1 | 人人干人人艹 | 人人草网站 | 国产成人一区二区啪在线观看 | 成片视频免费观看 | 久久久18 | 不卡av电影在线 | 国产专区一| 欧美一二三区播放 | 99久久久久国产精品免费 | 久久久久久久国产精品视频 | aⅴ视频在线 | 四虎影视8848dvd | 中文字幕123区 | 中文在线√天堂 | 亚洲欧美日韩精品久久久 | 成人网色 | 中文字幕一区二区三区在线视频 | 国产亚洲精品女人久久久久久 | 美女免费黄视频网站 | a在线一区| 国产不卡在线播放 | 国产精品国内免费一区二区三区 | 欧美成人黄色 | 亚洲精品国产精品久久99热 | 国产一区二区三区高清播放 | 天天色综合久久 | 久久r精品 | 欧美日韩高清在线一区 | 亚洲性少妇性猛交wwww乱大交 | 免费视频一级片 | 中文亚洲欧美日韩 | 欧美日韩午夜爽爽 | 亚洲91精品在线观看 | 亚洲精品成人av在线 | 国产在线观看午夜 | 视频一区二区免费 | 色吊丝在线永久观看最新版本 | 国产成人a亚洲精品v | 播五月婷婷 | 91在线porny国产在线看 | 蜜臀久久99静品久久久久久 | 99爱爱| 国产午夜精品久久久久久久久久 | 丝袜美腿亚洲综合 | 美女天天操 | 亚洲精品国产精品国自产在线 | 国产精品美女久久久久久 | 97超碰在线久草超碰在线观看 | 日韩视频在线播放 | 婷婷av电影 | 91精品国产综合久久久久久久 | 欧美视频在线观看免费网址 | 免费在线观看不卡av | 国产精品av免费 | 久草国产在线观看 | 国产在线观看免费观看 | 久久国产精品一区二区三区四区 | 免费看短 | 国产精品视频专区 | 综合久久网| 人人干网 | 在线视频成人 | 在线视频欧美日韩 | 在线播放av网址 | 精品一区二区在线看 | 中文字幕精品www乱入免费视频 | 中文字幕高清av | av网站手机在线观看 | 91色九色 | 免费在线观看国产精品 | 日韩黄色免费 | 91精品国产成人www | 永久免费av在线播放 | 丁香五婷| 欧美日韩视频在线观看免费 | 在线观看免费高清视频大全追剧 | 国产精品久久久久永久免费观看 | 久草网在线 | 久久人人爽爽 | 国产视频1区2区3区 久久夜视频 | 国产免费嫩草影院 | 成人免费 在线播放 | 在线观看视频中文字幕 | 久久综合精品国产一区二区三区 | 黄色国产在线 | 91精品视频在线 | 亚洲黄色一级视频 | 欧美激情综合五月色丁香 | 国产精品av免费观看 | av在线看片 | 九九九热精品 | 黄色国产在线观看 | 久久夜夜操 | 伊人狠狠 | 国产免费高清 | 91精品国产高清自在线观看 | 一区二区三区电影在线播 | 免费成人在线视频网站 | 成人三级网站在线观看 | 国产视频日本 | 亚洲精品理论片 | av黄色免费看 | 天天干干| 久久91网| 少妇bbb好爽 | 欧美日韩在线视频一区二区 | 日批视频在线观看免费 | 国产精品一区二区三区免费看 | 91视频久久久久久 | 国产 欧美 日产久久 | 在线观看免费观看在线91 | 亚洲日日射 | 成年人视频免费在线播放 | 中文字幕在线观看免费高清完整版 | 久久久久久毛片精品免费不卡 | 九九免费精品视频在线观看 | 国产成人av电影在线观看 | 亚洲精品国产精品99久久 | 人人插人人舔 | 国产护士hd高朝护士1 | 看全黄大色黄大片 | 国产婷婷vvvv激情久 | 日韩免费中文字幕 | 久久艹国产视频 | 丁香久久婷婷 | 欧美激情视频一二区 | 免费a级观看 | 国产一区二三区好的 | 视频在线观看一区 | 国产亚洲一区二区三区 | 天天射天天操天天干 | 精品乱码一区二区三四区 | 91丝袜美腿 | 婷婷六月天天 | 888av| 免费高清在线观看成人 | 在线有码中文字幕 | www.在线观看视频 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 天天久久夜夜 | 亚洲国产精品电影 | 国产女v资源在线观看 | 黄色免费观看 | 69亚洲视频 | 在线视频 国产 日韩 | 国产高清不卡 | av一级在线 | 超碰在线人人爱 | 久久精品久久精品久久39 | 96精品高清视频在线观看软件特色 | 91丨九色丨首页 | 欧美aa一级片 | 欧美污网站 | 免费日韩高清 | 亚洲精品国产精品国自产在线 | 国产精品久久久久久久99 | 中日韩欧美精彩视频 | 精品在线一区二区三区 | 美女网站视频免费都是黄 | 日韩黄视频 | 欧美日韩xxxxx | 亚洲有 在线| 人人干在线观看 | 97人人网| 一个色综合网站 | 日韩视频欧美视频 | 成 人 免费 黄 色 视频 | 五月婷婷在线播放 | 91精品爽啪蜜夜国产在线播放 | 欧美日本不卡视频 | 亚州av网站大全 | 国际精品久久久 | 国产成人av在线影院 | 91精品视频一区 | 亚洲精品免费在线观看视频 | a天堂免费 | 色婷婷国产在线 | 国产午夜精品久久久久久久久久 | 色香天天| 欧美一级小视频 | 日p视频| 亚洲涩涩涩 | 黄色动态图xx| 久久天 | 黄色在线网站噜噜噜 | 玖玖国产精品视频 | 97在线视频网站 | 97av视频在线观看 | 乱子伦av| 精品一区三区 | 一区二区三区高清 | 日韩视频在线不卡 | av在线亚洲天堂 | 亚洲成人精品 | 毛片网站在线 | 国产成人精品女人久久久 | 欧美a级免费视频 | 国产福利中文字幕 | 色婷在线 | 国产免费片| 国产精品69av | 精品在线二区 | 狠狠干狠狠艹 | 久久首页| 最新av网址在线观看 | 日韩精品一区二区三区在线播放 | 日韩专区av| 久久视频免费观看 | 免费a v在线 | 日日操日日干 | 丁香高清视频在线看看 | 日韩视频免费观看高清 | 婷婷久久综合九色综合 | 国产成人综 | 在线看免费 | 免费观看性生交 | av 在线观看 | 国产麻豆精品在线观看 | 国产精品一区二区三区在线看 | 天天射,天天干 | 久久激五月天综合精品 | 国产在线视频在线观看 | 日韩 精品 一区 国产 麻豆 | 精品视频久久久久久 | 五月天婷婷在线播放 | 99久久精品国产一区二区成人 | 69av在线播放 | 国产精品99蜜臀久久不卡二区 | 日韩免费二区 | 伊人超碰在线 | 久久69精品久久久久久久电影好 | 亚洲 成人 欧美 | 免费的成人av| 色噜噜噜噜 | 99 视频 高清| 国产精品不卡视频 | 国产精品丝袜久久久久久久不卡 | 成人av网站在线播放 | 亚洲精品美女视频 | 九九免费观看视频 | 成年人在线观看网站 | 激情久久伊人 | 日韩中文字幕a | 日本精品视频一区二区 | 日韩av快播电影网 | 久久综合狠狠综合久久狠狠色综合 | 国产又粗又硬又爽的视频 | 免费在线观看av不卡 | 免费在线观看一区二区三区 | 91在线一区二区 | 久色婷婷 | 国产亚洲欧美在线视频 | 免费观看91视频大全 | 正在播放 国产精品 | 亚洲九九影院 | 久草国产精品 | 91探花在线视频 | 911香蕉| 国产精久久久久久妇女av | 成人毛片在线视频 | 亚洲五月激情 | 四虎欧美 | 日韩电影久久久 | 国产精品久久久久久久久搜平片 | 天天干夜夜操视频 | 国产精品成人久久久久久久 | 免费a网 | 欧美精品少妇xxxxx喷水 | 久久久影院一区二区三区 | 日韩中文字幕视频在线 | 一区二区三区国 | 视频国产区 | 国产一区在线播放 | 婷婷激情网站 | 在线播放第一页 | 日韩av中文在线 | 91女神的呻吟细腰翘臀美女 | 99视频在线精品国自产拍免费观看 | 国产一级片免费视频 | 国产网红在线观看 | 日韩av片无码一区二区不卡电影 | 91大神视频网站 | 五月婷婷,六月丁香 | 精品国模一区二区三区 | 草久草久 | 成人黄在线观看 | 波多野结衣精品视频 | 婷婷色伊人 | 日韩成人在线免费观看 | 国产精品女同一区二区三区久久夜 | 精品在线你懂的 | 精品免费在线视频 | 久久久久久久久久影视 | 午夜精品一二区 | 在线香蕉视频 | av在线亚洲天堂 | 在线免费中文字幕 | 久久高清av | 亚洲午夜精品久久久久久久久久久久 | 玖玖综合网 | 国产视频18 | 亚洲成人资源 | 日本黄色免费在线观看 | 欧美在线91 | 亚洲最大av在线播放 | 国产在线观看xxx | 久久国产成人午夜av影院潦草 | 免费在线观看黄网站 | 国产一区二区三区 在线 | 超碰在线人人草 | 日韩欧三级 | 久久综合99| 91人人澡 | a成人v在线 | 81精品国产乱码久久久久久 | 中文字幕免费久久 | 久久国产精品久久国产精品 | 特黄免费av| 日韩中文字幕在线观看 | 69久久久 | 久草在线最新 | 18av在线视频 | 国产精品99久久久精品免费观看 | 一区二区三区在线观看中文字幕 | 99久久电影 | 2019中文最近的2019中文在线 | 91亚洲视频在线观看 | 99国产高清| 午夜色站 | 午夜精品一区二区三区视频免费看 | 久久久久久久久久久影视 | 国产不卡在线观看视频 | 97网在线观看 | 国产午夜三级 | av 一区二区三区四区 | 天天操天天干天天摸 | 人人狠狠综合久久亚洲 | 亚洲精品麻豆视频 | 欧美极品裸体 | 激情久久综合网 | 日日夜夜天天射 | 免费黄a | 亚洲精品在线观看中文字幕 | 黄色免费电影网站 | av蜜桃在线 | 久草免费在线视频观看 | 黄色毛片观看 | 欧美精品在线观看一区 | av片子在线观看 | 日韩欧美一区二区在线观看 | 国产美女精品人人做人人爽 | 一区二区三区日韩精品 | 国产精品美女 | 正在播放一区二区 | 欧美日韩免费观看一区二区三区 | www日| 国产成人精品在线播放 | av黄色在线观看 | 欧美精品亚洲精品日韩精品 | 91av短视频 | 久草免费手机视频 | 91精品视频免费 | 日韩理论片中文字幕 | 国产精品久久久久久久久久新婚 | 国产精品二区在线观看 | 国产一区二区电影在线观看 | 国产热re99久久6国产精品 | 日韩一区视频在线 | 久久久久久久18 | 成人小视频在线 | 久久a热6 | 亚洲一区二区视频 | 免费亚洲精品视频 | 天天操天天操天天 | 精品国产一区二区三区在线 | 日韩mv欧美mv国产精品 | 亚洲精品在线免费观看视频 | 国产一级性生活 | 亚洲男模gay裸体gay | 中文字幕电影在线 | 99国内精品久久久久久久 | 少妇性aaaaaaaaa视频 | 天天综合婷婷 | 在线91av| 久久久久成人精品 | 成人久久久精品国产乱码一区二区 | 婷婷视频在线播放 | 久久综合久久八八 | 999久久久欧美日韩黑人 | 狠狠操操操 | 国产亚洲va综合人人澡精品 | wwxxx日本| 国精产品一二三线999 | 久久精品99 | 九九电影在线 | 午夜的福利 | 亚洲男模gay裸体gay | 人人视频网站 | 成人永久视频 | 天天爽天天爽天天爽 | 91探花在线| 亚洲aⅴ一区二区三区 | 国产一区二区播放 | 国产精品99久久免费观看 | 国产精品欧美久久久久天天影视 | 波多野结衣电影一区二区三区 | 国产亚洲精品久久久久久无几年桃 | 欧美日韩一区三区 | 国产精品欧美久久久久久 | 麻豆va一区二区三区久久浪 | 美女视频黄是免费的 | 成人免费视频网站在线观看 | www.五月婷婷.com | 在线国产高清 | 激情视频免费在线 | 国产高清在线不卡 | 国产高清免费视频 | 五月激情婷婷丁香 | 麻豆传媒视频在线播放 | 亚洲va在线va天堂va偷拍 | 久久精品国产一区二区三区 | 成人影音av| 免费a网| 国产又粗又猛又黄又爽的视频 | 激情久久伊人 | 91在线观看黄 | 在线观看岛国av | 天天干天天射天天爽 | 欧美日韩国产一二 | 国产精品久久久久久一区二区三区 | 蜜臀一区二区三区精品免费视频 | 日韩欧美69 | 中文字幕成人 | 四虎国产 | 深爱激情五月综合 | 欧美日韩国产一二三区 | 久久精品99国产精品 | 久久精品在线免费观看 | 在线电影日韩 | 天天舔天天射天天操 | 国产视频精品在线 | 精品夜夜嗨av一区二区三区 | 在线成人性视频 | 久久精品79国产精品 | 久草网站在线观看 | 欧美午夜寂寞影院 | 亚洲视频观看 | 91精品久 | 亚洲精品国产自产拍在线观看 | 天天干天天干天天操 | 5月丁香婷婷综合 | 欧美激情综合网 | 日韩精品一区二区三区中文字幕 | 91片在线观看 | 亚州欧美精品 | 精品一区二区三区电影 | 日韩高清免费观看 | 亚洲综合成人婷婷小说 | 伊人日日干 | 久久免费在线视频 | 婷婷激情综合 | 亚洲成人精品av | 免费色黄| 在线观看一区二区精品 | 国产精品视频不卡 | 日本精品一区二区三区在线播放视频 | av免费在线观 | 成人国产精品免费观看 | 日韩视频一二三区 | 久久噜噜少妇网站 | 日韩高清国产精品 | 五月香视频在线观看 | 亚洲涩涩一区 | 美女免费黄视频网站 | 丁香婷婷激情 | 夜夜爽天天爽 | 国产精品va在线播放 | 久草在线观 | 亚洲精品国偷拍自产在线观看 | 午夜精品一区二区三区四区 | 欧美激情片在线观看 | 欧美日韩视频在线观看一区二区 | 国产免费黄视频在线观看 | av免费在线网 | 亚洲综合导航 | 日日夜夜天天久久 | 成人欧美亚洲 | av在线播放免费 | 西西www4444大胆视频 | 91av原创 | 毛片一区二区 | 午夜视频在线观看网站 | 97免费在线观看视频 | 黄p在线播放 | 在线免费91 | 六月天综合网 | av不卡在线看| 国产精品一区二区你懂的 | 91精品免费 | 日本精品视频在线观看 | 国内丰满少妇猛烈精品播放 | 欧美一级免费黄色片 | 日本爱爱片 | 成人在线视频论坛 | 手机在线视频福利 | 国产福利免费在线观看 | 国产精品美女久久久久aⅴ 干干夜夜 | 成人精品电影 | 国产区网址| 久草视频99 | 成人久久视频 | 最新国产精品视频 | 日韩特黄一级欧美毛片特黄 | 在线观看韩日电影免费 | 波多野结衣电影一区二区 | 日本不卡久久 | 日本精品中文字幕在线观看 | 亚洲专区 国产精品 | 国产一区二区三区高清播放 | 国产高清视频色在线www | 亚洲精品欧美视频 | 中文av网| 中文字幕国内精品 | 91成人网在线 | 一区二区在线电影 | 999国产 | 激情欧美一区二区三区免费看 | 国产亚洲高清视频 | 999久久久免费精品国产 | 午夜久久久久久久久久影院 | 五月婷在线播放 | 国产视频精品免费播放 | 最近最新最好看中文视频 | 2019中文字幕网站 | 亚洲国产偷 | 国产精品网站一区二区三区 | 国产小视频国产精品 | 成年人在线电影 | 99久久精品国产免费看不卡 | 国产精品久久久久永久免费看 | 精品欧美一区二区三区久久久 | 日本爱爱免费视频 | 在线有码中文字幕 | 久香蕉 | 在线观看成人国产 | 精品嫩模福利一区二区蜜臀 | 99视频在线播放 | 精品视频在线免费观看 | 99精品免费久久久久久日本 | 中文字幕 国产精品 | 日韩精品一区二区在线观看视频 | 亚洲禁18久人片 | 狠狠躁日日躁狂躁夜夜躁av | 国产高清在线永久 | 91日韩免费 | 国产精品岛国久久久久久久久红粉 | 超碰人人乐 | 在线免费观看欧美日韩 | 免费看网站在线 | 一区二区三区国 | 在线视频 成人 | 超级碰视频| 亚洲国产福利视频 | 精品人人人| 激情综合网五月婷婷 | 中文字幕在线人 | 亚洲国产成人在线播放 | 午夜精品久久久久久久久久久 | www.夜色.com | 日本公乱妇视频 | 久久不卡免费视频 | 亚洲精品裸体 | 99精品视频在线观看 | 天天操狠狠操夜夜操 | 999国内精品永久免费视频 | 中文不卡视频在线 | 青春草免费视频 | 干综合网 | 国产小视频在线免费观看 | 亚洲年轻女教师毛茸茸 | 毛片www| 五月天婷婷综合 | 国产精品一区二区av | 午夜av网站| 久草在线综合网 | 国产九九精品 | 欧美日韩国产高清视频 | 国产91精品久久久久久 | 日韩视频一区二区三区在线播放免费观看 | 毛片一二区 | 国产一区二区三区免费在线 | 黄色小说免费在线观看 | 中文字幕精品一区 | 91看片一区二区三区 |