日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

ACE_Proactor网络通信示例

發(fā)布時(shí)間:2025/3/21 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACE_Proactor网络通信示例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注:本文僅對(duì)使用ACE進(jìn)行網(wǎng)絡(luò)通信進(jìn)行演示說(shuō)明。本文中的代碼皆使用doxgen的注釋風(fēng)格。本文中使用的事件機(jī)制,其原理與實(shí)現(xiàn)請(qǐng)參考[ 基于C++的事件機(jī)制設(shè)計(jì)[2.0]]一文。

?

ACE的Proactor對(duì)Epoll和IOCP進(jìn)行了良好包裝,因此,使用ACE來(lái)進(jìn)行網(wǎng)絡(luò)開(kāi)發(fā)是相當(dāng)?shù)谋憷?#xff0c;性能也不差。閑言少敘,看代碼。

這里以TCP協(xié)議進(jìn)行流式通信。我們需要解析流,得出每次接收到的數(shù)據(jù)包大小和包含的數(shù)據(jù)域,假定我們的包結(jié)構(gòu)如下:

?

包序列號(hào)(32Bit) | 長(zhǎng)度(16Bit) | 數(shù)據(jù)域(大小為長(zhǎng)度所表示的字節(jié))... | (下一包)

?

通過(guò)分析由包序列號(hào)和長(zhǎng)度組成的包頭來(lái)解決半包,粘包等問(wèn)題,許多其它文章也有描述,這里就省略了。

這樣可以確定我們的包頭結(jié)構(gòu)如下:

?

[cpp] view plain copy
  • #pragma?pack(push)??
  • #pragma?pack(1)??
  • ????/**?
  • ????*?@brief?Tcp包頭結(jié)構(gòu)?
  • ????*/??
  • ????typedef?struct?tag_TTcpPackHeader??
  • ????{??
  • ????????unsigned?int?seq;?//<?包序號(hào)??
  • ????????unsigned?short?len;?//<?包長(zhǎng)度??
  • ????}TTcpPackHeader;??
  • #pragma?pack(pop)??
  • ///?包頭尺寸宏??
  • #define?TCP_PACK_HEADER_SIZE?sizeof(tag_TTcpPackHeader)??
  • .

    需要注意的是,要求在字節(jié)邊界對(duì)齊。

    ?

    現(xiàn)在來(lái)看看通過(guò)ACE來(lái)實(shí)現(xiàn)TCP通信需要哪些東西:

    INET_Addr 用于地址訪問(wèn)

    Task_Base 用于線程模型

    Message_Block 用于消息傳遞和數(shù)據(jù)容器

    Asynch_IO 異步通信

    Proactor IOCP架構(gòu)

    ?

    并且,要建立這樣的通信架構(gòu),我們需要:

    一個(gè)Acceptor:用于接受連接

    一個(gè)Handler:對(duì)應(yīng)于每個(gè)連接句柄,并用于數(shù)據(jù)的發(fā)送/接收。

    一個(gè)事件分發(fā)線程:以事件的形式將接收到數(shù)據(jù)分發(fā)出去,并在對(duì)應(yīng)的句柄上進(jìn)行數(shù)據(jù)發(fā)送。

    ?

    本示例并沒(méi)有采用在接收到數(shù)據(jù)時(shí)立即進(jìn)行處理的方式,而是通過(guò)創(chuàng)建一個(gè)額外的事件分發(fā)線程的形式,將數(shù)據(jù)包投遞到該線程的消息隊(duì)列中,由該線程向外派送。因此,數(shù)據(jù)處理與網(wǎng)絡(luò)層是隔離的,且網(wǎng)絡(luò)層能專注于通信,最大的發(fā)揮效用。

    ?

    好了,下面來(lái)看看實(shí)現(xiàn):

    先看Handler,參考ACE_Service_Handler,我們需要重載open(),addresses(), handle_read_stream(),handle_write_stream(),以在連接打開(kāi)時(shí)進(jìn)行讀寫流對(duì)象的初始化、獲取客戶端地址,處理輸入/輸入流。

    ?

    注:以T作為類的開(kāi)頭而不是C,是出于對(duì)曾經(jīng)偉大的BORLAND的深刻懷念。

    注:成員又以m_開(kāi)頭,是出于對(duì)現(xiàn)而今仍偉大的MS的深刻怨念。

    ?

    [cpp] view plain copy
  • /**?
  • *?@class?TTcpHandler?
  • *?@brief?Tcp連接句柄?
  • */??
  • class?TTcpHandler?:?public?ACE_Service_Handler??
  • {??
  • public:??
  • ????/**?
  • ????*?@brief?客戶端連接事件類型定義?
  • ????*?@param?[in]?ACE_UINT32?客戶端地址?
  • ????*?@param?[in]?ACE_UINT16?客戶端端口?
  • ????*?@param?[in]?TTcpHandler*?連接句柄?
  • ????*/??
  • ????typedef?TEvent<void,?ACE_UINT32,?ACE_UINT16,?TTcpHandler?*>?TOnClientConnect;??
  • ????/**?
  • ????*?@brief?客戶端斷開(kāi)連接事件類型定義?
  • ????*?@param?[in]?ACE_UINT32?客戶端地址?
  • ????*?@param?[in]?ACE_UINT16?客戶端端口?
  • ????*/??
  • ????typedef?TEvent<void,?ACE_UINT32,?ACE_UINT16>?TOnClientDisconnect;??
  • ????/**?
  • ????*?@brief?客戶端連接驗(yàn)證事件?
  • ????*?@param?[in]?ACE_UINT32?客戶端地址?
  • ????*?@param?[in]?ACE_UINT16?客戶端端口?
  • ????*?@return?bool?
  • ????*?-?true?驗(yàn)證通過(guò)?
  • ????*?-?false?驗(yàn)證失敗?
  • ????*/??
  • ????typedef?TEvent<bool,?ACE_UINT32,?ACE_UINT16>?TOnClientValidate;??
  • ????/**?
  • ????*?@brief?接收到客戶端數(shù)據(jù)事件類型定義?
  • ????*?@param?[in]?ACE_UINT32?客戶端地址?
  • ????*?@param?[in]?ACE_UINT16?客戶端端口?
  • ????*?@param?[in]?unsigned?int?數(shù)據(jù)包序列號(hào)?
  • ????*?@param?[in]?const?char*?數(shù)據(jù)區(qū)域指針?
  • ????*?@param?[in]?size_t?數(shù)據(jù)長(zhǎng)度?
  • ????*/??
  • ????typedef?TEvent<void,?ACE_UINT32,?ACE_UINT16,?unsigned?int,?const?char*,?unsigned?short>?TOnDataReceive;??
  • ??????
  • ????/**?
  • ????*?@brief?成功發(fā)送客戶端數(shù)據(jù)事件類型定義?
  • ????*?@param?[in]?ACE_UINT32?客戶端地址?
  • ????*?@param?[in]?ACE_UINT16?客戶端端口?
  • ????*?@param?[in]?unsigned?int?數(shù)據(jù)包序列號(hào)?
  • ????*?@param?[in]?const?char*?數(shù)據(jù)區(qū)域指針?
  • ????*?@param?[in]?size_t?數(shù)據(jù)長(zhǎng)度?
  • ????*/??
  • ????typedef?TEvent<void,?ACE_UINT32,?ACE_UINT16,?unsigned?int,?const?char*,?unsigned?short>?TOnDataSendSucceeded;??
  • ??????
  • ????/**?
  • ????*?@brief?失敗發(fā)送客戶端數(shù)據(jù)事件類型定義?
  • ????*?@param?[in]?ACE_UINT32?客戶端地址?
  • ????*?@param?[in]?ACE_UINT16?客戶端端口?
  • ????*?@param?[in]?unsigned?int?數(shù)據(jù)包序列號(hào)?
  • ????*?@param?[in]?const?char*?數(shù)據(jù)區(qū)域指針?
  • ????*?@param?[in]?size_t?數(shù)據(jù)長(zhǎng)度?
  • ????*/??
  • ????typedef?TEvent<void,?ACE_UINT32,?ACE_UINT16,?unsigned?int,?const?char*,?unsigned?short>?TOnDataSendFailed;??
  • private:??
  • ????ACE_Asynch_Read_Stream?m_Reader;?//<?異步讀數(shù)據(jù)流??
  • ????ACE_Asynch_Write_Stream?m_Writer;?//<?異步寫數(shù)據(jù)流??
  • ????ACE_Message_Block*?m_CurDataMB;?//<?當(dāng)前讀取數(shù)據(jù)??
  • ????ACE_INET_Addr?m_ClientAddr;?//<?客戶端地址??
  • public:??
  • ????/**?
  • ????*?@name?事件句柄?
  • ????*?@{?
  • ????*/??
  • ????DECL_PROP(TOnClientConnect,?OnClientConnect)?//<?客戶端連接事件句柄??
  • ????DECL_PROP(TOnClientDisconnect,?OnClientDisconnect)?//<?客戶端斷開(kāi)事件句柄??
  • ????DECL_PROP(TOnDataReceive,?OnDataReceive)?//<?接收到數(shù)據(jù)的事件句柄??
  • ????DECL_PROP(TOnDataSendSucceeded,?OnDataSendSucceeded)?//<?成功發(fā)送數(shù)據(jù)的事件句柄??
  • ????DECL_PROP(TOnDataSendFailed,?OnDataSendFailed)?//<?發(fā)送數(shù)據(jù)失敗的事件句柄??
  • ????/**?
  • ????*?@}?
  • ????*/??
  • public:??
  • ????///?ctor??
  • ????TTcpHandler();??
  • ??????
  • ????///?dtor??
  • ????~TTcpHandler();??
  • ??????
  • ????/**?
  • ????*?@brief?發(fā)送數(shù)據(jù)?
  • ????*?@param?[in]?unsigned?int?數(shù)據(jù)包序列號(hào)?
  • ????*?@param?[in]?const?char*?要發(fā)送的數(shù)據(jù)區(qū)域指針?
  • ????*?@param?[in]?size_t?要發(fā)送的數(shù)據(jù)長(zhǎng)度?
  • ????*?@return?int?
  • ????*?-?0?成功?
  • ????*?-?1?失敗?
  • ????*/??
  • ????int?send(unsigned?int?seq,?const?char*?data,?unsigned?short?size);??
  • ??????
  • ????/**?
  • ????*?@brief?打開(kāi)句柄?
  • ????*?@see?ACE_Service_Handler?
  • ????*/??
  • ????virtual?void?open(ACE_HANDLE?h,?ACE_Message_Block&?mb);??
  • ????/**?
  • ????*?@brief?獲取地址?
  • ????*?@see?ACE_Service_Handler?
  • ????*/??
  • ????virtual?void?addresses?(const?ACE_INET_Addr?&remote_address,??
  • ??????????????????????????const?ACE_INET_Addr?&local_address);??
  • ??????
  • ????/**?
  • ????*?@brief?讀取流數(shù)據(jù)?
  • ????*?@see?ACE_Service_Handler?
  • ????*/??
  • ????virtual?void?handle_read_stream(const?ACE_Asynch_Read_Stream::Result&?result);??
  • ????/**?
  • ????*?@brief?寫入流數(shù)據(jù)?
  • ????*?@see?ACE_Service_Handler?
  • ????*/??
  • ????virtual?void?handle_write_stream(const?ACE_Asynch_Write_Stream::Result&?result);??
  • ????/**?
  • ????*?@brief?初始化當(dāng)前數(shù)據(jù)接收緩沖事件?
  • ????*/??
  • ????void?initCurDataMB();??
  • };?//?class?TTcpHandler??
  • ?

    而相應(yīng)滴,Acceptor在接受連接時(shí),產(chǎn)生出的Handler應(yīng)該是TTcpHandler類型,其定義如下:

    注意,為了將事件句柄與連接句柄(TTcpHandler)掛鉤,這里重載了make_handler()。而重載validate_connection則是為了讓連接驗(yàn)證事件能夠在恰當(dāng)?shù)臅r(shí)機(jī)被激發(fā)。

    [cpp] view plain copy
  • /**?
  • *?@class?TTcpAcceptor?
  • *?@brief?TCP接受器?
  • *?@see?ACE_Asynch_Acceptor?
  • *?@see?TTcpHandler?
  • */??
  • class?TTcpAcceptor?:?public?ACE_Asynch_Acceptor<TTcpHandler>??
  • {??
  • public:??
  • ????/**?
  • ????*?@name?TCP事件句柄?
  • ????*?@see?TTcpHandler?
  • ????*?@{?
  • ????*/??
  • ????DECL_PROP(TTcpHandler::TOnClientConnect,?OnClientConnect)??
  • ????DECL_PROP(TTcpHandler::TOnClientDisconnect,?OnClientDisconnect)??
  • ????DECL_PROP(TTcpHandler::TOnClientValidate,?OnClientValidate)??
  • ????DECL_PROP(TTcpHandler::TOnDataReceive,?OnDataReceive)??
  • ????DECL_PROP(TTcpHandler::TOnDataSendSucceeded,?OnDataSendSucceeded)??
  • ????DECL_PROP(TTcpHandler::TOnDataSendFailed,?OnDataSendFailed)??
  • ????/**?
  • ????*?@}?
  • ????*/??
  • protected:??
  • ????/**?
  • ????*?@brief?連接驗(yàn)證?
  • ????*?@note?激發(fā)?OnClientValidate?事件?@see?TOnClientValidate?
  • ????*?@see?ACE_Asynch_Acceptor?
  • ????*/??
  • ????virtual?int?validate_connection?(const?ACE_Asynch_Accept::Result&?result,??
  • ???????????????????????????????const?ACE_INET_Addr?&remote,??
  • ???????????????????????????????const?ACE_INET_Addr&?local);??
  • ????/**?
  • ????*?@brief?創(chuàng)建連接句柄事件?
  • ????*?@see?ACE_Asynch_Acceptor?
  • ????*/??
  • ????virtual?TTcpHandler*?make_handler(void);??
  • };?//?class?TTcpAcceptor??
  • ?

    有了Acceptor和Handler,還需要使之運(yùn)行于Proactor模式下,因此有了以下線程:

    [cpp] view plain copy
  • /**?
  • *?@class?TTcpNetThread?
  • *?@brief?TCP網(wǎng)絡(luò)線程?
  • *?@see?ACE_Task_Base?
  • *?@see?ACE_Proactor?
  • */??
  • class?TTcpNetThread?:?public?ACE_Task_Base??
  • {??
  • public:??
  • ????/**?
  • ????*?@name?TCP事件句柄?
  • ????*?@see?TTcpHandler?
  • ????*?@{?
  • ????*/??
  • ????DECL_PROP(TTcpHandler::TOnClientConnect,?OnClientConnect)??
  • ????DECL_PROP(TTcpHandler::TOnClientDisconnect,?OnClientDisconnect)??
  • ????DECL_PROP(TTcpHandler::TOnClientValidate,?OnClientValidate)??
  • ????DECL_PROP(TTcpHandler::TOnDataReceive,?OnDataReceive)??
  • ????DECL_PROP(TTcpHandler::TOnDataSendSucceeded,?OnDataSendSucceeded)??
  • ????DECL_PROP(TTcpHandler::TOnDataSendFailed,?OnDataSendFailed)??
  • ????/**?
  • ????*?@}?
  • ????*/??
  • ????///?運(yùn)行??
  • ????int?open();??
  • ????///?停止運(yùn)行??
  • ????int?close();??
  • protected:??
  • ????///?線程函數(shù)??
  • ????virtual?int?svc();??
  • };??
  • ?

    最后再看看事件分發(fā)線程,該線程也是對(duì)上述實(shí)現(xiàn)的聚合和封裝,對(duì)外暴露事件和發(fā)送方法:

    注意,該類也負(fù)責(zé)響應(yīng)TTcpNetThread所激發(fā)的事件,所以需要派生自TObject。

    ?

    [cpp] view plain copy
  • /**?
  • *?@class?TTcp?
  • *?@brief?TCP接收和事件處理代理線程?
  • */??
  • class?TTcp?:?public?TObject,?public?ACE_Task<ACE_MT_SYNCH>??
  • {??
  • public:??
  • ????/**?
  • ????*?@name?重定義事件類型?
  • ????*?@see?TTcpHandler?
  • ????*?@{?
  • ????*/??
  • ????typedef?TTcpHandler::TOnClientConnect?TOnClientConnect;??
  • ????typedef?TTcpHandler::TOnClientDisconnect?TOnClientDisconnect;??
  • ????typedef?TTcpHandler::TOnClientValidate?TOnClientValidate;??
  • ????typedef?TTcpHandler::TOnDataReceive?TOnDataReceive;??
  • ????typedef?TTcpHandler::TOnDataSendSucceeded?TOnDataSendSucceeded;??
  • ????typedef?TTcpHandler::TOnDataSendFailed?TOnDataSendFailed;??
  • ????/**?
  • ????*?@}?
  • ????*/??
  • private:??
  • ????/**?
  • ????*?@name?成員變量?
  • ????*?@{?
  • ????*/??
  • ????ACE_Recursive_Thread_Mutex?m_Lock;?//<?線程鎖??
  • ????hash_map<unsigned?__int64,?TTcpHandler?*>?m_AddrMap;?//<?地址/句柄映射??
  • ????TTcpNetThread*?m_TcpNetThd;??
  • ????/**?
  • ????*?@}?
  • ????*/??
  • public:??
  • ????/**?
  • ????*?@name?TCP事件句柄?
  • ????*?@see?TTcpHandler?
  • ????*?@{?
  • ????*/??
  • ????DECL_PROP(TTcpHandler::TOnClientConnect,?OnClientConnect)??
  • ????DECL_PROP(TTcpHandler::TOnClientDisconnect,?OnClientDisconnect)??
  • ????DECL_PROP(TTcpHandler::TOnClientValidate,?OnClientValidate)??
  • ????DECL_PROP(TTcpHandler::TOnDataReceive,?OnDataReceive)??
  • ????DECL_PROP(TTcpHandler::TOnDataSendSucceeded,?OnDataSendSucceeded)??
  • ????DECL_PROP(TTcpHandler::TOnDataSendFailed,?OnDataSendFailed)??
  • ????/**?
  • ????*?@}?
  • ????*/??
  • public:??
  • ????///?ctor??
  • ????TTcp();??
  • ????///?dtor??
  • ????~TTcp();??
  • ????///?運(yùn)行??
  • ????void?open();??
  • ????///?停止??
  • ????void?close();??
  • ??????
  • ????///?發(fā)送數(shù)據(jù)??
  • ????int?send(ACE_UINT32?ip,?ACE_UINT16?port,?unsigned?int?seq,?const?char*?buf,?unsigned?short?len);??
  • private:??
  • ????///?線程函數(shù)??
  • ????virtual?int?svc();??
  • private:??
  • ????/**?
  • ????*?@name?TTcpNetThread?事件處理方法?
  • ????*?關(guān)于事件原型的定義,請(qǐng)參考?@see?TTcpHandler?
  • ????*?@{?
  • ????*/??
  • ????void?tcpNetThread_OnClientConnect(ACE_UINT32?ip,?ACE_UINT16?port,?TTcpHandler*?handler);??
  • ????void?tcpNetThread_OnClientDisconnect(ACE_UINT32?ip,?ACE_UINT16?port);??
  • ????void?tcpNetThread_OnDataReceive(ACE_UINT32?ip,?ACE_UINT16?port,?unsigned?int?seq,?const?char*?data,?unsigned?short?size);??
  • ????void?tcpNetThread_OnDataSendSucceeded(ACE_UINT32?ip,?ACE_UINT16?port,?unsigned?int?seq,?const?char*?data,?unsigned?short?size);??
  • ????void?tcpNetThread_OnDataSendFailed(ACE_UINT32?ip,?ACE_UINT16?port,?unsigned?int?seq,?const?char*?data,?unsigned?short?size);??
  • ????/**?
  • ????*?@}?
  • ????*/??
  • };?//?class?TTcp??
  • ?

    現(xiàn)在基本格調(diào)已經(jīng)確定,需要做的是編寫具體實(shí)現(xiàn)代碼了。

    ?

    ?

    此乃末技。

    ?

    ?

    應(yīng)用ACE來(lái)作為底層通信的框架,已經(jīng)是許多年前的技術(shù)了,這里純粹是湊字?jǐn)?shù),騙更新滴。這樣的老東西,確實(shí)是相當(dāng)?shù)淖屓藷o(wú)語(yǔ)。

    ?現(xiàn)在我們一步步來(lái)看看實(shí)現(xiàn):

    先是TTcpAcceptor,該類僅重載了兩個(gè)方法,如下:

    [cpp] view plain copy
  • #include?"TCPAcceptor.h"??
  • namespace?igame??
  • {??
  • ????int?TTcpAcceptor::validate_connection?(const?ACE_Asynch_Accept::Result&?result,??
  • ???????????????????????????????????????const?ACE_INET_Addr?&remote,??
  • ???????????????????????????????????????const?ACE_INET_Addr&?local)??
  • ????{??
  • ????????if?(m_OnClientValidate.valid())??
  • ????????????//?這里激發(fā)TOnClientValidate事件??
  • ????????????return?m_OnClientValidate(remote.get_ip_address(),?remote.get_port_number())???0?:?-1;??
  • ????????else??
  • ????????????return?0;?//?默認(rèn)允許連接??
  • ????}??
  • ????TTcpHandler*?TTcpAcceptor::make_handler(void)??
  • ????{??
  • ????????TTcpHandler*?handler?=?0;??
  • ????????ACE_NEW_RETURN?(handler,?TTcpHandler(),?0);??
  • ????????//?設(shè)置事件句柄??
  • ????????handler->setOnClientConnect(m_OnClientConnect);??
  • ????????handler->setOnClientDisconnect(m_OnClientDisconnect);??
  • ????????handler->setOnDataReceive(m_OnDataReceive);??
  • ????????handler->setOnDataSendSucceeded(m_OnDataSendSucceeded);??
  • ????????handler->setOnDataSendFailed(m_OnDataSendFailed);??
  • ????????return?handler;??
  • ????}??
  • }?//?namespace?igame??
  • ?

    復(fù)雜的部分在TTcpHandler,該類不僅需要接收數(shù)據(jù)(拼包),也要處理發(fā)送:

    ?

    [cpp] view plain copy
  • #include?"TcpHandler.h"??
  • namespace?igame??
  • {??
  • ????TTcpHandler::TTcpHandler()??
  • ????????:m_CurDataMB(0)?//?初始化??
  • ????{?}??
  • ????TTcpHandler::~TTcpHandler()??
  • ????{??
  • ????????if?(handle()?!=?ACE_INVALID_HANDLE)??
  • ????????{??
  • ????????????ACE_OS::closesocket(handle());?//?關(guān)閉句柄??
  • #ifdef?_DEBUG??
  • ????????????//?打印調(diào)試信息??
  • ????????????ACE_TCHAR?remoteAddrStr[128];??
  • ??????????????
  • ????????????m_ClientAddr.addr_to_string(remoteAddrStr,?sizeof(remoteAddrStr)?/?sizeof(ACE_TCHAR));??
  • ????????????ACE_DEBUG((LM_INFO,?ACE_TEXT("Disconnect?from?%s/n"),?remoteAddrStr));??
  • #endif??
  • ????????????//?客戶端斷開(kāi)??
  • ????????????m_OnClientDisconnect(m_ClientAddr.get_ip_address(),?m_ClientAddr.get_port_number());??
  • ????????????if?(m_CurDataMB)??
  • ????????????????m_CurDataMB->release();??
  • ????????}??
  • ????}??
  • ????int?TTcpHandler::send(unsigned?int?seq,?const?char*?data,?unsigned?short?dataSize)??
  • ????{??
  • ????????ACE_Message_Block*?dataMB?=?0;??
  • ??????????
  • ????????ACE_NEW_NORETURN(dataMB,?ACE_Message_Block(sizeof(unsigned?int)?+?sizeof(unsigned?short)?+?dataSize));??
  • ??????????
  • ????????short?len?=?dataSize;??
  • ????????dataMB->copy((const?char?*)&seq,?sizeof(unsigned?int));?//?這里沒(méi)有處理seq??
  • ????????dataMB->copy((const?char?*)&len,?sizeof(unsigned?short));??
  • ????????dataMB->copy((const?char?*)data,?dataSize);??
  • ??????????????
  • ????????int?ret?=?m_Writer.write(*dataMB,?dataMB->length());?//?發(fā)送??
  • ????????if?(ret?==?-1)??
  • ????????????m_OnDataSendFailed(m_ClientAddr.get_ip_address(),?m_ClientAddr.get_port_number(),?seq,?data,?dataSize);??
  • ????????else??
  • ????????????m_OnDataSendSucceeded(m_ClientAddr.get_ip_address(),?m_ClientAddr.get_port_number(),?seq,?data,?dataSize);??
  • ????????return?ret;??
  • ????}??
  • ????void?TTcpHandler::addresses?(const?ACE_INET_Addr?&remote_address,??
  • ??????????????????????????const?ACE_INET_Addr?&local_address)??
  • ????{??
  • ????????m_ClientAddr?=?remote_address;?//?取得客戶端地址??
  • ????}??
  • ????void?TTcpHandler::open(ACE_HANDLE?h,?ACE_Message_Block&?mb)??
  • ????{??
  • ????????handle(h);?//?set?handle??
  • ??????????
  • ????????if?(m_Reader.open(*this)?==?-1)?//?允許讀??
  • ????????{??
  • ????????????ACE_ERROR((LM_ERROR,?ACE_TEXT("failed?to?open?read?handle?%i/n"),?errno));??
  • ????????????delete?this;??
  • ????????????return;??
  • ????????}??
  • ????????if?(m_Writer.open(*this)?==?-1)?//?允許寫??
  • ????????{??
  • ????????????ACE_ERROR((LM_ERROR,?ACE_TEXT("failed?to?open?write?handle?%i/n"),?errno));??
  • ????????????delete?this;??
  • ????????????return;??
  • ????????}??
  • ??????????
  • ????????//?激發(fā)客戶端連接事件??
  • ????????m_OnClientConnect(m_ClientAddr.get_ip_address(),?m_ClientAddr.get_port_number(),?this);??
  • ????????initCurDataMB();??
  • ??????????
  • ????????m_Reader.read(*m_CurDataMB,?m_CurDataMB->space());?//?讀數(shù)據(jù)??
  • ????}??
  • ????void?TTcpHandler::handle_read_stream(const?ACE_Asynch_Read_Stream::Result&?result)??
  • ????{??
  • ????????ACE_Message_Block&?mb?=?result.message_block();??
  • ????????if?(!result.success()?||?result.bytes_transferred()?==?0)?//?no?data?or?failed???
  • ????????{??
  • ????????????mb.release();??
  • ????????????delete?this;??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????if?(this->m_CurDataMB->length()?<?TCP_PACK_HEADER_SIZE)?//?try?to?read?header?info??
  • ????????????{??
  • ????????????????this->m_Reader.read(*m_CurDataMB,?m_CurDataMB->space());??
  • ????????????????return?;??
  • ????????????}??
  • ????????????TTcpPackHeader*?header?=?reinterpret_cast<TTcpPackHeader?*>(this->m_CurDataMB->rd_ptr());??
  • ????????????ACE_Message_Block*?dataMB?=?this->m_CurDataMB->cont();??
  • ????????????if?(!dataMB)??
  • ????????????{??
  • ????????????????ACE_NEW_NORETURN(dataMB,?ACE_Message_Block(header->len));??
  • ????????????????if?(dataMB)??
  • ????????????????????this->m_CurDataMB->cont(dataMB);??
  • ????????????????else??
  • ????????????????{??
  • ????????????????????this->m_CurDataMB->release();??
  • ????????????????????ACE_DEBUG((LM_ERROR,?ACE_TEXT("Failed?to?allocated:?%i/n"),?errno));??
  • ????????????????????delete?this;??
  • ????????????????????return?;??
  • ????????????????}??
  • ????????????}??
  • ??????????????
  • ????????????if?(dataMB->length()?==?header->len)??
  • ????????????{??
  • ????????????????//?成功讀取了數(shù)據(jù)???
  • ????????????????m_OnDataReceive(m_ClientAddr.get_ip_address(),?m_ClientAddr.get_port_number(),?header->seq,?dataMB->rd_ptr(),?header->len);??
  • ??????????????????
  • ????????????????m_CurDataMB->release();??
  • ????????????????initCurDataMB();?//?下一包數(shù)據(jù)??
  • ??????????????????
  • ????????????????this->m_Reader.read(*m_CurDataMB,?m_CurDataMB->space());?//?next,?try?to?get?header??
  • ????????????????return?;??
  • ????????????}??
  • ??????????????
  • ????????????this->m_Reader.read(*dataMB,?dataMB->space());?//?try?to?get?data?left??
  • ????????}??
  • ????}??
  • ????void?TTcpHandler::handle_write_stream(const?ACE_Asynch_Write_Stream::Result&?result)??
  • ????{??
  • ????????if?(result.success()?&&?result.bytes_transferred()?>?0)?//?發(fā)送成功??
  • ????????{??
  • ????????????ACE_Message_Block&?mb?=?result.message_block();??
  • #ifdef?_DEBUG??
  • ????????????ACE_TCHAR?addrStr[128];??
  • ??????????????
  • ????????????m_ClientAddr.addr_to_string(addrStr,?sizeof(addrStr)?/?sizeof(ACE_TCHAR));??
  • ??????????????
  • ????????????ACE_DEBUG((LM_INFO,?ACE_TEXT("Send?to?client:?%s?len:%i/n"),?addrStr,?result.bytes_transferred()));??
  • ??????????????
  • ????????????char*?ptr?=?mb.rd_ptr();??
  • ??????????????
  • #endif??
  • ??????????????
  • ????????????mb.release();??
  • ????????}??
  • ????}??
  • ????void?TTcpHandler::initCurDataMB()??
  • ????{??
  • ????????ACE_NEW_NORETURN(m_CurDataMB,?ACE_Message_Block(TCP_PACK_HEADER_SIZE,?TCP_DATA_RECEIVE));??
  • ????}??
  • }?//?namespace?igame??
  • ?

    然后是TTcpNetThread,該類的實(shí)現(xiàn)也相當(dāng)簡(jiǎn)單:

    [cpp] view plain copy
  • #include?<ace/Proactor.h>??
  • #include?"TCPNetThread.h"??
  • namespace?igame??
  • {??
  • ????int?TTcpNetThread::open()?{?return?this->activate();?}??
  • ????int?TTcpNetThread::close()??
  • ????{??
  • ????????ACE_Proactor::instance()->proactor_end_event_loop();?//?終止ACE_Proactor循環(huán)??
  • ????????this->wait();?//?等待清理現(xiàn)場(chǎng)??
  • ????????return?0;??
  • ????}??
  • ??????
  • ????int?TTcpNetThread::svc()??
  • ????{??
  • ????????ACE_INET_Addr?listenAddr(DEF_LISTENING_PORT);?//?默認(rèn)監(jiān)聽(tīng)地址??
  • ????????TTcpAcceptor?tcpAcceptor;?//?接收器??
  • ????????//?設(shè)置事件??
  • ????????tcpAcceptor.setOnClientConnect(m_OnClientConnect);??
  • ????????tcpAcceptor.setOnClientDisconnect(m_OnClientDisconnect);??
  • ????????tcpAcceptor.setOnClientValidate(m_OnClientValidate);??
  • ????????tcpAcceptor.setOnDataReceive(m_OnDataReceive);??
  • ????????tcpAcceptor.setOnDataSendFailed(m_OnDataSendFailed);??
  • ????????tcpAcceptor.setOnDataSendSucceeded(m_OnDataSendSucceeded);??
  • ??????????
  • ????????//?演出開(kāi)始??
  • ????????if?(tcpAcceptor.open(listenAddr,?0,?1,?5,?1,?0,?0)?!=?0)??
  • ????????????ACE_ERROR_RETURN((LM_ERROR,?ACE_TEXT("%p/n"),?ACE_TEXT("failed?to?open?TcpAcceptor?errno=%i/n"),?errno),?-1);??
  • ????????//?Proactor的事件循環(huán)開(kāi)始??
  • ????????ACE_Proactor::instance()->proactor_run_event_loop();??
  • ????????ACE_DEBUG((LM_DEBUG,?ACE_TEXT("Network?fin/n")));??
  • ????????return?0;??
  • ????}??
  • }?//?namespace?igame??
  • ?

    最后,對(duì)以上三個(gè)類進(jìn)行聚合,封裝,就成了TTcp類,在此之前,先定義消息類型:

    [cpp] view plain copy
  • /**?
  • *?@name?TCP的ACE_Message_Block類型定義?@see?ACE_Message_Block?
  • *?@{?
  • */??
  • ///?@brief?TCP數(shù)據(jù)接收??
  • #define?TCP_DATA_RECEIVE????????????0x5505??
  • ///?@brief?TCP客戶端連接??
  • #define?TCP_CLIENT_CONNECT??????????0x5506??
  • ///?@brief?TCP客戶端斷線??
  • #define?TCP_CLIENT_DISCONNECT???????0x5507??
  • ///?@brief?TCP數(shù)據(jù)發(fā)送??
  • #define?TCP_DATA_SEND???????????????0x5508??
  • ///?@brief?TCP數(shù)據(jù)發(fā)送成功??
  • #define?TCP_DATA_SEND_SUCCEEDED?????0x5509??
  • ///?@brief?TCP數(shù)據(jù)發(fā)送失敗??
  • #define?TCP_DATA_SEND_FAILED????????0x550A??
  • /**?
  • *?@}?
  • */??
  • ///?默認(rèn)監(jiān)聽(tīng)地址:偶的車牌號(hào)??
  • #define?DEF_LISTENING_PORT??777??
  • 現(xiàn)在看看TTcp的實(shí)現(xiàn):

    唔,太長(zhǎng)了,下一篇吧。

    ?

    ?

    ?

    此乃末技,

    不知何用。

    堆砌字?jǐn)?shù),

    湊成更新。

    走過(guò)路過(guò),

    不要錯(cuò)過(guò)。

    ?請(qǐng)?jiān)徟纪掀?#xff0c;這里奉上拖欠的數(shù)字。

    TTcp的實(shí)現(xiàn)如下:

    ?

    [cpp] view plain copy
  • #include?"Tcp.h"??
  • namespace?igame??
  • {??
  • ????TTcp::TTcp()??
  • ????????:m_TcpNetThd(0)??
  • ????{??
  • ????????ACE_NEW_NORETURN(m_TcpNetThd,?TTcpNetThread());?//?創(chuàng)建TTcpNetThread對(duì)象實(shí)例??
  • ????}??
  • ????TTcp::~TTcp()??
  • ????{??
  • ????????if?(m_TcpNetThd)?//?釋放??
  • ????????????delete?m_TcpNetThd;??
  • ????}??
  • ????void?TTcp::open()??
  • ????{??
  • ????????ACE_TRACE("TTcp::open");??
  • ??????????
  • ????????//?所有TTcpNetThread的事件,交由TTcp來(lái)處理??
  • ????????//?TOnClientValidate除外,該事件需要特定的邏輯,且無(wú)法異步??
  • ????????if?(m_TcpNetThd)??
  • ????????{??
  • ????????????m_TcpNetThd->setOnClientConnect(EVENT(TTcpHandler::TOnClientConnect,?TTcp,?this,?tcpNetThread_OnClientConnect));??
  • ????????????m_TcpNetThd->setOnClientDisconnect(EVENT(TTcpHandler::TOnClientDisconnect,?TTcp,?this,?tcpNetThread_OnClientDisconnect));??
  • ????????????m_TcpNetThd->setOnClientValidate(m_OnClientValidate);??
  • ????????????m_TcpNetThd->setOnDataReceive(EVENT(TTcpHandler::TOnDataReceive,?TTcp,?this,?tcpNetThread_OnDataReceive));??
  • ????????????m_TcpNetThd->setOnDataSendFailed(EVENT(TTcpHandler::TOnDataSendFailed,?TTcp,?this,?tcpNetThread_OnDataSendFailed));??
  • ????????????m_TcpNetThd->setOnDataSendSucceeded(EVENT(TTcpHandler::TOnDataSendSucceeded,?TTcp,?this,?tcpNetThread_OnDataSendSucceeded));??
  • ????????}??
  • ????????if?(activate()?==?-1)??
  • ????????????ACE_DEBUG((LM_ERROR,?ACE_TEXT("Resume?thread?failed")));??
  • ????}??
  • ????void?TTcp::close()??
  • ????{??
  • ????????if?(m_TcpNetThd)??
  • ????????????m_TcpNetThd->close();??
  • ????????ACE_TRACE("TTcp::close");??
  • ????????ACE_Message_Block*?termBlock;?//?結(jié)束信號(hào)??
  • ??????????
  • ????????ACE_NEW_NORETURN(termBlock,?ACE_Message_Block(0,?ACE_Message_Block::MB_HANGUP));??
  • ????????if?(!termBlock)??
  • ????????????ACE_DEBUG((LM_ERROR,?ACE_TEXT("Allocate?failed?%i"),?errno));??
  • ????????else??
  • ????????{??
  • ????????????putq(termBlock);??
  • ????????????wait();??
  • ????????}??
  • ????}??
  • ????int?TTcp::send(ACE_UINT32?ip,?ACE_UINT16?port,?unsigned?int?seq,?const?char*?buf,?unsigned?short?len)??
  • ????{??
  • ????????ACE_Message_Block*?mb?=?0;?//?數(shù)據(jù)包??
  • ????????ACE_NEW_RETURN(mb,?ACE_Message_Block(sizeof(ACE_UINT32)?+?sizeof(ACE_UINT16)?+?sizeof(unsigned?int)?+?sizeof(unsigned?short)?+?len,?TCP_DATA_SEND),?-1);??
  • ??????????
  • ????????//?格式:ip?|?port?|?seq?|?len?|?數(shù)據(jù)...??
  • ????????mb->copy((const?char?*)&ip,?sizeof(ACE_UINT32));??
  • ????????mb->copy((const?char?*)&port,?sizeof(ACE_UINT16));??
  • ????????mb->copy((const?char?*)&seq,?sizeof(unsigned?int));??
  • ????????mb->copy((const?char?*)&len,?sizeof(unsigned?short));??
  • ????????mb->copy(buf,?len);??
  • ????????return?putq(mb);??
  • ????}??
  • ????int?TTcp::svc()??
  • ????{??
  • ????????ACE_TRACE("TTcp::svc");??
  • ????????if?(m_TcpNetThd->open()?==?-1)??
  • ????????????ACE_DEBUG((LM_ERROR,?ACE_TEXT("Failed?to?pen?TTcpNetThread:?%i"),?errno));??
  • ????????ACE_Message_Block*?msg?=?0;??
  • ????????while(true)??
  • ????????{??
  • ????????????if?(getq(msg)?==?-1)??
  • ????????????{??
  • ????????????????ACE_ERROR_RETURN((LM_ERROR,?ACE_TEXT("Failed?to?getq?%i"),?errno),?-1);??
  • ????????????}??
  • ????????????switch(msg->msg_type())??
  • ????????????{??
  • ????????????case?ACE_Message_Block::MB_HANGUP:?//?偶要退出??
  • ????????????????{??
  • ????????????????????ACE_DEBUG((LM_DEBUG,?ACE_TEXT("Quit")));??
  • ????????????????????msg->release();??
  • ????????????????????return?0;??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?TCP_CLIENT_CONNECT:?//?客戶端連接??
  • ????????????????{??
  • ????????????????????int?len?=?msg->length();??
  • ????????????????????int?hLen?=?sizeof(TTcpHandler?*);??
  • ????????????????????if?(msg->length()?!=?TCP_PACK_HEADER_SIZE?+?sizeof(TTcpHandler?*))??
  • ????????????????????????ACE_ERROR_RETURN((LM_ERROR,?ACE_TEXT("Tcp?connection?message?block?invalid!")),?-1);??
  • ????????????????????char*?ptr?=?msg->rd_ptr();??
  • ????????????????????ACE_UINT32?ip?=?*(ACE_UINT32?*)ptr;?ptr?+=?sizeof(ACE_UINT32);??
  • ????????????????????ACE_UINT16?port?=?*(ACE_UINT16?*)ptr;?ptr?+=?sizeof(ACE_UINT16);??
  • ????????????????????TTcpHandler*?handler?=?(TTcpHandler?*)(*(int?*)ptr);??
  • ????????????????????{??
  • ????????????????????????ACE_Guard<ACE_Recursive_Thread_Mutex>?lock(m_Lock);??
  • ????????????????????????m_AddrMap.insert(make_pair<unsigned?__int64,?TTcpHandler?*>((unsigned?__int64)ip?<<?32?|?port,?handler));???
  • ????????????????????}?????????????????
  • ??????????????????????
  • ????????????????????m_OnClientConnect(ip,?port,?handler);??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?TCP_CLIENT_DISCONNECT:?//?客戶端斷開(kāi)連接??
  • ????????????????{??
  • ????????????????????if?(msg->length()?!=?sizeof(ACE_UINT32)?+?sizeof(ACE_UINT16))??
  • ????????????????????????ACE_ERROR_RETURN((LM_ERROR,?ACE_TEXT("Invalid?tcp?disconnect?message?block/n")),?-1);??
  • ????????????????????char*?ptr?=?msg->rd_ptr();??
  • ????????????????????ACE_UINT32?ip?=?*(ACE_UINT32?*)ptr;?ptr?+=?sizeof(ACE_UINT32);??
  • ????????????????????ACE_UINT16?port?=?*(ACE_UINT16?*)ptr;??
  • ????????????????????{??
  • ????????????????????????ACE_Guard<ACE_Recursive_Thread_Mutex>?lock(m_Lock);??
  • ????????????????????????m_AddrMap.erase((unsigned?__int64)ip?<<?32?|?port);??
  • ????????????????????}??
  • ????????????????????m_OnClientDisconnect(ip,?port);??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?TCP_DATA_RECEIVE:??
  • ????????????????{??
  • ????????????????????char*?ptr?=?msg->rd_ptr();??
  • ????????????????????ACE_UINT32?ip?=?*(ACE_UINT32?*)ptr;?ptr?+=?sizeof(ACE_UINT32);??
  • ????????????????????ACE_UINT16?port?=?*(ACE_UINT16?*)ptr;?ptr?+=?sizeof(ACE_UINT16);??
  • ????????????????????TTcpPackHeader*?header?=?(TTcpPackHeader?*)ptr;?ptr?+=?TCP_PACK_HEADER_SIZE;??
  • ????????????????????const?char*?data?=?ptr;??
  • ????????????????????m_OnDataReceive(ip,?port,?header->seq,?data,?header->len);??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?TCP_DATA_SEND:??
  • ????????????????{??
  • ????????????????????if?(msg->length()?>?sizeof(TTcpPackHeader))??
  • ????????????????????{??
  • ????????????????????????char*?ptr?=?msg->rd_ptr();??
  • ????????????????????????ACE_UINT32?ip?=?*(ACE_UINT32?*)ptr;?ptr?+=?sizeof(ACE_UINT32);??
  • ????????????????????????ACE_UINT16?port?=?*(ACE_UINT16?*)ptr;?ptr?+=?sizeof(ACE_UINT16);??
  • ????????????????????????unsigned?int?seq?=?*(unsigned?int?*)ptr;?ptr?+=?sizeof(unsigned?int);??
  • ????????????????????????unsigned?short?len?=?*(unsigned?short?*)ptr;?ptr?+=?sizeof(unsigned?short);??
  • ????????????????????????const?char*?data?=?ptr;??
  • ??????????????????????????
  • ????????????????????????{??
  • ????????????????????????????ACE_Guard<ACE_Recursive_Thread_Mutex>?_lock(m_Lock);??
  • ????????????????????????????hash_map<unsigned?__int64,?TTcpHandler?*>::iterator?it?=?m_AddrMap.find((unsigned?__int64)ip?<<?32?|?port);??
  • ????????????????????????????if?(it?!=?m_AddrMap.end())??
  • ????????????????????????????{??
  • ????????????????????????????????(*it).second->send(seq,?data,?len);??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?TCP_DATA_SEND_SUCCEEDED:??
  • ????????????????{??
  • ????????????????????char*?ptr?=?msg->rd_ptr();??
  • ????????????????????ACE_UINT32?ip?=?*(ACE_UINT32?*)ptr;?ptr?+=?sizeof(ACE_UINT32);??
  • ????????????????????ACE_UINT16?port?=?*(ACE_UINT16?*)ptr;?ptr?+=?sizeof(ACE_UINT16);??
  • ????????????????????TTcpPackHeader*?header?=?(TTcpPackHeader?*)ptr;?ptr?+=?TCP_PACK_HEADER_SIZE;??
  • ????????????????????const?char*?data?=?ptr;??
  • ????????????????????m_OnDataSendSucceeded(ip,?port,?header->seq,?data,?header->len);??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?TCP_DATA_SEND_FAILED:??
  • ????????????????{??
  • ????????????????????char*?ptr?=?msg->rd_ptr();??
  • ????????????????????ACE_UINT32?ip?=?*(ACE_UINT32?*)ptr;?ptr?+=?sizeof(ACE_UINT32);??
  • ????????????????????ACE_UINT16?port?=?*(ACE_UINT16?*)ptr;?ptr?+=?sizeof(ACE_UINT16);??
  • ????????????????????TTcpPackHeader*?header?=?(TTcpPackHeader?*)ptr;?ptr?+=?TCP_PACK_HEADER_SIZE;??
  • ????????????????????const?char*?data?=?ptr;??
  • ????????????????????m_OnDataSendFailed(ip,?port,?header->seq,?data,?header->len);??
  • ????????????????}??
  • ????????????????break;??
  • ????????????default:??
  • ????????????????{??
  • ????????????????????ACE_DEBUG((LM_ERROR,?ACE_TEXT("Unknown?ACE_Message_Block?type?%i/n"),?msg->msg_type()));??
  • ????????????????}??
  • ????????????????break;??
  • ????????????}?//?switch??
  • ????????????msg->release();??
  • ????????}?//?while?true??
  • ????????return?0;??
  • ????}??
  • ????void?TTcp::tcpNetThread_OnClientConnect(ACE_UINT32?ip,?ACE_UINT16?port,?TTcpHandler*?handler)??
  • ????{??
  • ????????ACE_Message_Block*?mb?=?0;??
  • ????????ACE_NEW_NORETURN(mb,?ACE_Message_Block(sizeof(ACE_UINT32)?+?sizeof(ACE_UINT16)?+?sizeof(TTcpHandler?*),?TCP_CLIENT_CONNECT));??
  • ????????if?(mb)??
  • ????????{??
  • ????????????mb->copy((const?char?*)&ip,?sizeof(ACE_UINT32));??
  • ????????????mb->copy((const?char?*)&port,?sizeof(ACE_UINT16));??
  • ????????????mb->copy((const?char?*)&handler,?sizeof(TTcpHandler?*));??
  • ????????????this->putq(mb);??
  • ????????}??
  • ????}??
  • ????void?TTcp::tcpNetThread_OnClientDisconnect(ACE_UINT32?ip,?ACE_UINT16?port)??
  • ????{??
  • ????????ACE_Message_Block*?mb?=?0;??
  • ????????ACE_NEW_NORETURN(mb,?ACE_Message_Block(sizeof(ACE_UINT32)?+?sizeof(ACE_UINT16),?TCP_CLIENT_DISCONNECT));??
  • ????????if?(mb)??
  • ????????{??
  • ????????????mb->copy((const?char?*)&ip,?sizeof(ACE_UINT32));??
  • ????????????mb->copy((const?char?*)&port,?sizeof(ACE_UINT16));??
  • ??????????????
  • ????????????this->putq(mb);??
  • ????????}??
  • ????}??
  • ??????
  • ????void?TTcp::tcpNetThread_OnDataReceive(ACE_UINT32?ip,?ACE_UINT16?port,?unsigned?int?seq,?const?char*?data,?unsigned?short?size)??
  • ????{??
  • ????????ACE_Message_Block*?mb?=?0;??
  • ????????ACE_NEW_NORETURN(mb,?ACE_Message_Block(sizeof(ACE_UINT32)?+?sizeof(ACE_UINT16)?+?TCP_PACK_HEADER_SIZE?+?size,?TCP_DATA_RECEIVE));??
  • ????????if?(mb)??
  • ????????{??
  • ????????????mb->copy((const?char?*)&ip,?sizeof(ACE_UINT32));??
  • ????????????mb->copy((const?char?*)&port,?sizeof(ACE_UINT16));??
  • ????????????mb->copy((const?char?*)&seq,?sizeof(unsigned?int));??
  • ????????????mb->copy((const?char?*)&size,?sizeof(unsigned?short));??
  • ????????????mb->copy(data,?size);??
  • ??????????????
  • ????????????this->putq(mb);??
  • ????????}??
  • ????}??
  • ????void?TTcp::tcpNetThread_OnDataSendSucceeded(ACE_UINT32?ip,?ACE_UINT16?port,?unsigned?int?seq,?const?char*?data,?unsigned?short?size)??
  • ????{??
  • ????????ACE_Message_Block*?mb?=?0;??
  • ????????ACE_NEW_NORETURN(mb,?ACE_Message_Block(sizeof(ACE_UINT32)?+?sizeof(ACE_UINT16)?+?TCP_PACK_HEADER_SIZE?+?size,?TCP_DATA_SEND_SUCCEEDED));??
  • ????????if?(mb)??
  • ????????{??
  • ????????????mb->copy((const?char?*)&ip,?sizeof(ACE_UINT32));??
  • ????????????mb->copy((const?char?*)&port,?sizeof(ACE_UINT16));??
  • ????????????mb->copy((const?char?*)&seq,?sizeof(unsigned?int));??
  • ????????????mb->copy((const?char?*)&size,?sizeof(unsigned?short));??
  • ????????????mb->copy(data,?size);??
  • ??????????????
  • ????????????this->putq(mb);??
  • ????????}??
  • ????}??
  • ????void?TTcp::tcpNetThread_OnDataSendFailed(ACE_UINT32?ip,?ACE_UINT16?port,?unsigned?int?seq,?const?char*?data,?unsigned?short?size)??
  • ????{??
  • ????????ACE_Message_Block*?mb?=?0;??
  • ????????ACE_NEW_NORETURN(mb,?ACE_Message_Block(sizeof(ACE_UINT32)?+?sizeof(ACE_UINT16)?+?TCP_PACK_HEADER_SIZE?+?size,?TCP_DATA_SEND_FAILED));??
  • ????????if?(mb)??
  • ????????{??
  • ????????????mb->copy((const?char?*)&ip,?sizeof(ACE_UINT32));??
  • ????????????mb->copy((const?char?*)&port,?sizeof(ACE_UINT16));??
  • ????????????mb->copy((const?char?*)&seq,?sizeof(unsigned?int));??
  • ????????????mb->copy((const?char?*)&size,?sizeof(unsigned?short));??
  • ????????????mb->copy(data,?size);??
  • ??????????????
  • ????????????this->putq(mb);??
  • ????????}??
  • ????}??
  • }?//?namespace?igame??
  • ?

    在完整的工程中,還有測(cè)試代碼,這里就不列出了。本來(lái)已經(jīng)在下載頻道中上傳了,并設(shè)置下載點(diǎn)數(shù)為0,結(jié)果傳完后楞是自私都找不到?!NNDCSDN!!


    這是下載資源。

    ?

    來(lái)信到igame2000@hotmail.com

    ?

    需要完整代碼的請(qǐng)來(lái)信索取吧,必復(fù)。

    ?

    ?

    此乃末技。。。。

    ?


    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的ACE_Proactor网络通信示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    bbbb操bbbb| 国产日本三级 | 天天草天天 | 日本精品一区二区三区在线观看 | 中文字幕视频 | 日日干av | 狠狠色伊人亚洲综合网站色 | 国产精品福利视频 | 久青草视频在线观看 | 亚洲国产精品va在线看黑人 | 国产一级免费观看视频 | 操处女逼 | 在线一区av | 精品久久久久久久 | 天天操偷偷干 | 日韩在线一级 | 久草免费在线观看 | 波多野结衣在线观看一区二区三区 | 日韩精品一区二区在线观看视频 | 在线三级av | 久久人人爽人人爽人人片av软件 | 久草在线手机观看 | 欧美a级片网站 | 中文字幕电影网 | 天天天天色射综合 | 久久精品香蕉 | 9热精品| 国产无遮挡又黄又爽馒头漫画 | 国产精品99在线播放 | 国产精品美女www爽爽爽视频 | 在线日韩一区 | 黄色在线视频网址 | 亚洲国产精品成人女人久久 | 狠狠躁夜夜躁人人爽超碰91 | 久久av免费观看 | 国产精品久久久久久久久久久免费 | 99色在线 | 国产一二三精品 | 亚洲精品一区中文字幕乱码 | a精品视频| 日韩欧美视频一区二区 | av蜜桃在线 | 美女精品网站 | 久久婷婷一区二区三区 | 国产美女网站在线观看 | 久久专区 | 青春草免费视频 | 亚洲成人动漫在线观看 | 亚洲国产精品电影在线观看 | 国产一级片一区二区三区 | 亚洲综合精品视频 | 91视频下载 | 婷婷丁香五 | 99久久精品免费看国产四区 | 亚洲一区二区视频在线播放 | 日韩乱色精品一区二区 | 五月天综合色激情 | 国产精品av在线免费观看 | 99草视频在线观看 | 在线观看视频三级 | 一级一片免费看 | 日本 在线 视频 中文 有码 | 色综合激情网 | 91久久偷偷做嫩草影院 | 在线观看免费一级片 | 久久久电影 | 成人av影视在线 | 99精品在线播放 | 久久久午夜电影 | 欧美日韩18| av一区二区三区在线 | 日本久久免费视频 | 久久论理 | www.伊人网 | 国产综合精品一区二区三区 | 99av国产精品欲麻豆 | 亚洲自拍自偷 | 国产高清一 | 99精品国产福利在线观看免费 | 日韩 在线观看 | 亚洲第一av在线播放 | 国产成人免费av电影 | 国产手机视频精品 | 欧美韩国在线 | 色999视频 | 免费在线观看的av网站 | 国产 一区二区三区 在线 | 99久久久久免费精品国产 | 久久免费播放 | 黄色免费看片网站 | 午夜私人影院久久久久 | 亚洲91中文字幕无线码三区 | 欧美激情精品久久久久久免费印度 | 久久黄色小说视频 | 久久在线免费 | 97色狠狠| a精品视频| 制服丝袜天堂 | 国产无限资源在线观看 | 欧美日韩精品电影 | 日本精品久久久久久 | 免费视频区 | 亚洲国产三级在线 | 亚洲精品tv久久久久久久久久 | 久久久久蜜桃 | 久久精品久久综合 | 国产人成看黄久久久久久久久 | 免费欧美高清视频 | 69国产精品成人在线播放 | 午夜精品久久久久久 | www黄免费 | 五月天电影免费在线观看一区 | 亚洲综合视频网 | 精品久久久久久久久久久久久久久久 | 国产系列在线观看 | 91九色蝌蚪国产 | 在线亚洲人成电影网站色www | 欧美精品一区二区在线播放 | 麻豆传媒视频在线 | 91九色国产在线 | 成人毛片网| 日韩电影精品 | 国产精品毛片久久蜜 | 国产999视频 | 欧美日本在线观看视频 | 日韩国产精品久久 | 成人在线观看网址 | 99麻豆视频| 日韩欧美一区二区在线观看 | 国产aa精品 | 精品福利在线 | 久久免费视频在线 | 永久免费的啪啪网站免费观看浪潮 | 亚洲情影院| 国产亚洲视频在线观看 | 激情综合网五月婷婷 | 久久视频在线免费观看 | 国产精品麻豆一区二区三区 | 国产高清久久久 | 国产精品日韩久久久久 | 成人av网址大全 | 日本h在线播放 | 国产精品免费久久久久影院仙踪林 | 婷婷综合影院 | 激情视频在线观看网址 | 日本久久成人 | 91成人在线看 | 午夜电影中文字幕 | 国产精品久久在线观看 | 免费黄色激情视频 | 精品一区二区综合 | 亚洲日本在线视频观看 | 在线91色| 精品国产乱子伦一区二区 | 国内免费久久久久久久久久久 | 99精品视频在线观看 | 欧美韩日在线 | 国产成人在线精品 | 免费在线观看一区 | 亚洲综合色视频 | 久久国产免| 黄色精品国产 | 日韩高清片 | 五月婷婷伊人网 | 日本性久久 | 国产一区二区免费看 | 狠狠狠色丁香综合久久天下网 | 在线午夜 | 亚洲视频免费在线观看 | 夜夜操夜夜干 | 日本中文字幕系列 | 国产一级淫片在线观看 | 在线观看的黄色 | 中文字幕在线观看你懂的 | 日韩色高清 | 国产特级毛片aaaaaa | 亚洲成av人片在线观看香蕉 | 中文字幕丝袜 | 天天操天天干天天综合网 | 综合色婷婷 | v片在线看 | 91国内在线 | 久久精品久久久精品美女 | 国产剧在线观看片 | 欧美另类美少妇69xxxx | 一区二区三区中文字幕在线 | 国产在线精品一区二区不卡了 | 精品国产一区二区三区久久久久久 | 中文视频一区二区 | 黄色www| 日韩网| 国产精品视频内 | 日韩欧美在线视频一区二区 | 天天色天天综合 | 国产无套一区二区三区久久 | 欧洲色吧| 99日精品 | 色婷婷综合久久久 | 日韩国产精品一区 | 国产又粗又硬又爽视频 | 亚洲一级片免费观看 | 国产精品免费视频观看 | 91精品入口 | 国产精品国内免费一区二区三区 | 三级av网| 久久久久久毛片 | 国产成人三级三级三级97 | 伊人永久在线 | 欧美日韩午夜在线 | 99热官网| 国产视频在线一区二区 | 中文字幕人成人 | 欧亚久久| 国产精品免费在线观看视频 | 色香com. | 超碰999| 国产精品久久久av | 中文字幕在线观看第三页 | 91在线精品一区二区 | 亚洲日本一区二区在线 | 一区二区视频播放 | 国产精品一区二区久久久久 | 国产99一区二区 | 91麻豆免费版 | 在线观看视频日韩 | 国产99久久 | 国产视频一二区 | 亚洲国产精品小视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 毛片播放网站 | 在线免费色视频 | 免费在线观看av | 色97在线 | 亚洲 欧洲 国产 日本 综合 | 日韩中午字幕 | 久久影院精品 | 国产小视频91 | 日韩在线视频一区二区三区 | 国产91小视频 | 亚洲成a人片在线www | 日韩影视大全 | 国产小视频在线免费观看视频 | 天天操天天爱天天干 | 玖玖玖在线 | 99久久久国产精品免费观看 | 999久久久久久久久6666 | 91成人免费视频 | 免费成人av网站 | 欧美在线视频第一页 | 一区二区三区中文字幕在线观看 | 久久综合丁香 | 欧美日产在线观看 | 亚洲精品美女久久久 | 综合久久久久久久久 | 超碰在线最新网址 | 欧美日韩亚洲在线观看 | 奇米影视在线99精品 | 亚洲影音先锋 | 成人av电影免费 | 在线观看国产麻豆 | 激情综合啪啪 | 国产精品嫩草影院123 | 国产精品中文字幕av | 国产精品欧美久久久久无广告 | 夜夜操狠狠操 | 日韩在线第一 | 亚洲免费在线视频 | 亚洲,国产成人av | 亚洲无毛专区 | 99热这里只有精品国产首页 | 在线观看中文av | 中文字幕成人在线观看 | 国产一级视频免费看 | 综合在线色 | 免费看一及片 | 日日夜夜精品网站 | 久久高清 | 亚洲全部视频 | 天天射网 | 在线免费色视频 | 国产精品毛片完整版 | 成人在线黄色 | 91欧美在线| 97超碰国产精品女人人人爽 | 91在线视频导航 | 久久a级片 | 欧美激情在线看 | 在线免费黄色毛片 | 国产一区二区电影在线观看 | 国产精品九九久久99视频 | 国产福利一区二区在线 | 99成人在线视频 | 国产精品免费在线播放 | www在线观看视频 | 亚洲欧洲精品久久 | 日本一区二区三区免费观看 | 久久精品视频免费播放 | 精品久久一区 | 一级a毛片高清视频 | 久久婷婷国产色一区二区三区 | 色综合久久精品 | 干干操操| 国产黄在线播放 | 日韩另类在线 | 午夜av日韩 | 久久精品视频网 | 色综合久久88色综合天天 | 国产亚洲精品久久 | 人人草天天草 | 日韩一级电影在线观看 | 精品福利视频在线观看 | 欧美日韩二区三区 | 久久精品久久久精品美女 | 亚洲综合激情 | 国产福利91精品一区二区三区 | 91久久久久久久一区二区 | 91精品国| 天天草网站 | 国产一二三精品 | 久久夜视频 | 97超碰影视 | 国产婷婷 | 国产精品久久久久久婷婷天堂 | avcom在线 | 成人视屏免费看 | 国内亚洲精品 | 日韩色在线 | 日韩精品资源 | 国产探花视频在线播放 | 亚洲午夜久久久久 | 天天爽人人爽 | 国产精品1区2区在线观看 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 又黄又爽又色无遮挡免费 | 日韩精品免费一区 | 亚洲免费一级电影 | 久久久久久久久艹 | 黄色网中文字幕 | 91人人揉日日捏人人看 | 国产中文字幕视频在线观看 | 亚洲精品视频中文字幕 | 久久精品视频在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 久草视频中文 | 色婷婷播放 | 午夜视频一区二区 | 亚洲精品乱码久久久久久蜜桃欧美 | 激情综合亚洲精品 | 国产精品美女久久久久aⅴ 干干夜夜 | 在线不卡a | 精品国产久| av中文字幕在线播放 | 国产精品男女视频 | 免费黄色一区 | 日本精品二区 | 999视频在线播放 | 欧美极品少妇xbxb性爽爽视频 | av免费成人 | 国内久久久| 国产成人一区三区 | 日本中文字幕在线看 | 天天玩天天干天天操 | 天天射日| 精品在线视频一区二区三区 | 日韩免费在线播放 | 成人黄色小说视频 | 欧美精品久久久久久久亚洲调教 | 午夜男人影院 | 久久久久久久免费观看 | 欧美精品做受xxx性少妇 | 欧美日韩国产一区二区三区 | 一区二区三区日韩视频在线观看 | 久久人人爽人人片 | 欧美国产在线看 | 亚洲国产色一区 | 欧美最新大片在线看 | 国产高清无线码2021 | 中文字幕乱码在线播放 | 国产亚洲视频中文字幕视频 | 精品电影一区 | 黄色网在线免费观看 | 久久在视频 | 久久香蕉国产精品麻豆粉嫩av | 国产精品一区二区三区在线播放 | 成人在线免费观看视视频 | 中文字幕电影一区 | 国产精品国产三级国产不产一地 | 久久精品99国产国产 | 国产免费叼嘿网站免费 | 狠狠干夜夜操天天爽 | 国产高清免费观看 | 一级精品视频在线观看宜春院 | 中文av资源站 | 日本色小说视频 | 日日精品 | 91麻豆看国产在线紧急地址 | 999久久国精品免费观看网站 | 天天干天天拍 | 97超碰人人在线 | 国产精品区免费视频 | 精品一区二区影视 | 国产精品欧美精品 | 97在线免费观看 | 一区二区 不卡 | 天天插狠狠插 | 五月天国产精品 | 国产精品久久久久久吹潮天美传媒 | 色视频在线 | 国产老妇av | 日韩精品一区二区三区水蜜桃 | 亚洲少妇自拍 | 97碰在线视频 | 久久不卡免费视频 | 国产在线观看高清视频 | 国产日韩欧美在线影视 | 在线观看精品黄av片免费 | 亚洲一区美女视频在线观看免费 | 欧美日韩国产精品久久 | 久久免费视频这里只有精品 | 欧美日韩视频在线观看免费 | 一区二区三区 亚洲 | 国产黄色片在线免费观看 | 久久久久久久久久久精 | 婷婷激情站 | 亚洲一区二区麻豆 | 午夜电影中文字幕 | 国产精品国产三级国产专区53 | 天躁狠狠躁 | 中文字幕乱码在线播放 | 成人免费毛片aaaaaa片 | 欧美日韩一区二区三区免费视频 | av网站免费看 | 日韩精品免费在线观看 | 日本中文字幕影院 | 91视频91自拍 | 国际精品久久 | 九月婷婷人人澡人人添人人爽 | 免费看的av片 | 麻豆传媒视频观看 | 97人人澡人人添人人爽超碰 | jizz18欧美18| 久草视频在线观 | 激情开心网站 | 黄色app网站在线观看 | 999精品在线 | 在线91播放 | 91亚洲精品久久久中文字幕 | 国产亚洲精品综合一区91 | 中文字幕一区av | 日日插日日干 | 日韩电影中文字幕 | 在线视频a | av中文字幕在线免费观看 | 香蕉久草 | 黄色软件在线看 | 99久久精品无码一区二区毛片 | 日韩高清免费在线观看 | 亚洲精品欧美专区 | 国产91在线 | 美洲 | 国产精品人成电影在线观看 | 日躁夜躁狠狠躁2001 | 区一区二区三在线观看 | 成人精品一区二区三区中文字幕 | 99精品在线免费视频 | av先锋中文字幕 | 久久99久久精品国产 | 99国产在线观看 | 摸阴视频 | 欧美 日韩 国产 成人 在线 | japanese黑人亚洲人4k | 国产精品九九热 | 欧美日韩精品在线播放 | 香蕉视频网址 | 国产a国产a国产a | 久久综合九色综合久久久精品综合 | 欧美日韩视频一区二区三区 | 日本中出在线观看 | 99精品国自产在线 | 黄色毛片在线看 | www.国产精品 | 五月天网页 | 日韩精品一区二区在线观看 | 五月婷婷一区二区三区 | 91精品国产欧美一区二区成人 | 黄色福利| 日韩一级片网址 | 手机av网站 | 国产a级片免费观看 | 中文字幕在线视频精品 | 人人插人人玩 | 又长又大又黑又粗欧美 | 一区三区在线欧 | 亚洲乱码在线 | 亚洲国产精品一区二区久久hs | 成人aⅴ视频 | 欧美极度另类性三渗透 | 日本三级全黄少妇三2023 | 丁香六月伊人 | 国产成人免费 | 国产99久久久国产精品 | av免费观看高清 | 视频一区二区国产 | 中日韩欧美精彩视频 | 欧美日本国产在线观看 | 国产成人精品一区二区在线 | 日韩a在线观看 | 亚洲永久精品在线 | 亚洲精品综合欧美二区变态 | 99视频在线免费播放 | 国产一级二级三级视频 | 超碰97中文| 久久免费成人精品视频 | 在线观看视频你懂的 | 免费国产ww | 免费国产亚洲视频 | 97人人添人澡人人爽超碰动图 | 国产一区成人在线 | 中文电影网 | 激情图片区 | 国产黄色片免费在线观看 | 久久久久久久久爱 | 国产女人免费看a级丨片 | 天天爱天天操 | 亚洲天堂网站 | 国产尤物在线视频 | 久久国产香蕉视频 | 中文字幕在线免费看 | 欧美大香线蕉线伊人久久 | 久久激情视频免费观看 | 欧美日韩久久久 | wwwwwww色| 精品成人a区在线观看 | 黄色免费看片网站 | 在线观看中文字幕2021 | 午夜视频黄 | 中文字幕专区高清在线观看 | 亚洲香蕉在线观看 | www.色在线| 99免费看片 | 欧美日韩另类视频 | 中文字幕在线高清 | www色婷婷com| 久久精品免视看 | 久久成人精品视频 | 中文字幕在线视频免费播放 | 91免费日韩 | 久99久精品| 国产精品毛片久久久久久 | 成年人视频免费在线播放 | 麻豆av一区二区三区在线观看 | 91精品第一页 | 在线观看视频亚洲 | 久久久免费网站 | 国产精品欧美一区二区三区不卡 | 国产精品美女视频 | 黄色大全在线观看 | 免费色视频网址 | 91视频免费网站 | 亚洲国产日韩精品 | 黄a在线| 久草精品视频 | 日本久久久久久科技有限公司 | 久久五月婷婷丁香社区 | 黄色成人小视频 | 91.dizhi永久地址最新 | 国产一区二区高清不卡 | 在线观看电影av | 成人免费观看视频网站 | 在线观看免费色 | 久久久资源 | 久久99精品久久久久久久久久久久 | 波多野结衣一区二区三区中文字幕 | 九九99 | 久久久久国产精品一区二区 | 国产视频手机在线 | 丁香六月在线观看 | 国产精品18久久久 | 天天骚夜夜操 | 三级黄色片子 | 91免费日韩 | 国产精品久久久久久婷婷天堂 | 少妇bbbb搡bbbb桶| 一区二区视频播放 | 久草综合视频 | 日日夜夜精品免费观看 | 麻豆传媒一区二区 | 天天干,天天射,天天操,天天摸 | 91av蜜桃 | 国产二区视频在线观看 | 国产在线久久久 | 成人日批视频 | 黄色精品网站 | 国产精品免费观看网站 | 日日夜夜中文字幕 | 国产精品综合久久久 | 久久精品久久99 | 日韩欧美综合视频 | 日韩在线免费电影 | 国产三级精品在线 | а中文在线天堂 | av中文字幕电影 | 国产成人777777 | 中文字幕欧美日韩va免费视频 | 日本免费久久高清视频 | 日韩 在线 | 亚洲精品一区中文字幕乱码 | 久草在线视频首页 | 婷婷五天天在线视频 | 婷婷伊人五月天 | 久久久免费av | 日韩av片无码一区二区不卡电影 | 奇米先锋| 国产在线第三页 | 欧美日韩高清 | 中文久久精品 | 一区二区精品在线 | 九色91福利 | 视频二区在线 | 国产探花在线看 | 中文字幕精品一区二区三区电影 | 中文av资源站 | 国产一区在线视频观看 | 免费在线一区二区 | 亚洲一区 影院 | 日韩av资源在线观看 | 视频在线99 | 国产偷国产偷亚洲清高 | 天天综合网久久综合网 | 亚洲国产精品999 | 免费在线观看日韩欧美 | 中文字幕av一区二区三区四区 | 一区二区三区免费在线 | 国产自产高清不卡 | 中文字幕在线观看亚洲 | 欧美一级片播放 | 91av精品| 国产91精品久久久久 | 精品久久一区二区三区 | 色网站在线免费 | av电影免费在线 | 欧美日韩免费网站 | 久久久久久久久久久久久国产精品 | 久久不射电影网 | 日本精品在线 | 久久午夜精品视频 | 美女视频a美女大全免费下载蜜臀 | 天天操天天操天天操 | 免费观看一级成人毛片 | 美女网站在线免费观看 | 亚州激情视频 | 久久久久麻豆v国产 | 午夜av免费看 | 国产精品丝袜久久久久久久不卡 | 97国产情侣爱久久免费观看 | 麻豆91网站| 国产精品成人一区二区三区吃奶 | 国产精品不卡在线观看 | 久久国产精品小视频 | 99久久精品国产一区二区成人 | 亚洲一区美女视频在线观看免费 | 特级西西444www大精品视频免费看 | 韩国一区视频 | 成人av av在线 | 中文字幕在线免费观看视频 | 在线视频一区观看 | 亚洲国产资源 | 91久久偷偷做嫩草影院 | 丁香高清视频在线看看 | 色网av| 国产精品一区二区在线播放 | av日韩在线网站 | 五月天激情综合 | 99久久国产免费,99久久国产免费大片 | 在线观看免费高清视频大全追剧 | 亚洲激情影院 | 超碰免费久久 | 人人干97| 808电影| 九色视频网址 | 亚洲国产中文字幕在线观看 | 五月天综合激情 | 欧美日韩色婷婷 | 狠狠操电影网 | 91网在线看 | 国产伦理久久精品久久久久_ | 99久久久国产精品免费99 | 91最新在线视频 | 日日夜夜天天射 | 另类老妇性bbwbbw高清 | 91丨九色丨蝌蚪丨对白 | 久久久亚洲网站 | 最近免费中文字幕大全高清10 | 91视频 - v11av| 亚洲精品国产精品乱码不99热 | 欧美日韩不卡一区二区三区 | 丝袜+亚洲+另类+欧美+变态 | 五月婷婷综合激情网 | 欧美日韩国产精品一区二区亚洲 | 色综合久久久久 | 欧美日韩xx | 日韩午夜电影院 | 黄色小说网站在线 | 久久久久女教师免费一区 | 久久精彩免费视频 | av在线h| 国偷自产视频一区二区久 | 精品国产视频在线 | 国产精品视频观看 | 伊人影院av | 97色se| 久久9视频 | 中文字幕在线观看一区 | 亚洲另类xxxx | 成人黄色国产 | 综合色天天 | 丁香婷婷综合激情五月色 | 99久久99热这里只有精品 | 国产成人亚洲在线观看 | 天天艹天天操 | 黄色三级免费 | 久久久www成人免费毛片麻豆 | 国产亚洲视频在线免费观看 | 亚洲电影毛片 | 在线看日韩av | 国产精品免费一区二区 | 亚洲九九 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 欧美一区二区在线 | 91亚洲免费 | 欧美日韩亚洲一 | 久久综合久色欧美综合狠狠 | 国产日产欧美在线观看 | 97超碰超碰 | 久久这里只有精品首页 | 黄色av影院 | 99爱这里只有精品 | 欧美极品一区二区三区 | 黄色电影小说 | 国产一级视频在线观看 | 日韩v欧美v日本v亚洲v国产v | 欧美一区二视频在线免费观看 | 99人成在线观看视频 | 国产精品青草综合久久久久99 | 免费观看黄 | 中文字幕观看av | www激情com | 精品一区二区三区香蕉蜜桃 | 欧美视频日韩视频 | 97超碰人| 日韩精品视频免费看 | 国产精品一区二区久久久 | 女人18精品一区二区三区 | 中文字幕123区 | 欧美性生活免费 | 在线观看一区二区精品 | 国产原创av在线 | 一区二区三区电影 | 91porny九色91啦中文 | 成人国产精品免费 | 国产精品久久久久一区 | 免费韩国av| 国产乱码精品一区二区三区介绍 | 久草在线播放视频 | 欧美最爽乱淫视频播放 | 国产91国语对白在线 | 亚洲国产黄色片 | 色a资源在线 | 97超碰在线人人 | 亚洲人av免费网站 | 日韩视频中文字幕在线观看 | 黄色录像av | 91av视频网| 久久黄色成人 | 97在线免费视频观看 | 国产精品一区二区av日韩在线 | 九九视频免费观看视频精品 | 97视频在线 | 精品亚洲男同gayvideo网站 | 精品国产乱子伦一区二区 | 亚洲精品久久久久中文字幕m男 | 天天天操操操 | 国产一区在线看 | 最新婷婷色 | 久久人人射 | 国产不卡在线视频 | 欧美最猛性xxx | 天天久久综合 | 欧美性粗大hdvideo | 国产精品久久久久久久午夜 | 中文字幕第一页av | 久久久久亚洲天堂 | 国产精品一区二区免费 | 国产一区二区三区在线免费观看 | 久久久久久久久综合 | 亚洲精品系列 | 国产精品2018| 久草观看视频 | 日韩毛片在线播放 | 99精品视频网站 | 日韩在线观看第一页 | 正在播放国产精品 | 91在线九色 | 日韩视频免费 | 99av国产精品欲麻豆 | 一级久久精品 | freejavvideo日本免费 | 免费在线成人av电影 | 国产中文字幕国产 | 顶级bbw搡bbbb搡bbbb | 亚洲精品一区二区三区四区高清 | 国产一级二级av | 久久久久综合精品福利啪啪 | 91网址在线观看 | 亚洲精品tv | 日韩动态视频 | 丁香六月婷婷激情 | 二区三区毛片 | a级国产片 | 欧美精品久久久久久久亚洲调教 | 一区二区三区电影在线播 | 奇米影视四色8888 | 7777xxxx| 久久国产精品久久精品国产演员表 | 最近2019中文免费高清视频观看www99 | 国内精品福利视频 | 欧洲精品视频一区二区 | 精品99999| 午夜91在线| 日本一区二区三区免费观看 | 91在线亚洲 | 免费av大全 | 五月天狠狠操 | 午夜精品久久久久久久爽 | 激情五月婷婷综合 | 国产探花在线看 | 色中文字幕在线观看 | 国产视频一区在线 | 国产在线观看高清视频 | 久久国产精品免费观看 | 日韩一级精品 | 久久久久久久久久伊人 | 在线成人小视频 | h动漫中文字幕 | 精品国产一区二区三区四区vr | 欧美网站黄色 | 日韩在线影视 | 久色婷婷 | 日韩成人中文字幕 | 久久久精品 一区二区三区 国产99视频在线观看 | 久久激情五月丁香伊人 | 中文字幕日本电影 | 欧美日韩在线免费观看视频 | 国产精品1区2区在线观看 | 在线观看91 | 黄色91在线观看 | 日韩av影视 | 国产无套视频 | 麻豆精品传媒视频 | 亚洲精品在线观看免费 | 成人一级片视频 | 国产99久久九九精品免费 | 一区二区视频电影在线观看 | 欧美一区二区在线免费观看 | 久草精品免费 | 亚洲精品www久久久久久 | 久久婷五月 | 国产精品video爽爽爽爽 | 天天爽夜夜爽人人爽一区二区 | 九九热在线精品 | 久久99婷婷| 久青草视频在线观看 | 91精品一区国产高清在线gif | 亚洲精品小视频 | 日韩午夜电影院 | 欧美一级片免费在线观看 | 国产精品福利一区 | 天天干,天天干 | 精品福利视频在线观看 | 色偷偷88欧美精品久久久 | 粉嫩一区二区三区粉嫩91 | 亚洲精品影视在线观看 | 毛片一区二区 | 91精品国产99久久久久 | 亚洲激情电影在线 | 久久a免费视频 | 黄色毛片一级片 | 色综合天天狠天天透天天伊人 | 国产中文视频 | 成人午夜影院在线观看 | 国产一级片毛片 | 综合黄色网 | 国产精品久久久久久69 | 日日操日日干 | 久久久夜色 | www.99久久.com| 国产999精品| 在线超碰av| 黄色三级在线观看 | 欧美日韩在线免费观看 | 国内精品久久久久久久久久清纯 | 中文字幕在线视频网站 | 精品国产aⅴ麻豆 | 99精品在线看 | 日韩中文字幕免费 | 丁香六月婷婷开心 | 久久久蜜桃一区二区 | 久久精品视频一 | 亚洲欧洲精品一区 | 日韩在线视频线视频免费网站 | 射射射av| 一级免费看 | 黄色免费在线视频 | 久久艹艹| 外国av网 | 免费看av在线 | 黄污网站在线 | 人人玩人人添人人 | 一区二区亚洲精品 | 午夜精品视频免费在线观看 | 综合激情婷婷 | 五月婷婷六月丁香 | 又爽又黄又无遮挡网站动态图 | 日本久久久久久久久久久 | 久久人人97超碰com | 中文字幕无吗 | 久久亚洲私人国产精品va | 久久视了 | 在线国产一区 | 69av网| 日日夜夜精品免费视频 | 成年人在线看片 | 中文在线中文a | 亚洲国产精品影院 | 91在线视频免费91 | 9在线观看免费 | 婷婷日日 | 天天射天天干天天操 | 国产精品一区二区美女视频免费看 | 国产.精品.日韩.另类.中文.在线.播放 | 婷婷亚洲激情 | 一区二区三区在线免费 | 国产在线看一区 | 午夜精品视频一区 | 国产在线视频导航 | 欧美一区二区三区免费观看 | 亚洲女同ⅹxx女同tv | 日韩黄色一级电影 | 在线成人免费电影 | 国产精品久久久久久久午夜 | 日韩在线播放av | 九九热精品视频在线观看 | 精品 一区 在线 | 超碰在线日本 | 人人干人人搞 | 日韩三区在线 | 欧美精品久久久久久久久老牛影院 | 日韩a在线看 | 高清在线一区 | 国内精品视频在线播放 | 免费黄色网止 | 色激情五月| 天天伊人网 | 狠狠狠色丁香婷婷综合久久五月 | 深爱婷婷网 | 一本之道乱码区 | www色片| 五月天,com| 色综合久久久 | www.天天射| 免费涩涩网站 | 黄色三级在线观看 | 亚洲欧美经典 | 亚洲一级片在线看 | 国产不卡视频在线播放 | 人人狠 | 久久国产热视频 | 亚洲精品一区二区三区四区高清 | 欧美一区二区三区在线 | 国产高清 不卡 | 久久综合色播五月 | 国产精品wwwwww | 久久超级碰视频 | 久久久久国产精品一区 | 国产亚洲精品久久久网站好莱 | 久久久影视 | 97香蕉超级碰碰久久免费软件 | 爱av在线网 | 欧美激情综合五月色丁香 | 久久午夜影视 | 国产一级不卡毛片 | 免费色av | 国产精品一级在线 | 亚洲精品综合久久 | 久久精品9 | 九九影视理伦片 | 狠狠的干狠狠的操 | 亚洲激情p | 高清久久久 |