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

cc

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  38 隨筆 :: 14 文章 :: 21 評論 :: 0 Trackbacks
Eric?Bergman-Terrell?
.NET?Remoting?使您可以跨多臺計算機輕松進行分布計算,只需完成非常少的編程工作。在本文中,Eric?Bergman-Terrell?創(chuàng)建了一個名為?Digits?of?Pi?的應用程序,它使用并行的多臺計算機以不可思議的精度計算?p?值。他設法在?12?小時內完成了?10,000?位數(shù)的計算,卻只使用了相當少的計算資源。這比用一臺計算機單獨完成計算快了?300%。

單擊下載文件下載示例應用程序源代碼后,打開?Everything.sln?解決方案。此解決方案包含運行“Digits?of?Pi”應用程序所需的三個項目(Client、Server?和?ServerLoader)。還包含一個名為?SimpleClient?的項目,我們稍后再討論它。加載?Everything.sln?之后,請選擇?Build(編譯)|?Batch?Build...(批編譯...)。單擊?Select?All(全部選定)按鈕,然后單擊?Build(編譯)。編譯所有內容后,請在本地計算機以及您的?LAN?中的遠程計算機上安裝該軟件。

在本地計算機上,創(chuàng)建一個文件夾并將以下文件復制到其中:

Server\bin\Release\Plouffe_Bellard.dll
Client\bin\Release\DigitsOfPi.exe

在每個遠程計算機和本地計算機上,創(chuàng)建一個文件夾并將以下文件復制到其中:

Server\bin\Release\Plouffe_Bellard.dll
ServerLoader\bin\Release\ServerLoader.exe
ServerLoader\ServerLoader.exe.config

然后運行?ServerLoader.exe?程序。當然,運行?ServerLoader?和?Digits?of?Pi?程序之前,需要在每臺計算機上安裝?.NET?Framework。

在所有遠程計算機和本地計算機上運行?ServerLoader?程序后,請運行?Digits?of?Pi?程序。單擊?Configure...(配置...)(參見圖?1),添加本地計算機名和遠程計算機名。如果不確定某臺計算機的名稱,請查看?ServerLoader?程序,它在表中顯示其計算機名。如果您很幸運地擁有一個多?CPU?系統(tǒng),您只需為所有?CPU?輸入一次計算機名。只需在計算機名后鍵入?@?符號和一個編號。例如,如果您擁有一個名為“Brainiac”的雙?CPU?系統(tǒng),則鍵入以下計算機名:“Brainiac@1”和“Brainiac@2”。不必為多個?CPU?系統(tǒng)輸入多個計算機名,但是這樣做可以確保所有計算機的?CPU?都用于計算?p?值。輸入所有計算機名后,單擊?OK(確定)。

然后指定要計算的位數(shù)(參見圖?2)并單擊?Calculate(計算)。請從較少的位數(shù)開始,p?值小數(shù)點后面的位數(shù)越多,程序所需的時間就越長。

圖?3?顯示了?Digits?of?Pi?程序如何在本地計算機和遠程計算機中分配工作量,它使用?TCP/IP?端口?9000?發(fā)送請求并接收結果。接下來,我們將詳細探討?Remoting、Plouffe_Bellard?服務器對象、ServerLoader?程序、SimpleClient?程序和?Digits?of?Pi?程序。

Remoting?基礎
.NET?Remoting?使對象可以與其他對象通信,無論它們運行在同一臺計算機上還是運行在遠程計算機上。.NET?Remoting?與?Web?服務非常類似,但是?.NET?Remoting?技術更適于?Digits?of?Pi?這種完全以?.NET?編程語言編寫的應用程序,并且只能在運行?.NET?Framework?的計算機上運行。請參閱本文末尾“其他資源”中的“ASP.NET?Web?Services?or?.NET?Remoting:?How?to?Choose”,對兩種技術進行比較。?

您可以通過以下步驟使用?.NET?Remoting?訪問遠程對象:

創(chuàng)建從?System.MarshalByRefObject?繼承的?.NET?服務器對象?(DLL)。該服務器對象將在遠程計算機和本地計算機上運行。?
創(chuàng)建通過調用?RemotingConfiguration.Configure?加載服務器對象的服務器加載器程序。服務器加載器程序也將在遠程計算機和本地計算機上運行。?
創(chuàng)建使用?Activator.GetObject?訪問服務器對象的客戶端程序。您需要添加對服務器對象的引用以編譯此程序。此客戶端程序只在本地計算機上運行。?
服務器對象
服務器對象將計算指定的九位?p?值。它被命名為?Plouffe_Bellard,因為它使用?Fabrice?Bellard?的增強的?Simon?Plouffe?算法。雖然存在更快的算法,但?Plouffe-Bellard?算法非常簡單(少于?300?行源代碼),它使用少量的內存,并且由于九位數(shù)字可以單獨計算,因此更適于并行執(zhí)行。Plouffe_Bellard.CalculatePiDigits?方法將計算在指定位置開始的九位?p?值。例如,CalculatePiDigits(1)?從第一位開始返回九位數(shù)字:141592653。CalculatePiDigits(10)?從第十位開始返回九位數(shù)字,依此類推。?

ServerLoader
ServerLoader?程序將加載服務器對象,指定通過?LAN?訪問服務器對象的協(xié)議和端口,偵聽來自客戶端程序的傳入調用,處理調用并返回結果。特別值得注意的是,所有這些只需一行代碼便可完成,只需通過使用配置文件的路徑調用?RemotingConfiguration.Configure?方法。ServerLoader?程序將加載名為?ServerLoader.exe.config?的配置文件(參見表?1)。此配置文件指定以?SingleCall?模式加載服務器對象,即每個傳入調用都由服務器對象的一個新實例處理。如果服務器對象以?Singleton?模式加載,每個傳入調用都將由同一個實例處理。類型屬性指定服務器對象的完整類型名稱(包括?PB?命名空間)及其程序集的名稱。objectUri?屬性指定對象的統(tǒng)一資源標識符?(URI)?的端點。<channel>?元素指定使用?TCP?協(xié)議,端口?9000?訪問服務器對象。?

表?1:ServerLoader.exe.config。

<configuration>?
??<system.runtime.remoting>??
????<application?name?=?"ServerLoader">??
??????<service>?
????????<wellknown?
??????????mode="SingleCall"?
??????????type="PB.Plouffe_Bellard,Plouffe_Bellard"
??????????objectUri="Plouffe_Bellard"/>?
??????</service>?
??????<channels>?
????????<channel?ref="tcp?server"?port="9000"/>
??????</channels>?
????</application>?
??</system.runtime.remoting>
</configuration>?

SimpleClient
我創(chuàng)建了一個名為?SimpleClient?的程序,以說明客戶端程序訪問遠程計算機上的服務器對象是多么容易。要運行?SimpleClient,首先在遠程計算機上運行?ServerLoader,然后在本地計算機上運行?SimpleClient.exe?程序。在?Remote?Machine(遠程計算機)文本框中輸入遠程計算機的名稱,然后單擊?Calculate(計算)按鈕開始計算第一個九位?p?值。SimpleClient?的?CalculateButton_Click?方法包含客戶端訪問遠程服務器所需的所有代碼(參見表?2)。可以使用由遠程計算機名、協(xié)議?(TCP)?和端口號?(9000)?組成的?URL?訪問遠程服務器。例如,要訪問我的“Pentium?200”計算機,則?URL?為?tcp://Pentium?200:9000/ServerLoader/Plouffe_Bellard。創(chuàng)建?URL?后,將使用服務器的類型?(Plouffe_Bellard)?和?URL?調用?Activator.GetObject。然后,返回的值被轉換為?Plouffe_Bellard?對象以備使用。調用其?CalculatePiDigits?方法時,請求被發(fā)送到遠程計算機上的?ServerLoader。然后,服務器對象計算小數(shù)位。最后,在一個文本框中顯示返回客戶端程序的結果。?

表?2:用于訪問遠程服務器的?SimpleClient?代碼。

private?void?CalculateButton_Click(object?sender,?
??????????????????????????????System.EventArgs?e)
{
??Cursor.Current?=?Cursors.WaitCursor;

??Plouffe_Bellard?PiCalculator?=?null;

??String?MachineName?=?RemoteMachineTextBox.Text;

??try
??{
????int?port?=?9000;

????String?URL?=?"tcp://"?+?MachineName?+?":"?+?
???????port?+?"/ServerLoader/Plouffe_Bellard";
????PiCalculator?=?(Plouffe_Bellard)?
???????Activator.GetObject(typeof(Plouffe_Bellard),?URL);
????ResultsTextBox.Text?=?"3."?+?
???????PiCalculator.CalculatePiDigits(1);
??}
??catch(Exception)
??{
????MessageBox.Show(
???????"需要在計算機?"?+
???????MachineName,?"Simple?Client?上運行?ServerLoader.exe",?
???????MessageBoxButtons.OK,?MessageBoxIcon.Error);
??}

??Cursor.Current?=?Cursors.Arrow;
}

Digits?of?Pi?客戶端
Digits?of?Pi?客戶端程序比?SimpleClient?更復雜。SimpleClient?僅通過訪問遠程計算機上的服務器對象來計算前九位?p?值。而?Digits?of?Pi?則同時使用?Configure(配置)對話框中指定的遠程計算機和本地計算機(如圖?1?所示)并行計算用戶指定的小數(shù)位。服務器對象在單獨的線程中訪問,以便在可能需要很長時間的計算過程中保持?Digits?of?Pi?GUI?對用戶操作的響應性。?

Digits?of?Pi?使用數(shù)組將作業(yè)分為九位數(shù)據(jù)塊,將工作量分配到所有可用的計算機上。用戶單擊?Calculate(計算)按鈕后,將創(chuàng)建?SolutionArray(參見圖?4)。SolutionArray?為要計算的每組九位?p?值分配一個?SolutionItem?元素。服務器對象計算?m_Digit?字段指定的九位數(shù)組后,數(shù)位將存儲在?m_Results?成員中。m_MachineName?成員包含運行服務器的計算機的名稱。存儲計算機名是為了使?Digits?of?Pi?能夠顯示每臺計算機計算的小數(shù)總數(shù)(參見圖?2)。

為使服務器對象并行計算,Digits?of?Pi?將為每個服務器對象創(chuàng)建一個線程并啟動線程計算。然后,必須等待所有線程完成計算后才能顯示最終結果。WaitHandle?對于等待多個線程很有用。Digits?of?Pi?將為每個線程使用一個?WaitHandle,以等待所有線程完成計算。

將調用?CalculationThread.Calculate(參見表?3)以便為每個服務器對象創(chuàng)建一個線程。該操作將啟動線程運行,然后返回一個?AutoResetEvent(從?WaitHandle?衍生而來)。每個線程的?AutoResetEvent?都存儲在一個數(shù)組中,然后數(shù)組被傳遞給?WaitHandle.WaitAll。完成線程計算后,將對其?AutoResetEvent?調用?Set?方法。最后一個線程調用?Set?方法后,將返回?WaitAll?調用,并顯示?p?的值。

表?3:CalculationThread。

public?static?WaitHandle?Calculate(
SolutionArray?solutionArray,?String?machineName)
{
??CalculationThread?calculationThread?=?new?
????CalculationThread(solutionArray,?machineName);
??Thread?thread?=?new?Thread(new?
????ThreadStart(calculationThread.Calculate));
??thread.Start();
??return?calculationThread.calculationDone;
}

每個線程都使用相同的算法:如果有更多的工作要處理,線程將奪取下一個?SolutionItem,在?SolutionItem?中存儲服務器對象的計算機名,計算指定的九位小數(shù),并將結果存儲在?SolutionItem?中。此進程將一直運行,直到所有?SolutionItem?中都填充了結果。有關詳細信息,請參見表?4。

表?4:CalculationThread.Calculate。

public?void?Calculate()
{
??Plouffe_Bellard?PiCalculator?=?
????RemotePiCalculator.GetPiCalculator(
??????GetRealMachineName(machineName));

??if?(PiCalculator?!=?null)
??{
????SolutionItem?Item?=?null;
????bool?Abort;

????do
????{
??????Abort?=?solutionArray.Abort;

??????if?(!Abort)
??????{
????????Item?=?solutionArray.GetNextItem();

????????if?(Item?!=?null)
????????{
??????????Item.MachineName?=?machineName;

??????????try
??????????{
????????????Item.Results?=?
???????????PiCalculator.CalculatePiDigits(Item.Digit);
??????????}
??????????catch?(Exception?e)
??????????{
????????????Abort?=?true;
????????????MessageBox.Show(
??????????????"無法訪問主機上的遠程對象?"?+
??????????????machineName?+?Environment.NewLine?+?
??????????????Environment.NewLine?+?"Message:??"?+?
??????????????e.Message,?Globals.ProgramName,?
??????????????MessageBoxButtons.OK,?
??????????????MessageBoxIcon.Error);
??????????}

??????????UpdateStatisticsDelegate?USD?=?new?
????????????UpdateStatisticsDelegate(
??????????????MF.UpdateStatistics);

??????????MF.Invoke(USD,?new?Object[]?{}?;
????????}
??????}
????}?while?(Item?!=?null?&&?!Abort);

????calculationDone.Set();
??}
}

下面是逐步的說明:

GetRealMachineName?從多?CPU?計算機名中刪除?@1?模式。例如,GetRealMachineName("Brainiac@1"?返回?"Brainiac"。有關多?CPU?計算機名的解釋,請參見圖?1?對話框中的文本。?
知道正確的計算機名后,將其傳遞給?RemotePiCalculator.GetPiCalculator,這樣才可以通過?PiCalculator?變量訪問該計算機上的服務器對象。?
如果用戶單擊了?Cancel(取消)按鈕,將設置?Abort?屬性。如果?Abort?屬性為?true,線程將停止計算。?
對?MF.Invoke?的調用使線程可以安全地更新?ListView?中的統(tǒng)計數(shù)據(jù)(參見圖?2),即使該?ListView?是由另一個線程創(chuàng)建的。在?32?位?Windows?編程中,絕不允許在創(chuàng)建某個控件的線程之外處理該控件。?
完成循環(huán)(即計算完指定的所有?p?位數(shù)或者用戶單擊?Cancel?[取消]?按鈕)后,將調用線程的?AutoResetEvent?的?Set?函數(shù)。?
當每個線程都調用其?AutoResetEvent?的?Set?函數(shù)后,將返回對?WaitHandle.WaitAll?的調用并顯示結果。?
線程同步
如果?Digits?of?Pi?的代碼由多個線程同時訪問,可能會有多個地方出現(xiàn)錯誤。例如,如果兩個線程同時調用?SolutionArray.GetNextItem,可能會返回相同的內容。這就是在?GetNextItem?方法中設置?[MethodImpl(MethodImplOptions.Synchronized)]?屬性的原因,該屬性可以確保一次只有一個線程調用該方法。如果方法的每一行代碼都不應由多個線程同時訪問,則使方法同步是一個很好的策略。?

由于?MainForm.Calculate?方法只有一行代碼不能同時被多個線程訪問,因此它將在該行代碼之前調用?Monitor.Enter,并在其后調用?Monitor.Exit。如果該行代碼已在其他線程上運行,Monitor.Enter?將被阻止。如果整個函數(shù)已實現(xiàn)同步,那么只保護需要防止多個線程訪問的代碼行可以提高性能。

從?System.Windows.Forms.Control?衍生的對象(例如?Button、TextBoxe、RichTextBoxe、Label、ListBoxe、ListView?等等)只應由創(chuàng)建它們的線程處理。要從非創(chuàng)建線程中安全處理?Control?衍生對象,請首先將處理代碼放入一個方法,然后為該方法聲明一個代理:

delegate?void?SetResultsTextDelegate(String?Text);

private?void?SetResultsText(String?Text)
{
??ResultsRichTextBox.Text?=?Text;
}

然后使用?Form.Invoke?間接調用該方法:

SetResultsTextDelegate?SRTD?=?new?
???SetResultsTextDelegate(SetResultsText);

Invoke(SRTD,?new?object[]?{?""?}?;

Invoke?方法將從創(chuàng)建它的線程中調用該方法,它使用的參數(shù)與對象數(shù)組中的元素相對應。

小結
.NET?Remoting?是一種在遠程(和本地)計算機上執(zhí)行代碼的簡單而有效的機制。只需將代碼封裝到?.NET?對象中,編寫加載該對象并偵聽請求的程序,然后在客戶端程序中調用?Activator.GetObject。如果您的?LAN?中有一些閑置的計算機,可以利用它們輕松地解決并行問題。只需記住要使用正確的線程同步機制,以防止線程之間發(fā)生沖突。?

下載?TERRELL.ZIP

其他資源
“ASP.NET?Web?服務還是?.NET?Remoting:如何選擇?”(::URL::http://www.microsoft.com/china/msdn/library/dnbda/html/bdadotnetarch16.asp) ?一文很有用,它對?.NET?Web?Service?和?.NET?Remoting?進行了比較。?
Fabrice?Bellard's?Pi?Page?(::URL::http://fabrice.bellard.free.fr/pi/) ?提供了一些用于計算?p?值的有用公式和源代碼,包括?Digits?of?Pi?程序中使用的算法的?C?語言源代碼。?
有關遠程訪問程序的源代碼,請訪問?www.personalmicrocosms.com/html/ra.html。此程序使用?.NET?Remoting?顯示遠程計算機的桌面,并使用本地計算機的鍵盤和鼠標運行遠程計算機。?
有關數(shù)學化方面的內容,請參閱?Petr?Beckmann?著的《History?of?Pi》(St.?Martin's?Press?1971?年出版),這是一本相當不錯的書,因為?p?的歷史就是數(shù)學歷史的微觀反映。Beckmann?的書涵蓋了?p?的數(shù)學歷史以及政治歷史。?
Ingo?Rammer?的《Advanced?.NET?Remoting》(Apress?2002?年出版)是有關?Remoting?的權威指南。此書看起來更適合從頭到尾的詳細閱讀。我倒是希望此書能夠適合我的“隨便翻翻”的閱讀習慣。?
有關?Hardcore?Visual?Studio?.NET?和?Pinnacle?Publishing?的詳細信息,請訪問它們的?Web?站點?::URL::http://www.pinpub.com/。

注意:這不是?Microsoft?Corporation?的?Web?站點。Microsoft?對該站點的內容不承擔責任。

本文轉載自?2003?年?4?月份的?Hardcore?Visual?Studio?.NET。版權所有?2003?Pinnacle?Publishing,?Inc.(除非另行說明)。保留所有權利。Hardcore?Visual?Studio?.NET?是?Pinnacle?Publishing,?Inc.?獨立發(fā)行的刊物。未經(jīng)?Pinnacle?Publishing,?Inc.?事先同意,不得以任何形式使用或復制本文的任何部分(評論文章中的簡短引用除外)。如需與?Pinnacle?Publishing,?Inc.聯(lián)系,請致電?1-800-788-1900。
posted on 2006-12-07 15:02 醒目西西 閱讀(1980) 評論(9)  編輯 收藏 引用 所屬分類: 編程相關

評論

# re: 使用 .NET Remoting 實現(xiàn)并行計算 [轉] 2010-07-09 12:22 ReynaMARSH20
This seems to be very feasible to order thesis samples just about this good post in the <a href="http://www.exclusivethesis.com">thesis writing</a> service peculiarly when scholars do not have time.   回復  更多評論
  

# re: 使用 .NET Remoting 實現(xiàn)并行計算 [轉] 2010-10-07 14:08 essay service
Good post. But how to anticipate comment spamming? Because essays help could fail your degree.  回復  更多評論
  

# re: 使用 .NET Remoting 實現(xiàn)并行計算 [轉] 2013-08-22 18:12 this link
Check out Essays Review company whenever you need to glance over informative college paper writing service reviews.  回復  更多評論
  

# re: 使用 .NET Remoting 實現(xiàn)并行計算 [轉] 2013-08-25 17:55 custom essay writing services reviews
Don’t have the faintest idea which firm to select to get assistance from? Go over QualityEssay testimonials, and make a right decision.  回復  更多評論
  

# re: 使用 .NET Remoting 實現(xiàn)并行計算 [轉] 2013-08-25 20:49 EssaysService rewiew
Don’t have the faintest idea which firm to pick to get assistance from? Look through PremiumQualityEssays testimonials "best-writing-services.com", and arrive at a good decision.  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久www成人_看片免费不卡| 久久精品国产精品亚洲精品| 国产精品成人一区二区艾草| 欧美久久久久| 欧美精品激情在线观看| 欧美人成在线| 国产精品久久久久久久免费软件 | 先锋影音一区二区三区| 香蕉久久一区二区不卡无毒影院| 欧美一区二区三区啪啪| 牛夜精品久久久久久久99黑人| 欧美风情在线| 国产精品伦一区| 又紧又大又爽精品一区二区| 亚洲精品国产无天堂网2021| 亚洲欧美日韩精品久久亚洲区| 欧美亚洲免费高清在线观看| 欧美大片网址| 亚洲天堂免费在线观看视频| 久久大综合网| 欧美日韩一区二区三区在线看 | 国内精品伊人久久久久av影院 | 欧美高清视频在线| 国产精品高潮呻吟| 亚洲第一天堂av| 国产精品99久久久久久久久 | 夜夜嗨av一区二区三区中文字幕| 亚洲在线成人| 免费观看日韩av| 国产伦精品一区二区三区免费| 伊人激情综合| 日韩视频一区二区| 亚洲综合国产激情另类一区| 欧美一级久久久| 快射av在线播放一区| 欧美激情视频给我| 亚洲少妇诱惑| 久久久综合网站| 欧美精品一区二区在线播放| 国产精品亚洲一区| 在线成人h网| 宅男噜噜噜66一区二区| 久久精品一本久久99精品| 免费成人高清在线视频| 亚洲精品欧美在线| 欧美一区二区观看视频| 蜜臀av在线播放一区二区三区 | 欧美国产日韩一区二区| 国产精品久久久久久亚洲调教| 国产一区二区三区日韩欧美| 亚洲一区国产| 日韩午夜中文字幕| 欧美日韩你懂的| 一区二区三区高清视频在线观看 | 欧美一级大片在线观看| 久久久久国产精品一区| 国产精品永久在线| 亚洲专区在线| 国产精品99久久久久久有的能看| 欧美精品一区三区| 一区二区三区视频免费在线观看| 亚洲国产一区二区三区高清| 欧美一级专区| 国产日韩欧美在线看| 欧美一区二区久久久| 亚洲欧美视频在线| 国产一区二区久久| 美女久久一区| 欧美福利视频一区| 亚洲天堂免费在线观看视频| 亚洲一区二区三区色| 99riav1国产精品视频| 亚洲激情视频在线播放| 欧美精品在线看| 亚洲午夜av电影| 亚洲综合首页| 一区二区三区在线免费视频 | 日韩一级片网址| 99精品国产高清一区二区| 国产精品99一区二区| 久久精品日产第一区二区| 久久丁香综合五月国产三级网站| 亚洲电影观看| 中文精品在线| 一区在线观看| 日韩亚洲一区二区| 好吊色欧美一区二区三区视频| 欧美激情第3页| 国产精品美女视频网站| 久久性天堂网| 欧美午夜欧美| 免费亚洲视频| 国产精品久久久久影院亚瑟| 久久九九国产精品| 欧美日本亚洲视频| 久久成人免费日本黄色| 欧美国产视频一区二区| 久久精品国产一区二区三| 欧美精品福利在线| 久久精品国产一区二区三区| 欧美精品一区二区高清在线观看| 校园春色综合网| 欧美国产先锋| 麻豆freexxxx性91精品| 欧美亚一区二区| 亚洲国产日韩一级| 国内免费精品永久在线视频| 日韩亚洲欧美一区| 亚洲高清在线视频| 午夜一区在线| 亚洲欧美日韩在线一区| 欧美成年人视频网站欧美| 久久精品二区亚洲w码| 欧美手机在线视频| 亚洲国产精品精华液网站| 国产一区二区三区在线观看视频 | 久久久青草婷婷精品综合日韩| 亚洲专区免费| 欧美日韩日本网| 亚洲国产精品一区二区第四页av | 亚洲国产精品视频| 久久精品导航| 久久福利资源站| 国产精品高精视频免费| 亚洲精品中文字| 亚洲精品久久久久久久久久久| 久久久999精品免费| 久久亚洲综合色一区二区三区| 亚洲国产精品激情在线观看| 久久精品亚洲热| 亚洲欧美亚洲| 国产精品久久久久久久浪潮网站| 亚洲日本一区二区| 亚洲黄色影院| 欧美成人中文字幕| 亚洲风情亚aⅴ在线发布| 亚洲国产合集| 蜜臀91精品一区二区三区| 欧美大片在线观看一区| 亚洲国产一区二区视频| 免费成人在线观看视频| 欧美国产高潮xxxx1819| 亚洲国产婷婷| 欧美日韩国产在线播放| 一区二区三区欧美亚洲| 亚洲综合色丁香婷婷六月图片| 国产精品久久国产精品99gif| 一区二区三区色| 欧美在线一级va免费观看| 国产在线不卡视频| 美女日韩欧美| 日韩视频一区二区在线观看 | 欧美亚一区二区| 亚洲永久免费视频| 久久精品国产99国产精品澳门| 国产一区二区三区在线观看精品 | 亚洲免费中文字幕| 久久欧美中文字幕| 91久久中文| 欧美午夜电影在线| 午夜精品久久久久久久99黑人| 久久久之久亚州精品露出| 亚洲第一视频网站| 欧美日韩一区精品| 欧美在线高清视频| 亚洲欧洲综合| 久久国产精品一区二区三区| 影音先锋国产精品| 欧美日韩精品欧美日韩精品| 午夜激情亚洲| 亚洲激情视频网| 久久久久久9| 一本色道婷婷久久欧美| 国产最新精品精品你懂的| 欧美精品乱人伦久久久久久| 欧美一区二区大片| 99精品欧美一区| 免费在线播放第一区高清av| 亚洲网友自拍| 亚洲观看高清完整版在线观看| 国产精品v欧美精品v日本精品动漫 | 精品91在线| 欧美三级视频| 免费久久99精品国产| 欧美一级久久| 亚洲一区www| 国产精品成人观看视频免费| 最新成人av网站| 欧美一级在线播放| 亚洲美女中文字幕| 激情亚洲一区二区三区四区| 国产精品99免费看 | 午夜一区二区三区不卡视频| 亚洲精选在线观看| 欧美va天堂va视频va在线| 欧美一区二区三区免费视| 亚洲午夜久久久久久久久电影院| 亚洲黄色成人网| 伊人男人综合视频网| 国产手机视频精品|