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

隨筆-145  評論-173  文章-70  trackbacks-0
      五一放假了,沒有到哪里去玩,雖然說還是很多事情要做,不過先做做這個再說。于是花了大概一天半的時間,搞定了這個小的程序,也算是回報吧!以后會繼續完善和補充的。
      話說上次騰訊2面的時候我表現太不好了,傷心啊~~~所以從現在起,要在忙中抽時間來繼續Coding,增強實力。估計過段時間的百度和其他實習不會去了,研究生真的很重要,所以要好好準備考研了,加油!
       不說廢話了,上筆記:


SMTP郵件發送剖析

封裝之后的類如下:



// MySmtp.cpp: implementation of the MySmtp class.
//
/**/
//////////////////////////////////////////////////////////////////////
 
#include 
"stdafx.h"
#include 
"MailExam.h"
#include 
"MySmtp.h"
#include 
"ZBase64.h"
 
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
 
 
#define COPYRIGHT "Smtp Client"         // 版權信息
#define BOUNDARY "www.hust.edu.cn"                                // 邊界字符串
/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**/
//////////////////////////////////////////////////////////////////////
 
MySmtp::MySmtp()
{
 
}
 
MySmtp::
~MySmtp()
{
 
}
 
bool MySmtp::CreateSocket()        //創建一個Socket
{
         
if(WSAStartup(0x0101&m_WSADATA) != 0)        //至此socket版本是2.2,第一個參數也可以是MAKEWORD( 2, 2 )
         {
                  ReleaseSocket();
                  
return false;             //創建失敗
         }
         
if( (m_SOCKET= socket(AF_INET,SOCK_STREAM, 0)) == INVALID_SOCKET){
                  ReleaseSocket();
                  
return false;
         }
         
return true;
}
 
//通過和比較碼比較來發現是否響應成功
bool MySmtp::CheckResponse(const char* RecvCode)
{
         
//將收到的和對應的碼字比較,判斷是否發生錯誤
         char buf[1024= {0};
         
if(recv(m_SOCKET,buf,1024,0== SOCKET_ERROR)
                  
return false;
         
else 
         {
                  
return buf[0== RecvCode[0&& buf[1== RecvCode[1]
                  
&&buf[2== RecvCode[2? true : false;
         }
}
 
bool MySmtp::Connect(const string SmtpAddr,const int Port)
{
         
if(!CreateSocket())
                  
return false;
         
//得到主機(要發送給的SMTP地址如smtp.sina.com.cn)地址,并將相應的信息寫入m_HOSTENT,
         
//就是在那個字符串中查找到相應信息并且構造一個結構體HOSTENT(這個記錄了很多信息,不僅僅是地址)
         if((m_HOSTENT = gethostbyname((SmtpAddr.c_str()))) == NULL) //將傳入的主機參數給m_HOSTENT
                  return false;
//    AfxMessageBox(m_HOSTENT->h_name);    //調試用的,找到HOSTENT的結構內容
//    AfxMessageBox(*m_HOSTENT->h_aliases);
         if(m_HOSTENT->h_addr_list[0== NULL)     //地址列表為空
         {
                  ReleaseSocket();
                  
return false;
         }
//    AfxMessageBox(m_HOSTENT->h_addr_list[0]);
//    AfxMessageBox(m_HOSTENT->h_addr_list[1]);
         memset(&m_SOCKADDR_IN,0,sizeof(m_SOCKADDR_IN));
         
//將這個SOCKET和主機地址聯系起來,其實WinSoket中,m_HOSTENT 和m_SOCKADDR_IN都是表示的主機地址,也就是目的地的地址
         
//
         m_SOCKADDR_IN.sin_family = AF_INET;
         m_SOCKADDR_IN.sin_addr.S_un.S_addr 
= *(ULONG *) m_HOSTENT->h_addr_list[0];
         m_SOCKADDR_IN.sin_port 
= htons(Port);
//    u_long tmp = *(ULONG *) m_HOSTENT->h_addr_list[0];
//     char newstring[30];
//    sprintf(newstring,"%d",tmp);
//    AfxMessageBox(newstring);
 
         
//進行連接
         if(connect(m_SOCKET,(sockaddr *)&m_SOCKADDR_IN,sizeof(m_SOCKADDR_IN)) == SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("220")) return false;                 //服務準備就緒
         
         
//向服務器發送"HELO "+服務器名
         string strTmp="HELO "+SmtpAddr+"\r\n";
         
if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR) 
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("250")) return false;                 //請求操作就緒
         
         
return true;
}
 
void MySmtp::ReleaseSocket()
{
         shutdown(m_SOCKET,SD_BOTH);
         closesocket(m_SOCKET);
         WSACleanup();
 
}
bool MySmtp::SendData(const string SendFrom, const string SendToList, 
                                              
const string SenderName, const string ReceiverName, 
                                              
const string Subject, const string Content )
{
         
if(SendFrom.empty())
                  
return false;    //源地址是空的
         if(SendToList.empty()) 
                  
return false;    //目的地址為空
         
         
string strTmp;
         ZBase64 base64;
         
         
//發送MAIL FROM:<abc@xyz.com>
         strTmp="MAIL FROM:<"+SendFrom+">\r\n";
         
if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("250")) return false;
         
         
//發送RCPT To:<abc@xyz.com>
         strTmp="RCPT To:<"+SendToList+">\r\n";
         
if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("250")) return false;
 
         
         
//發送"DATA\r\n"
         if(send(m_SOCKET,"DATA\r\n",strlen("DATA\r\n"),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("354")) return false;
         
         
//"Mail From:SenderName<xxx@mail.com>\r\n"
         strTmp="From:"+SenderName+"<"+SendFrom+">\r\n";
         
         
//"Subject: 郵件主題\r\n"
         strTmp+="Subject:"+Subject+"\r\n";
         
         
//"MIME_Version:1.0\r\n"
         strTmp+="MIME_Version:1.0\r\n";
         
         
//"X-Mailer:Smtp Client By xxx"//版權信息
         strTmp+="X-Mailer:"; strTmp+=COPYRIGHT; strTmp+="\r\n";
         
         
//"MIME_Version:1.0\r\n"
         strTmp+="MIME_Version:1.0\r\n";
         
         
//"Content-type:multipart/mixed;Boundary=xxx\r\n\r\n";
         strTmp+="Content-type:multipart/mixed;Boundary=";
         strTmp
+=BOUNDARY;
         strTmp
+="\r\n\r\n";
         
         
//先將HEADER部分發送過去
         if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;    
         }
         
         
//郵件主體
         strTmp="--";
         strTmp
+=BOUNDARY;
         strTmp
+="\r\n";
         strTmp
+= "Content-type:text/plain;Charset=gb2312\r\n";
         strTmp
+="Content-Transfer-Encoding:8bit\r\n\r\n";
         
         
//郵件內容
         strTmp+=Content+"\r\n\r\n";
         
         
//將郵件內容發送出去
         if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;    
         }
         strTmp
="--";
         strTmp
+=BOUNDARY;
         strTmp
+="--\r\n.\r\n";
         
         
if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("250")) return false;
         
         
//退出
         if(send(m_SOCKET,"QUIT\r\n",strlen("QUIT\r\n"),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("221")) return false;
         
         ReleaseSocket();
         
return true;
}
bool MySmtp::Validate(const string Username,const string Password)
{
         ZBase64 base64;
         
         
//發送"AUTH LOGIN"
         if(send(m_SOCKET,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("334")) return false;
         
         
//發送經base64編碼的用戶名
         string strUserName=base64.Encode((unsigned char *)Username.c_str(),Username.length())+"\r\n";
         
if(send(m_SOCKET,strUserName.c_str(),strUserName.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("334")) return false;
         
         
//發送經base64編碼的密碼
         string strPassword=base64.Encode((unsigned char *)Password.c_str(),Password.length())+"\r\n";
         
if(send(m_SOCKET,strPassword.c_str(),strPassword.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("235")) return false;
         
         
return true;
}

 

 

 

具體如何調用的是用這個實現:


void CMailExamDlg::OnOK() 
{
         
// TODO: Add extra validation here
         MySmtp smtp;
         CString strSmtpAddr,strAccount,strPasswrod;
         GetDlgItemText(IDC_EDIT1,strSmtpAddr);
         GetDlgItemText(IDC_EDIT2,strAccount);
         GetDlgItemText(IDC_EDIT3,strPasswrod);
         
if(!smtp.Connect((LPSTR)(LPCTSTR)strSmtpAddr,25)){
                  AfxMessageBox(
"連接服務器失敗!"); return ;    
         }
         
         
//驗證用戶名密碼
         if(!smtp.Validate((LPSTR)(LPCTSTR)strAccount,(LPSTR)(LPCTSTR)strPasswrod)){
                  AfxMessageBox(
"用戶名或密碼失敗!"); return ;        
         }
         CString SendFrom,SendToList,SenderName,RecevierName,Subject,Content;
         GetDlgItemText(IDC_EDIT4,SendFrom);
         GetDlgItemText(IDC_EDIT5,SendToList);
         GetDlgItemText(IDC_EDIT6,Content);
         GetDlgItemText(IDC_EDIT7,SenderName);
         GetDlgItemText(IDC_EDIT8,RecevierName);
         GetDlgItemText(IDC_EDIT9,Subject);
         
//發送
         if(!smtp.SendData((LPSTR)(LPCTSTR)SendFrom,
                  (LPSTR)(LPCTSTR)SendToList,
                  (LPSTR)(LPCTSTR)SenderName,
                  (LPSTR)(LPCTSTR)RecevierName,
                  (LPSTR)(LPCTSTR)Subject,
                  (LPSTR)(LPCTSTR)Content))
         {
                  AfxMessageBox(
"郵件發送失敗!"); 
                  
return ;
         }
         AfxMessageBox(
"郵件發送成功!");
//     CDialog::OnOK();
}

 

實際上本質就是,1,連接Connect,2,驗證賬戶密碼Validate,3,發送數據

 

 

最核心的部分:如何實現MySmtp?

首先看看類視圖,看看這個封裝的類到底實現了哪些功能:

                               

 

 

在這個部分,關鍵的是:connect,Validate,checkResponse,SendData,CreateSocket這些函數,分別來說明:

CreateSocket: 創建Socket,利用Socket來編寫郵件客戶端,就是需要利用到Socket來作為一個門戶啊,關于socket的解釋,這里不再多說,由于是用的Windows下面的平臺,所以需要用到的WinSock來編寫,對應的就需要一定的規則。具體來說就是需要WSAStartup來

這個函數是應用程序應該第一個調用的Winsock API 函數,以完成一系列初始化的工作。必不可少!

其次,就是需要完成真正的創建,所以調用Socket函數來實現,創建后的返回值就是一個SOCKET對象,需要保存它,因此專門定義一個類成員m_SOCKET來保存這個變量,使得以后不管是發送還是接受,都可以用這個變量來實現(前面已經說了,socket對象就是一個門戶,需要通過它來發送和接收)

 

 

checkResponse :需要通過這個函數來實時的檢查狀態,比如發送是否成功,并且可以得到相應的錯誤信息,也便于調試。

驗證從服務器返回的前三位代碼和傳遞進來的參數是否一樣

                           備注:

                           211 幫助返回系統狀態

                           214 幫助信息

                           220 服務準備就緒

                           221 關閉連接

                           235 用戶驗證成功

                           250 請求操作就緒

                           251 用戶不在本地,轉寄到其他路徑

                           334 等待用戶輸入驗證信息

                           354 開始郵件輸入

                           421 服務不可用

                           450 操作未執行,郵箱忙

                           451 操作中止,本地錯誤

                           452 操作未執行,存儲空間不足

                           500 命令不可識別或語言錯誤

                           501 參數語法錯誤

                           502 命令不支技

                           503 命令順序錯誤

                           504 命令參數不支持

                           550 操作未執行,郵箱不可用

                           551 非本地用戶

                           552 中止存儲空間不足

                           553 操作未執行,郵箱名不正確

                           554 傳輸失敗

為此,需要從socket接收數據,然后和標準的這些碼字,比如554來進行比較,通過比較的結果來決定是否響應正確,確定后面是否傳輸!具體的函數實際上就是一個recv來實現。而接收的結果,需要存放下來,然后手動比較,就有了

return buf[0] == RecvCode[0] && buf[1] == RecvCode[1]&&buf[2] == RecvCode[2] ? true : false;

The recv function receives data from a connected or bound socket.

 

 

Connect:連接部分其實也是一個很簡單的功能,就是要發送一個HELO + 服務器名,但是注意這個之前,需要完成一些操作。首先,就是要建立連接,讓它知道我要連接它,用connect函數。向對方主動提出連接請求。其次就是如何發送?當然是通過socket發送,調用send函數來實現了(都是底層的API),但是,由于是第一次發送,所以需要創建socket,所以調用了前面的CreateSocket來創建,(注意,代碼中多出用到了判斷語句,因為網絡中很容易就出現錯誤,所以需要實時的進行if判斷,及時定位錯誤,否則后面的編碼就容易出錯而不知道如何編寫),然后就是要根據send函數的參數來調用了。對于connect函數,根據API原型,需要SOCKADDR_IN類型的參數,也就是記錄了遠程主機(服務器)的地址信息的東西。我們可以知道的就只用smtp.sina.com.cn(這里以新浪郵箱為例),所以需要的操作就是,首先獲取主機名,得到一個HOSTENT的結構體,調用gethostbyname,這個函數的作用就是傳入一個主機名,如上面的smtp.sina.com.cn,它會自動的創建一個HOSTENT結構體,并用相應的主機信息來填充它。當然,這個還不夠,需要對于SOCKADDR_IN的其它部分賦值,所以需要其它的操作,對于類變量m_SOCKADDR_IN進行初始化,完成之后,就可以調用connect函數了,如果建立成功…………否則…………

一般的SOCKADDR_IN初始化是:

         m_SOCKADDR_IN.sin_family = AF_INET;

         m_SOCKADDR_IN.sin_addr.S_un.S_addr = *(ULONG *) m_HOSTENT->h_addr_list[0];

         m_SOCKADDR_IN.sin_port = htons(Port);

 

完成上面的一步之后,剩下來的就是發送第一個數據報文HELO來“打個招呼”了,這個很簡單,因為是有具體的規定,所以不難得到://向服務器發送"HELO "+服務器名

send(m_SOCKET,strTmp.c_str(),strTmp.length(),0)

注意完成之后可以及時的調用CheckResponse來檢測結果!

 

 

 

Validate:驗證密碼的正確性是一個很重要的步驟。首先發送一個報文請求服務器響應,根據得到的信息,決定服務器是否可以連接,從而下一步操作才有可行性。如果連接失敗,那么即使用戶名和密碼都正確,也會出現問題。如何驗證正確性?就是發送賬號和密碼。但是注意的是,在網絡SMTP傳輸中,需要使用編碼來傳輸,也就是說不是直接用的字面值,所以需要調用編碼函數,先編碼,在傳輸。這里引用了外部庫ZBase64庫來實現編碼,解碼。先不討論這部分。發送賬號和密碼很簡單,先調用加密函數編碼,然后發送,只是在這個之前,需要調用send(m_SOCKET,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0)來發送一個報文,說是要發送賬號密碼,注意就相當于加了一個label驗證的作用。實際上在后面的發送數據的時候,也是按照它定義的格式,先在前面有label,如Mail From,然后加上發送的內容,注意按照標準的格式來,才能實現穩定傳輸。

 

 

 

SendData:這部分也許是最復雜的。我先來討論最簡單的,就是發送文本文件,而沒有帶附件的。其實,發送數據的過程和前面的Connect是一樣的(特別是第一個HELO報文的發送),但是,要具體根據RFC文檔(SMTP對應)的來決定發送的報文頭和正文格式。如果格式不正確,那么,發送也是枉然。(注意發送的數據不需要用Base64來編碼),只是,需要用一定的個數,比如:

         strTmp="MAIL FROM:<"+SendFrom+">\r\n";

         if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)

         {

                  ReleaseSocket();

                  return false;

         }

來實現而已。

這部分最好的資料就是RFC文檔,其中講到了很多實際的例子和格式要求,其它的內容就是重復上面的代碼,很簡單。

(當然,這部分很容易出錯,造成發送說成功,但是收不到!我開始的時候沒QUIT部分報文,所以就出現發送提示成功但是沒有接收到的情況!)(待續……)

 

posted on 2010-05-02 15:59 deercoder 閱讀(3023) 評論(0)  編輯 收藏 引用 所屬分類: MFC程序設計入門
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美极品欧美精品欧美视频| 另类亚洲自拍| 国产麻豆精品在线观看| 欧美一级日韩一级| 噜噜噜躁狠狠躁狠狠精品视频| 韩国欧美国产1区| 另类天堂av| 夜夜嗨av一区二区三区网站四季av| 亚洲欧美一区二区视频| 国产一区二区中文| 美日韩精品免费观看视频| 亚洲三级影院| 欧美一区视频| 亚洲黑丝一区二区| 国产精品久久二区| 久久久久国产成人精品亚洲午夜| 亚洲国产91| 欧美一区二区| 亚洲国产欧美一区二区三区久久| 欧美激情亚洲| 欧美一区日韩一区| 91久久极品少妇xxxxⅹ软件| 性欧美超级视频| 亚洲国产精品精华液2区45| 欧美日韩中文字幕精品| 欧美在线关看| 9色精品在线| 美日韩免费视频| 亚洲伊人伊色伊影伊综合网| 永久免费精品影视网站| 国产精品v欧美精品v日韩精品| 久久九九有精品国产23| 夜夜精品视频| 欧美高清你懂得| 欧美在线播放一区| 99国产精品久久久久久久久久| 国产亚洲精久久久久久| 欧美男人的天堂| 久久亚洲精品中文字幕冲田杏梨 | 久久综合九色九九| 一区二区三区久久| 亚洲国产精品久久91精品| 国产精品视频yy9099| 欧美福利一区二区| 久久久噜久噜久久综合| 亚洲在线1234| 99视频精品| 亚洲人成在线观看一区二区| 老司机一区二区| 久久久91精品| 欧美在线1区| 亚洲欧美国产高清va在线播| 亚洲日韩欧美视频一区| 影音先锋日韩有码| 国内成人在线| 国产欧美一区二区色老头| 国产精品av免费在线观看| 欧美精品电影| 欧美成年视频| 欧美黄色片免费观看| 麻豆精品视频在线观看| 久久久久久夜| 久久久999精品| 久久精品国产一区二区三区免费看| 亚洲在线不卡| 一区二区毛片| 亚洲一区二区不卡免费| 一区二区三区蜜桃网| 日韩亚洲欧美高清| 99亚洲视频| 亚洲视频在线二区| 亚洲神马久久| 亚洲欧美国产另类| 西瓜成人精品人成网站| 性色av一区二区怡红| 性刺激综合网| 久久视频在线视频| 免费成人av在线| 欧美精品日韩精品| 欧美日韩直播| 国产精品女主播| 国产日韩欧美在线视频观看| 国产综合网站| 亚洲国产视频一区二区| 日韩午夜在线电影| 亚洲视频一区二区在线观看 | 亚洲性夜色噜噜噜7777| 亚洲欧美国产另类| 欧美淫片网站| 麻豆国产精品va在线观看不卡| 麻豆精品91| 亚洲精选视频免费看| 亚洲深夜激情| 久久久久一本一区二区青青蜜月| 美日韩丰满少妇在线观看| 欧美精品久久99| 国产精品日本| 在线观看亚洲精品视频| 99这里只有久久精品视频| 亚洲一区在线观看视频| 久久国产视频网站| 欧美国产成人精品| 一本色道久久综合亚洲二区三区 | 欧美午夜精品久久久久免费视 | 国产九九精品视频| 亚洲第一二三四五区| av成人福利| 久久精品中文| 亚洲伦理在线观看| 久久国产精品99国产精| 欧美黑人在线观看| 国产欧美亚洲一区| 亚洲精品影院| 久久精品二区| 99v久久综合狠狠综合久久| 性色av一区二区三区红粉影视| 免费国产一区二区| 国产精品视频大全| 亚洲精品日本| 欧美在线亚洲在线| 亚洲精品欧美激情| 久久精彩免费视频| 欧美三区在线视频| 亚洲电影免费观看高清完整版在线观看| 一个色综合av| 欧美成年人网| 亚洲欧美在线网| 欧美日韩精品在线视频| 在线观看中文字幕亚洲| 欧美一级视频| 日韩一级精品| 欧美xx视频| 狠狠色狠狠色综合人人| 亚洲欧美日韩精品在线| 欧美激情精品| 久久精品夜色噜噜亚洲aⅴ| 国产精品日韩在线| 一区二区三区四区五区精品视频| 免费观看欧美在线视频的网站| 亚洲一区二区三区精品在线观看| 欧美国产91| 亚洲欧洲美洲综合色网| 老牛嫩草一区二区三区日本| 亚洲影视在线| 欧美三级日韩三级国产三级| 亚洲日韩第九十九页| 欧美阿v一级看视频| 久久国产加勒比精品无码| 国产精品美女一区二区| 亚洲一区国产视频| 亚洲理论在线| 欧美日韩国产免费| 一个色综合av| 亚洲精品小视频在线观看| 欧美国产日韩视频| 亚洲人成久久| 亚洲国产小视频| 欧美1区免费| 亚洲精品系列| 亚洲精品久久在线| 欧美日韩国产123| 亚洲另类在线一区| 亚洲区在线播放| 欧美日本韩国| 亚洲午夜女主播在线直播| 一本大道久久a久久精品综合| 欧美日韩国语| 亚洲永久免费| 亚洲欧美日本伦理| 国产亚洲欧美在线| 久久综合图片| 欧美成va人片在线观看| 日韩午夜三级在线| 亚洲精品中文字幕在线| 国产精品白丝jk黑袜喷水| 亚洲欧美视频在线| 欧美一区久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲精品一区二区三区四区高清 | 久久精品视频99| 久久精品亚洲一区二区| 亚洲国产另类久久久精品极度| 亚洲黄色av| 国产精品久久久久久影视| 久久精品视频播放| 久久午夜精品一区二区| 一区二区电影免费观看| 亚洲一区二区三区影院| 韩国免费一区| 亚洲黄色在线| 国产精一区二区三区| 欧美a一区二区| 欧美日韩在线免费视频| 久久精品一区四区| 欧美大片免费久久精品三p| 亚洲欧美日韩第一区| 久久久久亚洲综合| 亚洲视频在线观看网站| 久久精品国产91精品亚洲| 99re热这里只有精品视频|