青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術(shù)中心

   :: 首頁(yè) :: 聯(lián)系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過(guò)作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評(píng)論

評(píng)論排行榜

在 4.2 BSD UNIX® 操作系統(tǒng)中首次引入,Sockets API 現(xiàn)在是任何操作系統(tǒng)的標(biāo)準(zhǔn)特性。事實(shí)上,很難找到一種不支持 Sockets API 的現(xiàn)代語(yǔ)言。該 API 相當(dāng)簡(jiǎn)單,但新的開(kāi)發(fā)人員仍然會(huì)遇到一些常見(jiàn)的隱患。

本文識(shí)別那些隱患并向您顯示如何避開(kāi)它們。

隱患 1.忽略返回狀態(tài)

第一個(gè)隱患很明顯,但它是開(kāi)發(fā)新手最容易犯的一個(gè)錯(cuò)誤。如果您忽略函數(shù)的返回狀態(tài),當(dāng)它們失敗或部分成功的時(shí)候,您也許會(huì)迷失。反過(guò)來(lái),這可能傳播錯(cuò)誤,使定位問(wèn)題的源頭變得困難。

捕獲并檢查每一個(gè)返回狀態(tài),而不是忽略它們。考慮清單 1 顯示的例子,一個(gè)套接字 send 函數(shù)。


清單 1. 忽略 API 函數(shù)返回狀態(tài)
int status, sock, mode;
/* Create a new stream (TCP) socket */
sock = socket( AF_INET, SOCK_STREAM, 0 );
...
status = send( sock, buffer, buflen, MSG_DONTWAIT );
if (status == -1) {
  /* send failed */
  printf( "send failed: %s\n", strerror(errno) );
} else {
  /* send succeeded -- or did it? */
}

清單 1 探究一個(gè)函數(shù)片斷,它完成套接字 send 操作(通過(guò)套接字發(fā)送數(shù)據(jù))。函數(shù)的錯(cuò)誤狀態(tài)被捕獲并測(cè)試,但這個(gè)例子忽略了 send 在無(wú)阻塞模式(由 MSG_DONTWAIT 標(biāo)志啟用)下的一個(gè)特性。

send API 函數(shù)有三類可能的返回值:

  • 如果數(shù)據(jù)成功地排到傳輸隊(duì)列,則返回 0。
  • 如果排隊(duì)失敗,則返回 -1(通過(guò)使用 errno 變量可以了解失敗的原因)。
  • 如果不是所有的字符都能夠在函數(shù)調(diào)用時(shí)排隊(duì),則最終的返回值是發(fā)送的字符數(shù)。

由于 sendMSG_DONTWAIT 變量的無(wú)阻塞性質(zhì),函數(shù)調(diào)用在發(fā)送完所有的數(shù)據(jù)、一些數(shù)據(jù)或沒(méi)有發(fā)送任何數(shù)據(jù)后返回。在這里忽略返回狀態(tài)將導(dǎo)致不完全的發(fā)送和隨后的數(shù)據(jù)丟失。


隱患 2.對(duì)等套接字閉包

UNIX 有趣的一面是您幾乎可以把任何東西看成是一個(gè)文件。文件本身、目錄、管道、設(shè)備和套接字都被當(dāng)作文件。這是新穎的抽象,意味著一整套的 API 可以用在廣泛的設(shè)備類型上。

考慮 read API 函數(shù),它從文件讀取一定數(shù)量的字節(jié)。read 函數(shù)返回讀取的字節(jié)數(shù)(最高為您指定的最大值);或者 -1,表示錯(cuò)誤;或者 0,如果已經(jīng)到達(dá)文件末尾。

如果在一個(gè)套接字上完成一個(gè) read 操作并得到一個(gè)為 0 的返回值,這表明遠(yuǎn)程套接字端的對(duì)等層調(diào)用了 close API 方法。該指示與文件讀取相同 —— 沒(méi)有多余的數(shù)據(jù)可以通過(guò)描述符讀取(參見(jiàn) 清單 2)。


清單 2.適當(dāng)處理 read API 函數(shù)的返回值
int sock, status;
sock = socket( AF_INET, SOCK_STREAM, 0 );
...
status = read( sock, buffer, buflen );
if (status > 0) {
  /* Data read from the socket */
} else if (status == -1) {
  /* Error, check errno, take action... */
} else if (status == 0) {
  /* Peer closed the socket, finish the close */
  close( sock );
  /* Further processing... */
}

同樣,可以用 write API 函數(shù)來(lái)探測(cè)對(duì)等套接字的閉包。在這種情況下,接收 SIGPIPE 信號(hào),或如果該信號(hào)阻塞,write 函數(shù)將返回 -1 并設(shè)置 errnoEPIPE


隱患 3.地址使用錯(cuò)誤(EADDRINUSE)

您可以使用 bind API 函數(shù)來(lái)綁定一個(gè)地址(一個(gè)接口和一個(gè)端口)到一個(gè)套接字端點(diǎn)。可以在服務(wù)器設(shè)置中使用這個(gè)函數(shù),以便限制可能有連接到來(lái)的接口。也可以在客戶端設(shè)置中使用這個(gè)函數(shù),以便限制應(yīng)當(dāng)供出去的連接所使用的接口。bind 最常見(jiàn)的用法是關(guān)聯(lián)端口號(hào)和服務(wù)器,并使用通配符地址(INADDR_ANY),它允許任何接口為到來(lái)的連接所使用。

bind 普遍遭遇的問(wèn)題是試圖綁定一個(gè)已經(jīng)在使用的端口。該陷阱是也許沒(méi)有活動(dòng)的套接字存在,但仍然禁止綁定端口(bind 返回 EADDRINUSE),它由 TCP 套接字狀態(tài) TIME_WAIT 引起。該狀態(tài)在套接字關(guān)閉后約保留 2 到 4 分鐘。在 TIME_WAIT 狀態(tài)退出之后,套接字被刪除,該地址才能被重新綁定而不出問(wèn)題。

等待 TIME_WAIT 結(jié)束可能是令人惱火的一件事,特別是如果您正在開(kāi)發(fā)一個(gè)套接字服務(wù)器,就需要停止服務(wù)器來(lái)做一些改動(dòng),然后重啟。幸運(yùn)的是,有方法可以避開(kāi) TIME_WAIT 狀態(tài)。可以給套接字應(yīng)用 SO_REUSEADDR 套接字選項(xiàng),以便端口可以馬上重用。

考慮清單 3 的例子。在綁定地址之前,我以 SO_REUSEADDR 選項(xiàng)調(diào)用 setsockopt。為了允許地址重用,我設(shè)置整型參數(shù)(on)為 1 (不然,可以設(shè)為 0 來(lái)禁止地址重用)。


清單 3.使用 SO_REUSEADDR 套接字選項(xiàng)避免地址使用錯(cuò)誤
int sock, ret, on;
struct sockaddr_in servaddr;
/* Create a new stream (TCP) socket */
sock = socket( AF_INET, SOCK_STREAM, 0 ):
/* Enable address reuse */
on = 1;
ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
/* Allow connections to port 8080 from any available interface */
memset( &servaddr, 0, sizeof(servaddr) );
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
servaddr.sin_port = htons( 45000 );
/* Bind to the address (interface/port) */
ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );

在應(yīng)用了 SO_REUSEADDR 選項(xiàng)之后,bind API 函數(shù)將允許地址的立即重用。


隱患 4.發(fā)送結(jié)構(gòu)化數(shù)據(jù)

套接字是發(fā)送無(wú)結(jié)構(gòu)二進(jìn)制字節(jié)流或 ASCII 數(shù)據(jù)流(比如 HTTP 上的 HTTP 頁(yè)面,或 SMTP 上的電子郵件)的完美工具。但是如果試圖在一個(gè)套接字上發(fā)送二進(jìn)制數(shù)據(jù),事情將會(huì)變得更加復(fù)雜。

比如說(shuō),您想要發(fā)送一個(gè)整數(shù):您可以肯定,接收者將使用同樣的方式來(lái)解釋該整數(shù)嗎?運(yùn)行在同一架構(gòu)上的應(yīng)用程序可以依賴它們共同的平臺(tái)來(lái)對(duì)該類型的數(shù)據(jù)做出相同的解釋。但是,如果一個(gè)運(yùn)行在高位優(yōu)先的 IBM PowerPC 上的客戶端發(fā)送一個(gè) 32 位的整數(shù)到一個(gè)低位優(yōu)先的 Intel x86,那將會(huì)發(fā)生什么呢?字節(jié)排列將引起不正確的解釋。

字節(jié)交換還是不呢?

Endianness 是指內(nèi)存中字節(jié)的排列順序。高位優(yōu)先(big endian) 按最高有效字節(jié)在前排列,然而 低位優(yōu)先(little endian) 按照最低有效字節(jié)在前排序。

高位優(yōu)先架構(gòu)(比如 PowerPC®)比低位優(yōu)先架構(gòu)(比如 Intel® Pentium® 系列,其網(wǎng)絡(luò)字節(jié)順序是高位優(yōu)先)有優(yōu)勢(shì)。這意味著,對(duì)高位優(yōu)先的機(jī)器來(lái)說(shuō),在 TCP/IP 內(nèi)控制數(shù)據(jù)是自然有序的。低位優(yōu)先架構(gòu)要求字節(jié)交換 —— 對(duì)網(wǎng)絡(luò)應(yīng)用程序來(lái)說(shuō),這是一個(gè)輕微的性能弱點(diǎn)。

通過(guò)套接字發(fā)送一個(gè) C 結(jié)構(gòu)會(huì)怎么樣呢?這里,也會(huì)遇到麻煩,因?yàn)椴皇撬械木幾g器都以相同的方式排列一個(gè)結(jié)構(gòu)的元素。結(jié)構(gòu)也可能被壓縮以便使浪費(fèi)的空間最少,這進(jìn)一步使結(jié)構(gòu)中的元素錯(cuò)位。

幸好,有解決這個(gè)問(wèn)題的方案,能夠保證兩端數(shù)據(jù)的一致解釋。過(guò)去,遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC)套裝工具提供所謂的外部數(shù)據(jù)表示(External Data Representation,XDR)。XDR 為數(shù)據(jù)定義一個(gè)標(biāo)準(zhǔn)的表示來(lái)支持異構(gòu)網(wǎng)絡(luò)應(yīng)用程序通信的開(kāi)發(fā)。

現(xiàn)在,有兩個(gè)新的協(xié)議提供相似的功能。可擴(kuò)展標(biāo)記語(yǔ)言/遠(yuǎn)程過(guò)程調(diào)用(XML/RPC)以 XML 格式安排 HTTP 上的過(guò)程調(diào)用。數(shù)據(jù)和元數(shù)據(jù)用 XML 進(jìn)行編碼并作為字符串傳輸,并通過(guò)主機(jī)架構(gòu)把值和它們的物理表示分開(kāi)。SOAP 跟隨 XML-RPC,以更好的特性和功能擴(kuò)展了它的思想。參見(jiàn) 參考資料 小節(jié),獲取更多關(guān)于每個(gè)協(xié)議的信息。


隱患 5.TCP 中的幀同步假定

TCP 不提供幀同步,這使得它對(duì)于面向字節(jié)流的協(xié)議是完美的。這是 TCP 與 UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)的一個(gè)重要區(qū)別。UDP 是面向消息的協(xié)議,它保留發(fā)送者和接收者之間的消息邊界。TCP 是一個(gè)面向流的協(xié)議,它假定正在通信的數(shù)據(jù)是無(wú)結(jié)構(gòu)的,如圖 1 所示。


圖 1.UDP 的幀同步能力和缺乏幀同步的 TCP
幀同步能力

圖 1 的上部說(shuō)明一個(gè) UDP 客戶端和服務(wù)器。左邊的對(duì)等層完成兩個(gè)套接字的寫(xiě)操作,每個(gè) 100 字節(jié)。協(xié)議棧的 UDP 層追蹤寫(xiě)的數(shù)量,并確保當(dāng)右邊的接收者通過(guò)套接字獲取數(shù)據(jù)時(shí),它以同樣數(shù)量的字節(jié)到達(dá)。換句話說(shuō),為讀者保留了寫(xiě)者提供的消息邊界。

現(xiàn)在,看圖 1 的底部.它為 TCP 層演示了相同粒度的寫(xiě)操作。兩個(gè)獨(dú)立的寫(xiě)操作(每個(gè) 100 字節(jié))寫(xiě)入流套接字。但在本例中,流套接字的讀者得到的是 200 字節(jié)。協(xié)議棧的 TCP 層聚合了兩次寫(xiě)操作。這種聚合可以發(fā)生在 TCP/IP 協(xié)議棧的發(fā)送者或接收者中任何一方。重要的是,要注意到聚合也許不會(huì)發(fā)生 —— TCP 只保證數(shù)據(jù)的有序發(fā)送。

對(duì)大多數(shù)開(kāi)發(fā)人員來(lái)說(shuō),該陷阱會(huì)引起困惑。您想要獲得 TCP 的可靠性和 UDP 的幀同步。除非改用其他的傳輸協(xié)議,比如流傳輸控制協(xié)議(STCP),否則就要求應(yīng)用層開(kāi)發(fā)人員來(lái)實(shí)現(xiàn)緩沖和分段功能。


調(diào)試套接字應(yīng)用程序的工具

GNU/Linux 提供幾個(gè)工具,它們可以幫助您發(fā)現(xiàn)套接字應(yīng)用程序中的一些問(wèn)題。此外,使用這些工具還有教育意義,而且能夠幫助解釋?xiě)?yīng)用程序和 TCP/IP 協(xié)議棧的行為。在這里,您將看到對(duì)幾個(gè)工具的概述。查閱下面的 參考資料 了解更多的信息。

查看網(wǎng)絡(luò)子系統(tǒng)的細(xì)節(jié)

netstat 工具提供查看 GNU/Linux 網(wǎng)絡(luò)子系統(tǒng)的能力。使用 netstat,可以查看當(dāng)前活動(dòng)的連接(按單個(gè)協(xié)議進(jìn)行查看),查看特定狀態(tài)的連接(比如處于監(jiān)聽(tīng)狀態(tài)的服務(wù)器套接字)和許多其他的信息。清單 4 顯示了 netstat 提供的一些選項(xiàng)和它們啟用的特性。


清單 4.netstat 實(shí)用程序的用法模式
View all TCP sockets currently active
$ netstat --tcp
View all UDP sockets
$ netstat --udp
View all TCP sockets in the listening state
$ netstat --listening
View the multicast group membership information
$ netstat --groups
Display the list of masqueraded connections
$ netstat --masquerade
View statistics for each protocol
$ netstat --statistics

盡管存在許多其他的實(shí)用程序,但 netstat 的功能很全面,它覆蓋了 routeifconfig 和其他標(biāo)準(zhǔn) GNU/Linux 工具的功能。

監(jiān)視流量

可以使用 GNU/Linux 的幾個(gè)工具來(lái)檢查網(wǎng)絡(luò)上的低層流量。tcpdump 工具是一個(gè)比較老的工具,它從網(wǎng)上“嗅探”網(wǎng)絡(luò)數(shù)據(jù)包,打印到 stdout 或記錄在一個(gè)文件中。該功能允許查看應(yīng)用程序產(chǎn)生的流量和 TCP 生成的低層流控制機(jī)制。一個(gè)叫做 tcpflow 的新工具與 tcpdump 相輔相成,它提供協(xié)議流分析和適當(dāng)?shù)刂貥?gòu)數(shù)據(jù)流的方法,而不管數(shù)據(jù)包的順序或重發(fā)。清單 5 顯示 tcpdump 的兩個(gè)用法模式。


清單 5.tcpdump 工具的用法模式
Display all traffic on the eth0 interface for the local host
$ tcpdump -l -i eth0
Show all traffic on the network coming from or going to host plato
$ tcpdump host plato
Show all HTTP traffic for host camus
$ tcpdump host camus and (port http)
View traffic coming from or going to TCP port 45000 on the local host
$ tcpdump tcp port 45000

tcpdumptcpflow 工具有大量的選項(xiàng),包括創(chuàng)建復(fù)雜過(guò)濾表達(dá)式的能力。查閱下面的 參考資料 獲取更多關(guān)于這些工具的信息。

tcpdumptcpflow 都是基于文本的命令行工具。如果您更喜歡圖形用戶界面(GUI),有一個(gè)開(kāi)放源碼工具 Ethereal 也許適合您的需要。Ethereal 是一個(gè)專業(yè)的協(xié)議分析軟件,它可以幫助調(diào)試應(yīng)用層協(xié)議。它的插入式架構(gòu)(plug-in architecture)可以分解協(xié)議,比如 HTTP 和您能想到的任何協(xié)議(寫(xiě)本文的時(shí)候共有 637 個(gè)協(xié)議)。


總結(jié)

套接字編程是容易而有趣的,但是您要避免引入錯(cuò)誤或至少使它們?nèi)菀妆话l(fā)現(xiàn),這就需要考慮本文中描述的這 5 個(gè)常見(jiàn)的陷阱,并且采用標(biāo)準(zhǔn)的防錯(cuò)性程序設(shè)計(jì)實(shí)踐。GNU/Linux 工具和實(shí)用程序還可以幫助發(fā)現(xiàn)一些程序中的小問(wèn)題。記住:在查看實(shí)用程序的幫助手冊(cè)時(shí)候,跟蹤相關(guān)的或“請(qǐng)參見(jiàn)”工具。您也許會(huì)發(fā)現(xiàn)一個(gè)必要的新工具。


參考資料

學(xué)習(xí)

  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文

  • TCP 狀態(tài)機(jī)有 11 個(gè)狀態(tài)。參見(jiàn) W. Richard Steven 的 illustration from TCP/IP Illustrated, Volume 1 一書(shū)。

  • 在 Wikipedia 上探究 Endianness 的歷史和含意。

  • 了解更多關(guān)于 IBM 的開(kāi)放式、可伸縮和可定制的 Power Architecture 的信息。

  • Programming in C 課件閱讀 RPC/XDR 簡(jiǎn)介。

  • 獲取更多關(guān)于 XML-RPC 以及在 Java™ 應(yīng)用程序中如何使用它的信息,請(qǐng)閱讀 “Java 編程中的 XML-RPC” (developerWorks,2004 年 1 月)。

  • SOAP 以 XML-RPC 的特性為基礎(chǔ)。請(qǐng)?jiān)?SoapWare.Org 上查找規(guī)范、工具、教程和文章。

  • SCTP 兼有 TCP 和 UDP 的特性,以及可用性和可靠性。

  • 教程 “Linux Socket 編程,第一部分” (developerWorks,2003 年 10 月)講解如何開(kāi)始套接字編程以及如何構(gòu)建一個(gè)通過(guò) TCP/IP 連接的 echo 服務(wù)器和客戶端。“Linux Socket 編程,第二部分” (developerWorks,2004 年 1 月)集中討論 UDP 并且講解如何用 C 和 Python 編寫(xiě) UDP 套接字應(yīng)用程序(盡管代碼會(huì)翻譯為其他語(yǔ)言)。

  • netstat 手冊(cè)頁(yè) 提供有關(guān)各種使用 netstat 的方法的細(xì)節(jié)。

  • BSD Sockets Programming from a Multilanguage Perspective (作者 M. Tim Jones),用 6 種不同的語(yǔ)言介紹了套接字編程的技巧。

  • developerWorks Linux 專區(qū) 上查找更多為 Linux 開(kāi)發(fā)人員提供的參考資料。

獲得產(chǎn)品和技術(shù)

  • tcpdumptcpflow 實(shí)用程序可以用來(lái)監(jiān)控網(wǎng)絡(luò)流量。

  • Ethereal network protocol analyzer 提供 tcpdump 的功能,它具有圖形用戶界面和可伸縮的插入式架構(gòu)。

  • 免費(fèi)索取 SEK for Linux(兩張 DVD),它包含來(lái)自 DB2®、Lotus®、Rational®、Tivoli® 以及 WebSphere® 的最新 IBM 試用軟件的 Linux 版本。

  • IBM 試用軟件 在 Linux 上構(gòu)建您的下一個(gè)開(kāi)發(fā)項(xiàng)目,可以直接在 developerWorks 上下載。


討論

posted on 2013-07-01 10:44 C++技術(shù)中心 閱讀(1698) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Linux 編程

Feedback

# re: Linux 套接字編程中的 5 個(gè)隱患 2013-07-03 09:19 易寶@byhh
這算什么?copy IBM的。 然后放首頁(yè)?   回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品综合在线| 国产精品久久久久天堂| 一区二区日韩精品| 99国产精品久久| 亚洲乱码日产精品bd| 在线综合+亚洲+欧美中文字幕| 日韩视频在线一区二区三区| 在线视频日本亚洲性| 午夜精品久久久久久久男人的天堂 | 亚洲电影成人| 欧美黑人在线播放| 亚洲日本视频| 亚洲女同在线| 久久午夜精品一区二区| 欧美国产一区二区在线观看 | 国产精品人人爽人人做我的可爱| 国产精品夫妻自拍| 国产一区二区中文| av成人激情| 久久久久五月天| 亚洲人成在线观看| 性色av一区二区三区| 欧美成人精品三级在线观看| 国产精品第2页| 亚洲高清色综合| 欧美亚洲在线| 99精品国产热久久91蜜凸| 久久精品一本| 国产精品久久久99| 91久久在线视频| 久久久久九九九| 在线一区二区日韩| 欧美激情国产日韩| 尤物视频一区二区| 欧美一区二区三区在线观看| 亚洲人成网站在线观看播放| 久久免费国产| 国户精品久久久久久久久久久不卡| 一本色道久久精品| 欧美激情中文字幕在线| 久久av一区二区三区亚洲| 国产精品久久久久91| aa日韩免费精品视频一| 亚洲电影免费观看高清完整版| 欧美伊人久久久久久午夜久久久久 | 欧美有码在线视频| 国产精品二区在线| 亚洲宅男天堂在线观看无病毒| 亚洲国产欧美一区二区三区久久 | 亚洲免费电影在线观看| 美女被久久久| 久久国产欧美日韩精品| 国产色爱av资源综合区| 午夜在线精品| 亚洲免费影院| 国产欧美在线| 欧美一区二区日韩| 欧美激情1区2区3区| 国产精品毛片在线| 亚洲一区制服诱惑| 艳妇臀荡乳欲伦亚洲一区| 欧美日韩久久| 亚洲私拍自拍| 亚洲色图自拍| 国产美女扒开尿口久久久| 亚洲欧美日韩精品久久久| 亚洲视频在线免费观看| 国产精品国产三级国产普通话三级| 一区二区av在线| 亚洲老司机av| 国产精品久久久久久久9999| 性色一区二区| 久久精品国产欧美亚洲人人爽| 国内精品嫩模av私拍在线观看| 久久久精品一品道一区| 久久色在线观看| 亚洲国产导航| 亚洲美女黄色片| 国产精品一区久久久| 午夜欧美大片免费观看| 久久黄色网页| 99re热这里只有精品视频| 日韩午夜av| 国产农村妇女毛片精品久久麻豆 | 亚洲黄色在线| 99视频精品| 国产自产2019最新不卡| 亚洲国产婷婷| 国产欧美一区二区精品仙草咪| 蜜桃久久精品一区二区| 欧美色图首页| 欧美成人免费观看| 欧美性事在线| 麻豆成人av| 国产精品乱码人人做人人爱| 另类图片国产| 国产精品成人一区二区网站软件| 老司机午夜精品视频在线观看| 欧美日韩国产成人在线91| 久久免费视频在线| 国产精品成人久久久久| 欧美jizzhd精品欧美巨大免费| 欧美日韩一区二区欧美激情 | 欧美黄色影院| 国产欧美日韩视频在线观看| 亚洲激情啪啪| 亚洲第一精品夜夜躁人人躁| 国产精品99久久久久久人| 在线播放豆国产99亚洲| 亚洲欧美另类中文字幕| 中文亚洲视频在线| 欧美大片网址| 欧美大片免费久久精品三p| 国产欧美日韩一区二区三区在线观看| 亚洲国产精品久久久久婷婷老年| 国产欧美日韩视频| 欧美在线视频观看| 中国av一区| 99热这里只有精品8| 久久婷婷色综合| 久久国产天堂福利天堂| 国产精品v亚洲精品v日韩精品 | 亚洲免费小视频| 欧美久久影院| 亚洲欧洲日韩在线| 亚洲欧洲在线一区| 久色成人在线| 欧美国产乱视频| 伊人春色精品| 久久婷婷国产综合尤物精品 | 欧美亚洲视频一区二区| 亚洲一区制服诱惑| 国产精品99免费看 | 久久一区二区三区四区五区| 国产精品日韩欧美综合| 亚洲一区欧美二区| 午夜精品福利电影| 国产精品区免费视频| 亚洲视频在线视频| 久久国产精品99久久久久久老狼| 国产欧美一区视频| 久久久久在线| 亚洲国产精品欧美一二99| 亚洲精品久久在线| 欧美日韩精品一本二本三本| 一区二区三区视频在线| 欧美一区二区三区免费视频| 国产亚洲在线| 美女黄网久久| 亚洲精品乱码久久久久久久久 | 欧美涩涩视频| 亚洲欧美日韩综合国产aⅴ| 欧美主播一区二区三区| 激情成人综合网| 欧美黄色影院| 亚洲性夜色噜噜噜7777| 欧美一级在线视频| 韩日精品视频| 欧美激情一二三区| 一区二区三区精品国产| 久久久国产精品一区二区三区| 亚洲国产日韩综合一区| 欧美日本在线播放| 亚洲影院在线| 欧美大片免费观看在线观看网站推荐| 亚洲精品三级| 国产欧美一区二区色老头| 欧美成人精品1314www| 亚洲自拍16p| 亚洲国产日韩欧美在线动漫| 亚洲欧美制服另类日韩| 亚洲大片一区二区三区| 欧美三级黄美女| 久久精品99国产精品酒店日本| 亚洲高清在线精品| 久久精品午夜| 亚洲国产精品一区二区第一页| 亚洲精品乱码久久久久久日本蜜臀| 亚洲视频综合在线| 在线播放中文字幕一区| 国产精品草莓在线免费观看| 久久九九99| 亚洲午夜国产成人av电影男同| 欧美成人精品一区二区| 欧美亚洲在线播放| 亚洲免费成人av| 亚洲电影欧美电影有声小说| 国产精品日日摸夜夜摸av| 欧美福利视频| 久久中文久久字幕| 欧美一激情一区二区三区| 99视频一区| 亚洲人体影院| 亚洲电影免费在线观看| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲免费影视| 在线一区二区三区做爰视频网站| 亚洲国产精品成人综合色在线婷婷| 国产女主播在线一区二区| 国产精品久久久久久久免费软件|