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

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

實(shí)現(xiàn)自己的http server

Write your own http server

author : Kevin Lynx

Why write your own?

    看這個(gè)問(wèn)題的人證明你知道什么是http server,世界上有很多各種規(guī)模的http server,為什么要自己實(shí)現(xiàn)一個(gè)?其實(shí)沒(méi)什么
理由。我自己?jiǎn)栕约海杏X(jué)就是在自己娛樂(lè)自己,或者說(shuō)只是練習(xí)下網(wǎng)絡(luò)編程,或者是因?yàn)槟橙瘴铱吹侥硞€(gè)庫(kù)宣稱自己附帶一個(gè)小
型的http server時(shí),我不知道是什么東西,于是就想自己去實(shí)現(xiàn)一個(gè)。

What's httpd ?

    httpd就是http daemon,這個(gè)是類unix系統(tǒng)上的名稱,也就是http server。httpd遵循HTTP協(xié)議,響應(yīng)HTTP客戶端的request,
然后返回response。
    那么,什么是HTTP協(xié)議?最簡(jiǎn)單的例子,就是你的瀏覽器與網(wǎng)頁(yè)服務(wù)器之間使用的應(yīng)用層協(xié)議。雖然官方文檔說(shuō)HTTP協(xié)議可以
建立在任何可靠傳輸?shù)膮f(xié)議之上,但是就我們所見(jiàn)到的,HTTP還是建立在TCP之上的。
    httpd最簡(jiǎn)單的response是返回靜態(tài)的HTML頁(yè)面。在這里我們的目標(biāo)也只是一個(gè)響應(yīng)靜態(tài)網(wǎng)頁(yè)的httpd而已(也許你愿意加入CGI
特性)。

More details about HTTP protocol

    在這里有必要講解HTTP協(xié)議的更多細(xì)節(jié),因?yàn)槲覀兊膆ttpd就是要去解析這個(gè)協(xié)議。
    關(guān)于HTTP協(xié)議的詳細(xì)文檔,可以參看rfc2616。但事實(shí)上對(duì)于實(shí)現(xiàn)一個(gè)簡(jiǎn)單的響應(yīng)靜態(tài)網(wǎng)頁(yè)的httpd來(lái)說(shuō),完全沒(méi)必要讀這么一
分冗長(zhǎng)的文檔。在這里我推薦<HTTP Made Really Easy>,以下內(nèi)容基本取自于本文檔。

- HTTP協(xié)議結(jié)構(gòu)
  HTTP協(xié)議無(wú)論是請(qǐng)求報(bào)文(request message)還是回應(yīng)報(bào)文(response message)都分為四部分:
  * 報(bào)文頭 (initial line )
  * 0個(gè)或多個(gè)header line
  * 空行(作為header lines的結(jié)束)
  * 可選body
  HTTP協(xié)議是基于行的協(xié)議,每一行以\r\n作為分隔符。報(bào)文頭通常表明報(bào)文的類型(例如請(qǐng)求類型),報(bào)文頭只占一行;header line
  附帶一些特殊信息,每一個(gè)header line占一行,其格式為name:value,即以分號(hào)作為分隔;空行也就是一個(gè)\r\n;可選body通常
  包含數(shù)據(jù),例如服務(wù)器返回的某個(gè)靜態(tài)HTML文件的內(nèi)容。舉個(gè)例子,以下是一個(gè)很常見(jiàn)的請(qǐng)求報(bào)文,你可以截獲瀏覽器發(fā)送的數(shù)據(jù)
  包而獲得:

    1  GET /index.html HTTP/1.1
    2  Accept-Language: zh-cn
    3  Accept-Encoding: gzip, deflate
    4  User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; MAXTHON 2.0)
    5  Host: localhost
    6  Connection: Keep-Alive
    7
  我為每一行都添加了行號(hào),第1行就是initial line,2-6行是header lines,7行是一個(gè)header line的結(jié)束符,沒(méi)有顯示出來(lái)。
  以下是一個(gè)回應(yīng)報(bào)文:
    1  HTTP/1.1 200 OK
    2  Server: klhttpd/0.1.0
    3  Content-Type: text/html
    4  Content-Length: 67
    5
    6  <head><head><title>index.html</title></head><body>index.html</body>
  第6行就是可選的body,這里是index.html這個(gè)文件的內(nèi)容。

- HTTP request method
  因?yàn)槲覀冏龅氖路?wù)器端,所以我們重點(diǎn)對(duì)請(qǐng)求報(bào)文做說(shuō)明。首先看initial line,該行包含幾個(gè)字段,每個(gè)字段用空格分開(kāi),例
  如以上的GET /index.html HTTP/1.1就可以分為三部分:GET、/index.html、HTTP/1.1。其中第一個(gè)字段GET就是所謂的request
  method。它表明請(qǐng)求類型,HTTP有很多method,例如:GET、POST、HEAD等。

  就我們的目標(biāo)而言,我們只需要實(shí)現(xiàn)對(duì)GET和HEAD做響應(yīng)即可。

  GET是最普遍的method,表示請(qǐng)求一個(gè)資源。什么是資源?諸如HTML網(wǎng)頁(yè)、圖片、聲音文件等都是資源。順便提一句,HTTP協(xié)議
  中為每一個(gè)資源設(shè)置一個(gè)唯一的標(biāo)識(shí)符,就是所謂的URI(更寬泛的URL)。
  HEAD與GET一樣,不過(guò)它不請(qǐng)求資源內(nèi)容,而是請(qǐng)求資源信息,例如文件長(zhǎng)度等信息。

- More detail
  繼續(xù)說(shuō)說(shuō)initial line后面的內(nèi)容:
  對(duì)應(yīng)于GET和HEAD兩個(gè)method,緊接著的字段就是資源名,其實(shí)從這里可以看出,也就是文件名(相對(duì)于你服務(wù)器的資源目錄),例
  如這里的/index.html;最后一個(gè)字段表明HTTP協(xié)議版本號(hào)。目前我們只需要支持HTTP1.1和1.0,沒(méi)有多大的技術(shù)差別。

  然后是header line。我們并不需要關(guān)注每一個(gè)header line。我只羅列有用的header line :
  - Host : 對(duì)于HTTP1.1而言,請(qǐng)求報(bào)文中必須包含此header,如果沒(méi)有包含,服務(wù)器需要返回bad request錯(cuò)誤信息。
  - Date : 用于回應(yīng)報(bào)文,用于客戶端緩存數(shù)據(jù)用。
  - Content-Type : 用于回應(yīng)報(bào)文,表示回應(yīng)資源的文件類型,以MIME形式給出。什么是MIME?它們都有自己的格式,例如:
    text/html, image/jpg, image/gif等。
  - Content-Length : 用于回應(yīng)報(bào)文,表示回應(yīng)資源的文件長(zhǎng)度。

body域很簡(jiǎn)單,你只需要將一個(gè)文件全部讀入內(nèi)存,然后附加到回應(yīng)報(bào)文段后發(fā)送即可,即使是二進(jìn)制數(shù)據(jù)。

- 回應(yīng)報(bào)文
  之前提到的一個(gè)回應(yīng)報(bào)文例子很典型,我們以其為例講解。首先是initial line,第一個(gè)字段表明HTTP協(xié)議版本,可以直接以請(qǐng)求
  報(bào)文為準(zhǔn)(即請(qǐng)求報(bào)文版本是多少這里就是多少);第二個(gè)字段是一個(gè)status code,也就是回應(yīng)狀態(tài),相當(dāng)于請(qǐng)求結(jié)果,請(qǐng)求結(jié)果
  被HTTP官方事先定義,例如200表示成功、404表示資源不存在等;最后一個(gè)字段為status code的可讀字符串,你隨便給吧。

  回應(yīng)報(bào)文中最好跟上Content-Type、Content-Length等header。

具體實(shí)現(xiàn)
    正式寫代碼之前我希望你能明白HTTP協(xié)議的這種請(qǐng)求/回應(yīng)模式,即客戶端發(fā)出一個(gè)請(qǐng)求,然后服務(wù)器端回應(yīng)該請(qǐng)求。然后繼續(xù)
這個(gè)過(guò)程(HTTP1.1是長(zhǎng)連接模式,而HTTP1.0是短連接,當(dāng)服務(wù)器端返回第一個(gè)請(qǐng)求時(shí),連接就斷開(kāi)了)。
    這里,我們無(wú)論客戶端,例如瀏覽器,發(fā)出什么樣的請(qǐng)求,請(qǐng)求什么資源,我們都回應(yīng)相同的數(shù)據(jù):

               

/* 阻塞地接受一個(gè)客戶端連接 */
        SOCKET con 
= accept( s, 00 ); 
        
/* recv request */
        
char request[1024= 0 };
        ret 
= recv( con, request, sizeof( request ), 0 );
        printf( request );
        
/* whatever we recv, we send 200 response */
        
{
            
char content[] = "<head><head><title>index.html</title></head><body>index.html</body>";
            
char response[512];
            sprintf( response, 
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s", strlen( content ), content );
            ret 
= send( con, response, strlen( response ), 0 );
        }

        closesocket( con ); 

 

    程序以最簡(jiǎn)單的阻塞模式運(yùn)行,我們可以將重點(diǎn)放在協(xié)議的分析上。運(yùn)行程序,在瀏覽器里輸入http://localhost:8080/index.html
,然后就可以看到瀏覽器正常顯示content中描述的HTML文件。假設(shè)程序在8080端口監(jiān)聽(tīng)。

   現(xiàn)在你基本上明白了整個(gè)工作過(guò)程,我們可以把代碼寫得更全面一點(diǎn),例如根據(jù)GET的URI來(lái)載入對(duì)應(yīng)的文件然后回應(yīng)給客戶端。
其實(shí)這個(gè)很簡(jiǎn)單,只需要從initial line里解析出(很一般的字符串解析)URI字段,然后載入對(duì)應(yīng)的文件即可。例如以下函數(shù):

void http_response( SOCKET con, const char *request )
{
    
/* get the method */
    
char *token = strtok( request, " " );
    
char *uri = strtok( 0" " );
    
char file[64];
    sprintf( file, 
".%s", uri ); 

    
{
        
/* load the file content */
        FILE 
*fp = fopen( file, "rb" );
        
if( fp == 0 )
        
{
            
/* response 404 status code */
            
char response[] = "HTTP/1.1 404 NOT FOUND\r\n\r\n";
            send( con, response, strlen( response ), 
0 );
        }

        
else
        
{
            
/* response the resource */
            
/* first, load the file */
            
int file_size ;
            
char *content;
            
char response[1024];
            fseek( fp, 
0, SEEK_END );
            file_size 
= ftell( fp );
            fseek( fp, 
0, SEEK_SET );
            content 
= (char*)malloc( file_size + 1 );
            fread( content, file_size, 
1, fp );
            content[file_size] 
= 0

            sprintf( response, 
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s", file_size, content );
            send( con, response, strlen( response ), 
0 );
            free( content );
        }

    }

}
 



其他

    要將這個(gè)簡(jiǎn)易的httpd做完善,我們還需要注意很多細(xì)節(jié)。包括:對(duì)不支持的method返回501錯(cuò)誤;對(duì)于HTTP1.1要求有Host這個(gè)
header;為了支持客戶端cache,需要添加Date header;支持HEAD請(qǐng)求等。

    相關(guān)下載中我提供了一個(gè)完整的httpd library,純C的代碼,在其上加上一層資源載入即可實(shí)現(xiàn)一個(gè)簡(jiǎn)單的httpd。在這里我將
對(duì)代碼做簡(jiǎn)要的說(shuō)明:
    evbuffer.h/buffer.c : 取自libevent的buffer,用于緩存數(shù)據(jù);
    klhttp-internal.h/klhttp-internal.c :主要用于處理/解析HTTP請(qǐng)求,以及創(chuàng)建回應(yīng)報(bào)文;
    klhttp-netbase.h/klhttp-netbase.c :對(duì)socket api的一個(gè)簡(jiǎn)要封裝,使用select模型;
    klhttp.h/klhttp.c :庫(kù)的最上層,應(yīng)用層主要與該層交互,這一層主要集合internal和netbase。
    test_klhttp.c :一個(gè)測(cè)試?yán)印?

相關(guān)下載:
    klhttpd
    文中相關(guān)代碼

參考資料:

http://www.w3.org/Protocols/rfc2616/rfc2616.html
http://jmarshall.com/easy/http/
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

posted on 2008-07-30 16:14 Kevin Lynx 閱讀(29813) 評(píng)論(21)  編輯 收藏 引用 所屬分類: network

評(píng)論

# re: 實(shí)現(xiàn)自己的http server 2008-07-30 23:52 zx

其實(shí)對(duì)于Server來(lái)說(shuō),最難的部分是如何能盡快更多的響應(yīng)Client的請(qǐng)求,這里多線程似乎作用不大,最好的方式是用Async模式運(yùn)行,而且還要用到IO的overlapped……  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-07-31 00:08 x-matrix

@zx
這只是個(gè)練習(xí)而已,何必苛求。
  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-07-31 08:56 Kevin Lynx

@zx
高并發(fā)數(shù)不見(jiàn)得要使用async(不明白你所謂的Async模式是什么?我假設(shè)是異步IO),也不見(jiàn)得要使用Overlapped IO (我也不明白你說(shuō)的"IO的overlapped",我假設(shè)是windows下的Overlapped IO),一個(gè)event-driven的網(wǎng)路模型就很不錯(cuò)了。

@x-matrix
本文的重點(diǎn)在于對(duì)HTTP協(xié)議的解析,而不是開(kāi)發(fā)高并發(fā)網(wǎng)絡(luò)框架。:)  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-07-31 16:15 土仔

很贊同你的這種做法(精神?),其實(shí)做出一個(gè)東西有時(shí)只是為了能熟悉它的一些特性和滿足自己的娛樂(lè)精神。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-08-01 14:57 Strive

當(dāng)然,看過(guò) http://home.xxsyzx.com/home/ 這個(gè)的話,才真正能滿足自己的娛樂(lè)精神。。  我一向都是報(bào)著做著好玩來(lái)玩這種程序。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-08-01 16:08 Kevin Lynx

@Strive
很巧, 我恰好看過(guò)這個(gè)網(wǎng)站,感覺(jué)是個(gè)少年天才的主頁(yè)。之前搜索QQ協(xié)議,發(fā)現(xiàn)的。還下了他寫的QQ客戶端,不過(guò)有問(wèn)題,我登陸Q后,就被T了。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-08-04 19:37 sinodragon21

http://home.xxsyzx.com/home/ 看了Strive和樓主提到的這個(gè)URL,感覺(jué)真的很不可思議!太有才了~!Unbelievable!  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-08-04 20:19 矩陣操作

HTTP協(xié)議最麻煩是cookie那部分,以前寫過(guò),感覺(jué)好惡。。。

btw,也去看了這個(gè)http://home.xxsyzx.com/home/ ,靠,NB,這個(gè)webqq確實(shí)搞得不錯(cuò),我在上面聊了,很正常啊,沒(méi)有被T。回頭研究研究。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-08-04 20:27 francis

我很少相信天才,這一次不得不信。。。 而且是少年天才。。。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-08-04 20:53 矩陣操作

看了代碼,結(jié)構(gòu)設(shè)計(jì)和編寫質(zhì)量還可以,居然達(dá)到鄙人參加工作8年才達(dá)到的實(shí)力。。。。。代碼里面幾乎沒(méi)有注釋。。。

現(xiàn)在的年輕人,太厲害了。確實(shí)是個(gè)天才  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-09-04 11:12 dikatour

我覺(jué)得最后一段代碼有些問(wèn)題。
因?yàn)樽x出的文件內(nèi)容都是二進(jìn)制讀出,文件內(nèi)容可能包含'\0', 因此sprinf會(huì)丟棄'\0'后面的內(nèi)容。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2008-09-04 13:53 Kevin Lynx

@dikatour
這個(gè)測(cè)試?yán)哟_實(shí)可能出現(xiàn)這樣的問(wèn)題。但是在klhttpd中則不會(huì)存在,response的內(nèi)容都交給應(yīng)用層去做。

  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2009-06-01 10:20 zwp

我也寫過(guò)類似的程序,功能比lz這個(gè)稍微豐富一些,呵呵:)
http://sites.google.com/site/cxtools/socket-1/MiniWebServ.rar  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server[未登錄](méi) 2010-02-04 19:12 tess

我覺(jué)得這個(gè)程序有點(diǎn)問(wèn)題,用瀏覽器連上服務(wù)器以后,程序就進(jìn)入死循環(huán)了,一直進(jìn)行寫操作,而根本沒(méi)數(shù)據(jù)可寫。最近在學(xué)網(wǎng)絡(luò)開(kāi)發(fā),感謝樓主提供怎么好的例子:)。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2010-10-25 11:56 xx

Just Test  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2010-11-13 21:18 xx

@土仔
想當(dāng)初Linus也是剛剛買了太新機(jī)子,想試試386保護(hù)模式下編程而已,沒(méi)想到寫著寫著就成linux了。。。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server[未登錄](méi) 2011-10-16 23:13 cc

就這個(gè)。。。也好意思拿來(lái)顯擺。。。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2013-07-29 22:29 yyy

我也寫了一個(gè)WEB服務(wù)器:
http://www.crsky.com/soft/37864.html  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2013-07-30 09:26 業(yè)汶

學(xué)會(huì)了寫WEB服務(wù)器的思路,謝謝樓主。  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server[未登錄](méi) 2013-11-12 14:23 Fly

@yyy
你好!看了你寫的web服務(wù)器,挺不錯(cuò)的。代碼能否發(fā)一份給我呢?謝謝!
346296192@qq.com  回復(fù)  更多評(píng)論   

# re: 實(shí)現(xiàn)自己的http server 2014-03-20 16:58 io哦i

dfsdfs  回復(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>
            黄色成人在线免费| 国产无遮挡一区二区三区毛片日本| 久热精品视频| 老司机成人在线视频| 亚洲美女毛片| 精品二区视频| 一区视频在线| 91久久综合亚洲鲁鲁五月天| 国内久久视频| 亚洲电影第三页| 亚洲精品美女在线| 日韩一区二区精品葵司在线| 亚洲免费观看高清完整版在线观看| 激情自拍一区| 亚洲电影免费观看高清| 亚洲免费观看高清完整版在线观看熊 | 欧美激情一区二区三区全黄| 欧美在线一区二区| 欧美专区在线播放| 欧美黄色影院| 国产日韩精品电影| 亚洲欧洲一区二区三区久久| 亚洲精品乱码久久久久久蜜桃麻豆| 一本大道av伊人久久综合| 亚洲一区二区三区国产| 午夜激情久久久| 免费日韩精品中文字幕视频在线| 亚洲黑丝在线| 一本综合久久| 久久综合久久综合九色| 欧美性开放视频| 欧美一区亚洲二区| 欧美一区网站| 免费欧美视频| 国产精品xxxxx| 在线观看视频一区二区| 亚洲综合色在线| 亚洲国产精品专区久久| 香蕉成人啪国产精品视频综合网| 欧美激情亚洲国产| 伊人久久亚洲美女图片| 亚洲一级黄色av| 亚洲国产精品视频| 久久精品在线免费观看| 国产精品成人av性教育| 亚洲精品国久久99热| 一区二区三区国产精华| 久久免费视频这里只有精品| 欧美久久一级| 在线日韩一区二区| 欧美在线国产精品| 一区二区三区久久| 欧美jizz19hd性欧美| 国内精品写真在线观看| 午夜一区二区三视频在线观看| 欧美国产一区二区| 久久亚洲捆绑美女| 好吊色欧美一区二区三区四区| 亚洲自拍偷拍网址| 日韩亚洲欧美一区二区三区| 欧美成人一区二区三区| 亚洲高清在线观看一区| 久久综合网络一区二区| 欧美在线免费看| 国产亚洲日本欧美韩国| 欧美在线资源| 午夜精品99久久免费| 国产欧亚日韩视频| 亚洲免费在线观看视频| 在线视频日韩精品| 国产精品欧美一区喷水| 久久成人av少妇免费| 亚洲欧美日韩国产中文 | 亚洲一区二区三区乱码aⅴ| 欧美日韩在线三区| 亚洲伊人伊色伊影伊综合网| 亚洲视频1区2区| 国产欧美91| 久久影院午夜片一区| 久久综合伊人77777尤物| 最近中文字幕mv在线一区二区三区四区| 欧美电影在线免费观看网站| 亚洲国产岛国毛片在线| 欧美黄色视屏| 欧美调教vk| 久久精品国语| 美女任你摸久久| 亚洲欧美一区二区激情| 久久久久国色av免费看影院| 久久精品亚洲精品| 亚洲电影在线免费观看| 亚洲麻豆国产自偷在线| 国产九九精品视频| 巨乳诱惑日韩免费av| 欧美日韩国产色站一区二区三区| 亚洲欧美在线观看| 久久亚洲精品网站| 亚洲一级免费视频| 久久久久久亚洲精品杨幂换脸| 日韩一级黄色片| 亚洲一区二区三区免费观看| 怡红院精品视频| 一区二区三区四区在线| 亚洲风情亚aⅴ在线发布| 亚洲深夜福利| 亚洲精品乱码久久久久久蜜桃91 | 欧美淫片网站| 免费在线看一区| 亚洲欧美视频在线| 久久午夜av| 一区二区三区日韩欧美精品| 国产综合在线看| 一区二区高清在线| 亚洲精品少妇| 香蕉久久夜色精品国产使用方法| 亚洲最新在线| 免费在线国产精品| 免费成人高清视频| 国产一区二区三区的电影| 亚洲理论电影网| 亚洲激情av在线| 欧美中文字幕在线视频| 亚洲欧美日韩国产成人| 欧美精品国产一区| 欧美va天堂在线| 国产免费成人在线视频| 亚洲色在线视频| 亚洲综合色激情五月| 欧美激情a∨在线视频播放| 久久久久久久综合| 国产精品电影观看| 亚洲美女中文字幕| 亚洲区中文字幕| 久热成人在线视频| 欧美激情2020午夜免费观看| 国产一区二区欧美| 久久久九九九九| 欧美a级片网| 亚洲精品乱码久久久久久蜜桃91 | 久久国产精品一区二区三区| 欧美在线黄色| 国产欧美1区2区3区| 午夜日韩激情| 久久网站免费| 亚洲第一在线| 国产精品久久久久毛片软件| 欧美在线观看一二区| 亚洲国产欧洲综合997久久| 亚洲欧美日韩一区在线| 亚洲图片在区色| 欧美三级网址| 中文精品99久久国产香蕉| 欧美一区二区黄色| 黄色av日韩| 欧美福利视频| 一本色道久久精品| 性欧美办公室18xxxxhd| 国产日韩视频| 久久亚洲影音av资源网| 亚洲福利国产精品| 一区二区免费在线观看| 欧美体内she精视频| 亚洲一区免费网站| 欧美中文字幕在线播放| 今天的高清视频免费播放成人| 免费成人小视频| 亚洲日本一区二区| 性欧美18~19sex高清播放| 狠狠爱综合网| 欧美日在线观看| 欧美视频免费在线| 欧美一级片在线播放| 亚洲电影免费在线| 午夜视频一区在线观看| 狠狠综合久久| 欧美日韩一区不卡| 久久精品国产亚洲aⅴ| 亚洲国产成人av在线| 亚洲免费一在线| 亚洲国产精品美女| 国产精品成人av性教育| 久久精品女人天堂| 欧美fxxxxxx另类| 亚洲免费视频观看| 亚洲国产小视频| 欧美亚洲自偷自偷| 亚洲精品视频二区| 国产欧美日韩视频一区二区| 欧美激情精品| 久久精品一区二区三区不卡| 99精品国产在热久久下载| 美女国内精品自产拍在线播放| 亚洲中无吗在线| 日韩亚洲在线观看| 在线国产日韩| 国产一区二区视频在线观看| 欧美性大战久久久久久久| 欧美国产日本高清在线| 久久网站热最新地址| 久久国产精品第一页|