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

doing5552

記錄每日點滴,不枉人生一世

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

公告

常用鏈接

留言簿(24)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 455899
  • 排名 - 49

最新隨筆

最新評論

閱讀排行榜

評論排行榜

在異構(gòu)環(huán)境中開發(fā)可靠的網(wǎng)絡(luò)應(yīng)用程序

developerWorks
文檔選項
將打印機的版面設(shè)置成橫向打印模式

打印本頁

將此頁作為電子郵件發(fā)送

將此頁作為電子郵件發(fā)送


級別: 中級

M. Tim Jones (mtj@mtjones.com), 資深軟件工程師, Emulex

2005 年 10 月 08 日

Socket API 是網(wǎng)絡(luò)應(yīng)用程序開發(fā)中實際應(yīng)用的標(biāo)準(zhǔn) API。盡管該 API 簡單,但是開發(fā)新手可能會經(jīng)歷一些常見的問題。本文識別一些最常見的隱患并向您顯示如何避免它們。

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

本文識別那些隱患并向您顯示如何避開它們。

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

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

捕獲并檢查每一個返回狀態(tài),而不是忽略它們。考慮清單 1 顯示的例子,一個套接字 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 探究一個函數(shù)片斷,它完成套接字 send 操作(通過套接字發(fā)送數(shù)據(jù))。函數(shù)的錯誤狀態(tài)被捕獲并測試,但這個例子忽略了 send 在無阻塞模式(由 MSG_DONTWAIT 標(biāo)志啟用)下的一個特性。

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

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

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





回頁首


隱患 2.對等套接字閉包

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

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

如果在一個套接字上完成一個 read 操作并得到一個為 0 的返回值,這表明遠(yuǎn)程套接字端的對等層調(diào)用了 close API 方法。該指示與文件讀取相同 —— 沒有多余的數(shù)據(jù)可以通過描述符讀取(參見 清單 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ù)來探測對等套接字的閉包。在這種情況下,接收 SIGPIPE 信號,或如果該信號阻塞,write 函數(shù)將返回 -1 并設(shè)置 errnoEPIPE





回頁首


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

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

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

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

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


清單 3.使用 SO_REUSEADDR 套接字選項避免地址使用錯誤
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 選項之后,bind API 函數(shù)將允許地址的立即重用。





回頁首


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

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

比如說,您想要發(fā)送一個整數(shù):您可以肯定,接收者將使用同樣的方式來解釋該整數(shù)嗎?運行在同一架構(gòu)上的應(yīng)用程序可以依賴它們共同的平臺來對該類型的數(shù)據(jù)做出相同的解釋。但是,如果一個運行在高位優(yōu)先的 IBM PowerPC 上的客戶端發(fā)送一個 32 位的整數(shù)到一個低位優(yōu)先的 Intel x86,那將會發(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)勢。這意味著,對高位優(yōu)先的機器來說,在 TCP/IP 內(nèi)控制數(shù)據(jù)是自然有序的。低位優(yōu)先架構(gòu)要求字節(jié)交換 —— 對網(wǎng)絡(luò)應(yīng)用程序來說,這是一個輕微的性能弱點。

通過套接字發(fā)送一個 C 結(jié)構(gòu)會怎么樣呢?這里,也會遇到麻煩,因為不是所有的編譯器都以相同的方式排列一個結(jié)構(gòu)的元素。結(jié)構(gòu)也可能被壓縮以便使浪費的空間最少,這進一步使結(jié)構(gòu)中的元素錯位。

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

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





回頁首


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

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


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

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

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

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





回頁首


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

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

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

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


清單 4.netstat 實用程序的用法模式
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
                        

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

監(jiān)視流量

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


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

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





回頁首


總結(jié)

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



參考資料

學(xué)習(xí)

獲得產(chǎn)品和技術(shù)
  • tcpdumptcpflow 實用程序可以用來監(jiān)控網(wǎng)絡(luò)流量。

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

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

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



討論


關(guān)于作者

M. Tim Jones

Tim Jones 是一名嵌入式軟件工程師,他是 GNU/Linux Application ProgrammingAI Application Programming 以及 BSD Sockets Programming from a Multilanguage Perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的內(nèi)核開發(fā)到嵌入式架構(gòu)設(shè)計,再到網(wǎng)絡(luò)協(xié)議的開發(fā)。Tim 是 Emulex Corp. 的一名資深軟件工程師。

posted on 2010-07-16 14:57 doing5552 閱讀(299) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久aⅴ国产紧身牛仔裤| 午夜精品一区二区三区在线视| 99re6热在线精品视频播放速度| 久久亚洲午夜电影| 欧美日韩国产片| 久久精品国产一区二区三| 99精品欧美一区二区三区综合在线 | 一区二区三区精品在线| 欧美aa在线视频| 欧美电影打屁股sp| 欧美国产亚洲精品久久久8v| 欧美国产日本韩| 亚洲国产一区在线| 国产精品99久久99久久久二8| 亚洲国产综合在线| 亚洲欧洲精品天堂一级| 日韩亚洲精品在线| 先锋影音久久| 亚洲免费视频在线观看| 99热精品在线观看| 亚洲一区二区精品视频| 99精品久久久| 91久久久精品| 欧美激情精品久久久| 久久久久一区| 亚洲国产精彩中文乱码av在线播放| 亚洲一区国产一区| 久久久精品性| 亚洲国产欧美不卡在线观看| 国产精品视频yy9099| 欧美天堂在线观看| 国产一区二区在线观看免费播放 | 国产精品va在线| 欧美性一区二区| 欧美成人一二三| 亚洲一区不卡| 欧美精品v国产精品v日韩精品 | 国产免费一区二区三区香蕉精| 欧美日韩国产91| 极品裸体白嫩激情啪啪国产精品| 国产精品99久久久久久有的能看 | 亚洲黄色视屏| 久久国产一区二区三区| 欧美日韩国产综合久久| 国产午夜精品久久久久久免费视| 久久综合色综合88| 亚洲美女中出| 亚洲一区二区在线免费观看| 一区二区三区日韩精品视频| 欧美精品首页| 亚洲一级片在线观看| 国产亚洲欧美另类一区二区三区| 亚洲国产精品专区久久| 亚洲欧洲综合| 国产欧美日韩亚洲精品| 久久久亚洲精品一区二区三区 | 欧美特黄a级高清免费大片a级| 狠狠色狠狠色综合日日tαg| 午夜精品视频在线| 亚洲福利一区| 欧美日韩国产区一| 久久久999国产| 在线视频亚洲一区| 亚洲小说欧美另类婷婷| 久久精品国产亚洲高清剧情介绍| 亚洲综合色视频| 国产精品成人久久久久| 亚洲精品小视频| 欧美激情四色| 欧美在线1区| 亚洲国产视频直播| 亚洲狼人精品一区二区三区| 99精品视频免费全部在线| 国产精品久久一区主播| 亚洲国产精品专区久久| 欧美一区午夜精品| 日韩视频三区| 91久久精品国产91性色| 欧美成人综合| 伊人久久成人| 欧美日韩成人激情| 亚洲成人在线视频网站| 香港久久久电影| 欧美高清不卡在线| 久久激情视频久久| 欧美一区二区私人影院日本| 久久久成人网| 亚洲美女在线观看| 欧美一区二区三区视频免费播放 | 久久精品亚洲一区二区| 亚洲精品资源美女情侣酒店| 欧美日韩大片一区二区三区| 美女主播一区| 久久精品综合| 亚洲人成在线影院| 国内久久精品| 亚洲人成亚洲人成在线观看| 亚洲欧美一区二区原创| 你懂的网址国产 欧美| 亚洲一区二区三区中文字幕在线| 亚洲免费在线观看视频| 永久免费精品影视网站| 欧美伊人久久| 欧美专区日韩专区| 亚洲电影免费观看高清完整版在线观看 | 久久九九精品99国产精品| 欧美91大片| 老司机午夜精品| 亚洲午夜精品| 一本久道综合久久精品| 久久国产毛片| 亚洲欧洲精品成人久久奇米网| 性色av一区二区三区红粉影视| 久久本道综合色狠狠五月| 噜噜噜91成人网| 久久激情视频久久| 欧美成人精品1314www| 亚洲视频axxx| 久久嫩草精品久久久精品一| 亚洲精品在线免费| 久久精品视频99| 国产精品视频yy9099| 亚洲美洲欧洲综合国产一区| 午夜欧美电影在线观看| 免费成人你懂的| 99在线视频精品| 99re6热只有精品免费观看| 蜜桃久久av一区| 午夜在线不卡| 亚洲大片av| 国产精品日韩二区| 久久精品一区二区三区中文字幕| 亚洲人成网站在线播| 欧美伦理91i| 国产女人精品视频| 亚洲人成网站在线观看播放| 欧美激情片在线观看| 一个人看的www久久| 99国产精品国产精品久久| 性欧美激情精品| 狠狠色噜噜狠狠色综合久| 欧美一区二区三区免费观看| 欧美在线视频免费观看| 亚洲一区二区三区色| 国产精品永久免费| 1024成人网色www| 91久久精品一区二区别| 国产精品色网| 欧美国产三区| 亚洲三级电影全部在线观看高清| 国产一区二区三区在线免费观看 | 欧美一区二区三区久久精品茉莉花| 亚洲欧美激情一区二区| 国产伦理精品不卡| 久久综合给合久久狠狠色| 亚洲无线视频| 亚洲激情电影在线| 久久久久综合网| 欧美性猛交一区二区三区精品| 久久久夜色精品亚洲| 国产精品视频一| 欧美成人免费观看| 欧美在线一二三区| 亚洲欧美日韩在线综合| 欧美高清视频在线| 午夜在线电影亚洲一区| 久久久久久91香蕉国产| 亚洲精品免费一区二区三区| 欧美在线观看www| 一区二区视频免费在线观看| 日韩一级免费观看| 亚洲精品国产精品乱码不99按摩 | 亚洲一区二区三区国产| 亚洲女与黑人做爰| 欧美一级专区免费大片| 国产精品一二三四区| 西瓜成人精品人成网站| 国产情人综合久久777777| 亚洲国产女人aaa毛片在线| 国产亚洲激情| 久久精品日产第一区二区三区| 欧美国产精品劲爆| 99国产精品视频免费观看| 亚洲免费中文| 可以免费看不卡的av网站| 国产精品久久亚洲7777| 亚洲欧美国产精品桃花| 欧美一区二区国产| 国产最新精品精品你懂的| 久久成人综合网| 亚洲国产精品va在线看黑人动漫 | 亚洲老司机av| 久久大逼视频| 欧美一区二区三区在线观看视频| 国产真实乱偷精品视频免| 久久精品国产亚洲一区二区| 亚洲国产成人久久综合一区| 亚洲欧美中文字幕| 久久久夜色精品亚洲| 在线精品福利|