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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

boost网络库开发

發(fā)布時間:2024/3/26 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 boost网络库开发 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、前言

網(wǎng)絡(luò)庫是從事C++開發(fā)最基礎(chǔ)、最核心、最常用的一個庫,所有的協(xié)議都是建立在一個穩(wěn)定高效的網(wǎng)絡(luò)庫之上的,所以對于c++程序員來說它是必不可少且非常非常重要的一個核心組件,我們可以使用網(wǎng)絡(luò)庫做任何我們想做的事情,比如

  • 用于文件數(shù)據(jù)上傳、下載
  • 所有通信協(xié)議如http、rtp、rtsp等協(xié)議的封裝
  • 服務(wù)器模塊多客戶端監(jiān)聽、連接、通信
  • 客戶端與服務(wù)端通信
  • 局域網(wǎng)廣播搜索
  • 局域網(wǎng)設(shè)備搜索
  • 多播組播

一直不停的在C++、Java、Web以及l(fā)inux系統(tǒng)運維等技術(shù)方面不停的來回切換,突然發(fā)現(xiàn)很久沒有做c++了,最近一直在做java的要多,關(guān)于c++這塊從事有8-9年的開發(fā),這塊相關(guān)的文章總結(jié)的卻比Java要少很多。

  • 一個是c++的技術(shù)難度和門檻要高很多,一直都在不斷積累,可概要的技術(shù)點不多,抽不出時間進行文章化。
  • 一個是Java相關(guān)的技術(shù)容易的多,可寫的內(nèi)容也多,研究一門基本上都有對應(yīng)的doc文檔,所以將文檔在翻譯一遍成網(wǎng)絡(luò)文章就相對容易很多

不管如何,因為工作原因,最近又杠上了C++的音視頻這塊相關(guān)技術(shù),正好抽空將之前所有的c++資料和庫總結(jié)了一下:

不總結(jié)還好,一旦總結(jié),還是很多的,很多實際項目中開發(fā)的庫和組件還沒提取出來,不過對于一個老C++程序員來說,項目中開發(fā)好的穩(wěn)定的庫和資料是彌足珍貴的,要多善于總結(jié)和滾雪球。

在開始講解boost網(wǎng)絡(luò)庫之前,我這里先給大家稍微普及一下windows下的網(wǎng)絡(luò)知識,我是windows下開發(fā)的,關(guān)于socket編程在windows下有多重開發(fā)模型,可以參考一下《winsock網(wǎng)絡(luò)編程》 一書

  • 選擇模型(select)
    選擇模型是網(wǎng)絡(luò)編程中最基礎(chǔ)、最簡單的一種模型,因為其簡單易用性所以備受學生時代的在校生或畢業(yè)生使用,但是它也是性能最差的一種編程模型。選擇模型是針對select而言的,它可以阻塞可以是非阻塞的,所以它包括兩種模式:
    (1)、 阻塞模式
    執(zhí)行I/O操作完成前會一直進行等待,不會將控制權(quán)交給程序
    (2)、 非阻塞模式
    執(zhí)行I/O操作時,WinSock函數(shù)會返回并交出控制權(quán)。因為函數(shù)在沒有運行完成就進行返回,并會不斷地返回 WSAEWOULDBLOCK錯誤,但是它功能很強大。
  • 異步消息選擇
    異步消息模型就是借助windows的消息機制來實現(xiàn)的,熟悉win32應(yīng)用開發(fā)或者mfc應(yīng)用開發(fā)的人員都知道,所有的窗口都有對應(yīng)的消息處理機制,我們只需要創(chuàng)建一個窗口句柄HWND,然后將HWND與對應(yīng)的消息進行綁定即可,它是通過WsaAsyncSelect接口函數(shù)來實現(xiàn)的,它實現(xiàn)的主要思路是:
    (1)、首先我們定義一個消息,告訴系統(tǒng)當有客戶端消息到達的時候,發(fā)送該消息通知我們
    (2)、然后在消息處理函數(shù)里面添加對消息的處理即可
  • 事件模型
    除此之外,winsock還提供了一個異步I/O模型-事件模型–WsaEventSelect ,和WSAAsyncSelect模型類似的是,它也允許應(yīng)用程序在一個或多個套接字上,接收以事件為基礎(chǔ)的網(wǎng)絡(luò)事件通知。該模型最主要的差別在于網(wǎng)絡(luò)事件會投遞至一個事件對象句柄,而非投遞至一個窗口例程。

事件選擇模型不用主動去輪詢所有客戶端套接字是否有數(shù)據(jù)到來的模型,它也是在客戶端有數(shù)據(jù)到來時,系統(tǒng)發(fā)送通知給我們的程序,但是,它不是發(fā)送消息,而是通過事件的方式來通知我們的程序,這就解決了WsaAsyncSelect模型只能用在Win32窗口程序的問題。

  • 重疊I/O模型
    重疊模型是讓應(yīng)用程序使用重疊數(shù)據(jù)結(jié)構(gòu)(WSAOVERLAPPED),一次投遞一個或多個 WinSock I/O請求。針對這些請求,在它們完成后,應(yīng)用程序會受到通知,于是就可以通過另外的代碼來處理這些數(shù)據(jù)了。有兩種方法可以用來管理重疊I/O請求完成的情況 – 即接到重疊操作完成的通知時處理
    (1) 事件對象通知 (Event Object Notification)
    基于事件通知的方法,就是要將WinSock事件對象與WSAOVERLPPED結(jié)構(gòu)關(guān)聯(lián)在一起,在使用重疊結(jié)構(gòu)的情況下,我們常用的 send,sendto,recv,recvfrom 也要被WSASend,WSASendto,WSARecv,WSARecvfrom 替換掉了。
    (2) 完成例程(Completion Routies)
    完成例程來實現(xiàn)重疊I/O比用事件通知簡單得多,在這個模型中,主線程只用不停的接受連接即可
WSARecv(lpPerIOData->sClient,&lpPerIOData->Buffer,1,&lpPerIOData->NumberOfByteRecvd,&lpPerIOData->Flags,&lpPerIOData->overlap,CompletionRoutine);
  • 完成端口
    完成端口對象取代了WSAAsyncSelect中的消息驅(qū)動和WSAEventSelect中的事件對象,當然完成端口模型的內(nèi)部機制要比WSAAsyncSelect和WSAEventSelect模型復(fù)雜得多,但是是性能最佳的網(wǎng)絡(luò)編程模型。從本質(zhì)上說,完成端口模型要求我們創(chuàng)建一個Win32完成端口對象,通過指定數(shù)量的線程,對重疊I/O請求進行管理,以便為已經(jīng)完成的重疊I/O請求提供服務(wù)。
    假若一個應(yīng)用程序同時需要管理為數(shù)眾多的套接字,那么采用這種模型,往往可以達到最佳的系統(tǒng)性能!

boost庫的網(wǎng)絡(luò)模型實現(xiàn)在windows上底層是通過iocp完成端口模型實現(xiàn)的,所以是性能最佳的一種網(wǎng)絡(luò)模型實現(xiàn)。

二、實現(xiàn)

boost庫中有一個專門的用于網(wǎng)絡(luò)編程的庫-asio,也就是異步io,它能實現(xiàn)tcp、udp、甚至usb串口數(shù)據(jù)讀取的功能,它是一個非常強大的、跨平臺的異步網(wǎng)絡(luò)通信庫,這就是我為什么選擇它的原因。

在介紹源碼實現(xiàn)的時候,我們先了解一下asio中的幾個常用對象,和socket一樣,它包含如下幾個對象

  • io_service
    它主要作為一個事件驅(qū)動器,在多線程編程里面提供了任務(wù)隊列和任務(wù)分發(fā)功能
  • acceptor
    它和socket一樣,提供了端點連接監(jiān)聽相關(guān)能力
  • endpoint和address
    address封裝了設(shè)備ipv4和ipv6的地址,endpoint標識address和port的組合,決定一臺機器的某個端口(我們稱之為端點)。
  • socket
    套接口編程模型的核心類,提供了同步和異步操作接口集合

說明了以上幾個核心概念之后,我需要通過boost網(wǎng)絡(luò)庫封裝實現(xiàn)如下幾個接口的能力,包括tcp、udp、廣播、數(shù)據(jù)收發(fā)、同步異步等,各個接口以及說明如下:

// --------------------------------------------------------------------------------------- // Function: // Init network SDK // Parameters: // [in]pConnectCallBack : connect or disconnect callback // [in]pDataCallBack : receive data callback // [in]pErrCallBack : error message callback // [in]pContext : callback context // Remark: // This interface must be invoked at the beginning of application, when connect server // success or disconnect server pConnectCallBack callback will be invoked; when data // arrived, pDataCallBack callback will be invoked ; when error occur at the process // of running, pErrCallBack callback will be invoked; // pContext parameter express the scenes of the callback, if the callback invoked by // SDK, pContext will be passed to you by callback last parameter // Return: // if error occur, the result value as the top description will be return by SDK // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_Init();// --------------------------------------------------------------------------------------- // Function: // Clean and release SDK resource // Parameters: // NULL // Remark: // This interface must be invoked at the end of application // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_Cleanup();// tcp server // --------------------------------------------------------------------------------------- // Function: // Start or stop listen local port // Parameters: // [in]nPort : listen port // [out]pHandle : server handle address // [lHandle] : server handle output by NetSdk_Listen // Remark: // This interface is adapted to server, not for client // Example: // PCONNECTCALLBACK // NetSdk_Listen--> PRECVDATACALLBACK -->NetSdk_UnListen // PNETSDKERRCALLBACK // || // \/ // NetSdk_Send // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_Listen(int nPort, PCONNECTCALLBACK pConnectCallBack,PRECVDATACALLBACK pDataCallBack, PNETSDKERRCALLBACK pErrorBack,void* pContext, long* pHandle); NETSDK_API NETSDK_RETURN NetSdk_ListenEx(const char* ipV4OrV6, int nPort, PCONNECTCALLBACK pConnectCallBack,PRECVDATACALLBACK pDataCallBack,PNETSDKERRCALLBACK pErrorBack,void* pContext, long* pHandle); NETSDK_API NETSDK_RETURN NetSdk_UnListen(long lHandle);// tcp client // --------------------------------------------------------------------------------------- // Function: // Connect or disconnect server // Parameters: // [in]pServerIp : server ip address // [in]nPort : server port // [out]pHandle : client handle address // [in]lHandle : client handle // [in]nTimeoutSec : timeout // [in]bindLocalPort : tcp client bind local port // Remark: // This interface is adapted to tcp client, not for server // if set bindLocalPort to none zero, then client bind local port by manual // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_Connect(const char* pServerIp, int nPort, int nTimeoutSec,PCONNECTCALLBACK pConnectCallBack, PRECVDATACALLBACK pDataCallBack, void* pContext, long* pHandle, int bindLocalPort = 0);// tcp client // --------------------------------------------------------------------------------------- // Function: // Send message to server or reply message to client // Parameters: // [in]nClientId : client handle // [in]pBytes : send data address // [in]nLen : send data length // Remark: // This interface is adapted to tcp client, not for server // Example: // NetSdk_Connect-->NetSdk_Send-->NetSdk_DisConnect // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_Send(long nClientId, unsigned char* pBytes, int nLen); // return byte have send, if error occur then return 0 or less than 0 NETSDK_API int NetSdk_SendSync(long nClientId, unsigned char* pBytes, int nLen);// tcp client // --------------------------------------------------------------------------------------- // Function: // Get TCP Client local address and peer address // Parameters: // [in]nClientId : client handle // [in]pBytes : send data address // [in]nLen : send data length // Remark: // This interface is adapted to tcp client // Example: // NetSdk_Connect-->NetSdk_GetConnectAddr // NetSdk_Listen-->PCONNECTCALLBACK-->NetSdk_GetConnectAddr // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_GetConnectAddr(long nClientId, sockaddr_in* pLocalAddr, sockaddr_in* pPeerAddr);// udp client // --------------------------------------------------------------------------------------- // Function: // Bind local port and send udp data to another device // Parameters: // NULL // Remark: // This interface is adapted to udp client, not for server // NetSdk_Broadcast_Sync and NetSdk_SendTo_Sync is synchronized interface // the value returned is indicate the size has send // NetSdk_Broadcast and NetSdk_SendTo is asynchronized interface // Example: // NetSdk_Bind-->NetSdk_Broadcast // or // NetSdk_Bind-->NetSdk_SendTo // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_Bind(const char* pServerIp, int nPort, PRECVDATACALLBACK pDataCallBack, void* pContext,long* pHandle);// --------------------------------------------------------------------------------------- // Function: // Send Udp broadcast message to local network // Parameters: // [in]nClientId : returned by NetSdk_Bind // [in]nPort : which port to all machine // [in]pBytes : the message body // [in]nLen : the message length // Remark: // this interface is used to send broadcast to all // machine in local network // Example: // NetSdk_Bind-->NetSdk_Broadcast // or // NetSdk_Bind-->NetSdk_SendTo // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_Broadcast(long nClientId,int nPort,unsigned char* pBytes, int nLen); // --------------------------------------------------------------------------------------- // Function: // Send Udp message to specific machine // Parameters: // [in]nClientId : returned by NetSdk_Bind // [in]pAddr : the endpoint to received message // [in]pBytes : the message body // [in]nLen : the message length // Remark: // NULL // Example: // NetSdk_Bind-->NetSdk_SendTo // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_SendTo(long nClientId,sockaddr_in* pAddr,unsigned char* pBytes, int nLen);NETSDK_API int NetSdk_Broadcast_Sync(long nClientId,int nPort,unsigned char* pBytes, int nLen); NETSDK_API int NetSdk_SendTo_Sync(long nClientId,sockaddr_in* pAddr,unsigned char* pBytes, int nLen);// tcp or udp client // --------------------------------------------------------------------------------------- // Function: // Close client handle // Parameters: // NULL // Remark: // // Example: // NetSdk_Bind-->NetSdk_CloseHandle // or // NetSdk_Connect-->NetSdk_CloseHandle // Return: // return value returned by SDK As mentioned above // --------------------------------------------------------------------------------------- NETSDK_API NETSDK_RETURN NetSdk_CloseHandle(long lHandle);

實現(xiàn)總的類圖如下所示

各個類的作用如下:

  • CClient
    提供了作為tcp客戶端和udp客戶端的基礎(chǔ)實現(xiàn)類,包括獲取客戶id、獲取地址、端口、日志等接口封裝
  • CUdpClient
    實現(xiàn)了udp本地端口綁定、數(shù)據(jù)同步異步發(fā)送、數(shù)據(jù)接收、廣播等接口
  • CTcpClient
    實現(xiàn)了tcp客戶端連接、斷開、發(fā)送數(shù)據(jù)、處理數(shù)據(jù)等接口
  • CNetWork
    服務(wù)端網(wǎng)絡(luò)的抽象,服務(wù)端可以同時監(jiān)聽多個網(wǎng)卡的多個網(wǎng)口,它包括啟動、停止等接口
  • CTcpServer
    是tcp網(wǎng)絡(luò)的實現(xiàn),服務(wù)端可以同時監(jiān)聽多個tcp端點,實現(xiàn)多端口通信。
  • CNetWorkMgr
    網(wǎng)絡(luò)管理器,管理多個網(wǎng)絡(luò)對象,包括添加網(wǎng)絡(luò)、移除網(wǎng)絡(luò)、清理等接口

客戶端實現(xiàn)

作為一個客戶端,我想要的主要功能是:連接服務(wù)器(tcp)、綁定本機端口(udp接收數(shù)據(jù))、發(fā)送數(shù)據(jù)(同步異步)、接收數(shù)據(jù)等功能。

udp客戶端綁定本機端口:

bool CUdpClient::Bind(udp::endpoint ep) {try{m_bindPort = ep;boost::system::error_code err;if (!m_socket.is_open()){m_socket.open(/*ip::udp::v4()*/ep.protocol(), err);if (err){std::string strErr = (boost::format("open socket error[%d]")%err.value()).str();CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_INISOCK_ERR,(unsigned char*)strErr.c_str() , strErr.length());return false;}}m_socket.set_option(asio::socket_base::reuse_address(true),err);if (err){std::string strErr = (boost::format("reuse address error[%d]")%err.value()).str();CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_INISOCK_ERR,(unsigned char*)strErr.c_str() , strErr.length());return false;} #ifdef _WIN32BOOL bNewBehavior = FALSE;DWORD dwBytesReturned = 0;WSAIoctl(m_socket.native_handle(), SIO_UDP_CONNRESET, &bNewBehavior, sizeof bNewBehavior, NULL, 0, &dwBytesReturned, NULL, NULL); #endifm_socket.bind(ep, err);if (err){std::string strErr = (boost::format("bind socket error[%d]")%err.value()).str();CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_INISOCK_ERR,(unsigned char*)strErr.c_str() , strErr.length());return false;}return true;}catch (std::exception& e){CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_UNKNOWN, (unsigned char*)e.what(), strlen(e.what()));}return false; }

udp數(shù)據(jù)異步發(fā)送

NETSDK_RETURN CUdpClient::AsynSendTo(udp::endpoint ep, unsigned char* pBytes, int nLen) {try{// 獲取空bufferBufferPtr pBuffer = m_write_buffer.GetEmptyBuffer();if (!pBuffer)return NETERR_BUFERR_FULL;// 填充數(shù)據(jù)pBuffer->FillData(pBytes, nLen);pBuffer->m_ep = ep;m_write_buffer.AddFullBuffer(pBuffer);// 數(shù)據(jù)是否發(fā)送完畢boost::mutex::scoped_lock a_lock(m_send_lock);if (m_send_finish){// 獲取當前發(fā)送bufferBufferPtr pBuffer = m_write_buffer.GetFullBuffer();// 無可發(fā)送的bufferif (!pBuffer)return NETERR_UNKNOWN;m_send_finish = false;AsyncSend(pBuffer);}return NETERR_SUCCESS;}catch (std::exception& e){CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_UNKNOWN, (unsigned char*)e.what(), strlen(e.what()));}return NETERR_UNKNOWN; }

tcp客戶端連接

bool CTcpClient::Connect(std::string strIp, int nPort, bool bSync, int nTimeout) {try{tcp::endpoint ep(ip::address::from_string(strIp), nPort);if (bSync){m_bconnected = false;boost::system::error_code err_code;if (m_bindLocalPort != 0) {m_socket.open(/*tcp::v4()*/ep.protocol(), err_code);m_socket.set_option(tcp::acceptor::reuse_address(true), err_code);tcp::endpoint bind_ep(ip::address::from_string("0.0.0.0"), m_bindLocalPort);m_socket.bind(bind_ep, err_code);}// 非阻塞模式連接,方式默認等待20秒 // { // m_socket.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true)); // //err_code = m_socket.connect(ep, err_code); // m_socket.connect(ep, err_code); // // fd_set fdWrite; // FD_ZERO(&fdWrite); // FD_SET(m_socket.native(), &fdWrite); // timeval tv = { nTimeout }; // if (select(0, NULL, &fdWrite, NULL, &tv) <= 0 || !FD_ISSET(m_socket.native(), &fdWrite)) // { // m_bconnected = false; // return m_bconnected; // } // // m_socket.io_control(boost::asio::ip::tcp::socket::non_blocking_io(false)); // m_bconnected = true; // StartKeepAlive(); // }// err_code = m_socket.connect(ep, err_code); // if (!err_code) // { // m_bconnected = true; // StartKeepAlive(); // return true; // } // return m_bconnected;boost::recursive_mutex::scoped_lock guard(m_connect_mutext);m_socket.async_connect(ep, boost::bind(&CTcpClient::ConnectHandler, shared_from_this(), boost::asio::placeholders::error));m_connect_cond.wait_for(guard, boost::chrono::seconds(nTimeout));return m_bconnected;}else{m_socket.async_connect(ep, boost::bind(&CTcpClient::ConnectHandler, shared_from_this(), boost::asio::placeholders::error));return true;}}catch (std::exception& e){CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_UNKNOWN, (unsigned char*)e.what(), strlen(e.what()));}return false; }

tcp數(shù)據(jù)處理

NETSDK_RETURN CTcpClient::AsynWrite(unsigned char* pBytes, int nLen) {try{if(!m_bconnected)return NETERR_SEND_ERR;// 獲取空bufferBufferPtr pBuffer = m_write_buffer.GetEmptyBuffer(nLen);if (!pBuffer)return NETERR_BUFERR_FULL;// 填充數(shù)據(jù)pBuffer->FillData(pBytes, nLen);m_write_buffer.AddFullBuffer(pBuffer);// 數(shù)據(jù)是否發(fā)送完畢boost::mutex::scoped_lock a_lock(m_send_lock);if (m_send_finish){// 獲取當前發(fā)送bufferBufferPtr pNextBuffer = m_write_buffer.GetFullBuffer();// 無可發(fā)送的bufferif (!pNextBuffer)return NETERR_UNKNOWN;m_send_finish = false;AsyncSend(pNextBuffer);}return NETERR_SUCCESS;}catch (std::exception& e){CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_UNKNOWN, (unsigned char*)e.what(), strlen(e.what()));}return NETERR_UNKNOWN; }

稍微注意的是,tcp數(shù)據(jù)發(fā)送的時候,我這里用了一個環(huán)形緩沖區(qū),數(shù)據(jù)發(fā)送首先進入環(huán)形緩沖器,發(fā)送完成后繼續(xù)從環(huán)形緩沖區(qū)中獲取數(shù)據(jù)并發(fā)送出去。

tcp數(shù)據(jù)讀取

void CTcpClient::ReadHandler(const boost::system::error_code err, const size_t nTransferedSize) {sockaddr_in stAddr;try{ stAddr.sin_family = AF_INET;stAddr.sin_addr.s_addr = inet_addr(GetAddr().c_str());stAddr.sin_port = htons(GetPort());if (!err && nTransferedSize > 0){CCallBack::NotifyDataCB(m_eType, GetSId(), GetId(),&stAddr,m_read_buffer->m_pBuffer, nTransferedSize);AsynRead();}else if(err){std::string strErr = (boost::format("read tcp data error[%d]\n")%err.value()).str();CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_RECV_ERR, (unsigned char*)strErr.c_str(), strErr.length());// 其他異常不認為是斷開if (WSAECONNRESET == err.value() || WSAECONNABORTED == err.value() ||WSAENETRESET == err.value() || WSAESHUTDOWN == err.value() || WSAENETDOWN == err.value() || WSAEHOSTDOWN == err.value()||ERROR_SEM_TIMEOUT == err.value() || ERROR_FILE_NOT_FOUND == err.value()){m_bconnected = false;if(CClientMgr::get_mutable_instance().GetTcpClient(GetId())){CClientMgr::get_mutable_instance().PopTcpClient(GetId());CCallBack::NotifyConnectCB(m_eType, GetSId(), GetId(), &stAddr, true);}}else{std::string strErr = (boost::format("ReadHandle error[%d-%s]\n")%err.value()%err.message()).str();WriteLog(strErr);}}else{std::string strErr = (boost::format("ReadHandle error[%d-%s]\n")%err.value()%err.message()).str();WriteLog(strErr);}}catch (std::exception& e){std::string strErr = (boost::format("read tcp[%d] data exception[%s]\n")%GetId()%e.what()).str();CCallBack::NotifyErrCB(m_eType, GetSId(), GetId(), NETERR_RECV_ERR, (unsigned char*)strErr.c_str(), strErr.length());WriteLog(strErr);} }

當有數(shù)據(jù)回調(diào)的時候,我們首先檢查是否有錯誤,如網(wǎng)絡(luò)斷開、對方重置連接、關(guān)閉、超時等,如果沒有錯誤則回調(diào)出去數(shù)據(jù),如果異常則回調(diào)斷開異常!

服務(wù)端實現(xiàn)

服務(wù)端實現(xiàn),最重要的就是支持多個端點的監(jiān)聽,支持多個客戶端的連接,以下一tcp服務(wù)為例進行說明

tcp服務(wù)端連接監(jiān)聽實現(xiàn)

bool CTcpServer::Listen() {try{boost::system::error_code err;if (!m_acceptor.is_open()){m_acceptor.open(m_endPoint.protocol(),err);if (err){Stop();return false;}m_acceptor.set_option(tcp::acceptor::reuse_address(true),err);if (err){Stop();return false;}m_acceptor.bind(m_endPoint,err);if (err){Stop();return false;}m_acceptor.listen(socket_base::max_connections,err);if (err){Stop();return false;}}TcpClientPtr client(new CTcpClient(m_io_server,GetId(),true));client->RegisterConnectCallBack(GetConnectCallBack(), GetConnectCallBackContext());client->RegisterReceiveDataCallBack(GetReceiveDataCallBack(), GetReceiveDataCallBackContext());m_acceptor.async_accept(client->GetSocket(),bind(&CTcpServer::AcceptClient,shared_from_this(),boost::asio::placeholders::error,client));}catch (std::exception){return false;}return true; }

當客戶端連接到服務(wù)端之后,會調(diào)用異步回調(diào)

void CTcpServer::AcceptClient(boost::system::error_code err, TcpClientPtr client) {if (err){return ;}// client connect{sockaddr_in stAddr;std::memset(&stAddr, 0, sizeof(stAddr));stAddr.sin_family = AF_INET;stAddr.sin_addr.s_addr = inet_addr(client->GetAddr().c_str());stAddr.sin_port = ::ntohs(client->GetPort());CCallBack::NotifyConnectCB(client_type_tcp, GetId(), client->GetId(), &stAddr, false);}CClientMgr::get_mutable_instance().PushTcpClient(client->GetId(), client);client->StartKeepAlive();client->AsynRead();Listen(); }

客戶端連接之后將由CClientMgr客戶端管理對象進行管理。

三、測試

核心的代碼我在上面已經(jīng)列舉出來,其他的枝節(jié)大家可以自行補腦或搜索實現(xiàn),下面我們使用tcp-udp測試工具進行測試或使用我寫的自帶測試工具測試,首先來了解一下netsdk網(wǎng)絡(luò)的使用,我的頭文件中有關(guān)于該網(wǎng)絡(luò)的說明:

// ------------------------------------------------------------------------------------------------ // File: // netsdk.h // Usage: // net library for tcp client or udp client or tcp server // Remark: // usage for this library discribed as follow // Author: // lixiangxiang from founder // History: // 2015/10/1 v1.0 // Contact: // lixiang6153@126.com csdn name:lixiang987654321 // Copyright: // lixiang6153@126.com // ------------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------------- // >>>>>>>>>>>>>>>>>>>>>>>usage for this library<<<<<<<<<<<<<<<< // ********************************tcp server************************************************* // NetSdk_Init → PNETSDKERRCALLBACK → NetSdk_Cleanup // ↓ // ↓nClientId (client connected,bExit is false,save client id) // ↓ // PRECVDATACALLBACK(data from client) // ↓ // ↓ // NetSdk_Send (response data toclient) // ↓ // ↓maybe occur // PCONNECTCALLBACK(client disconnect, bExit is true) // // ********************************tcp client************************************************* // NetSdk_Init → NetSdk_Connect → NetSdk_CloseHandle → NetSdk_Cleanup // ↓ // ↓ // PRECVDATACALLBACK(data from server) // ↓ // ↓maybe occur // PCONNECTCALLBACK(server disconnect, bExit is true) // // ********************************udp client************************************************* // NetSdk_Init → NetSdk_Bind NetSdk_CloseHandle→ NetSdk_Cleanup // ↓ // ↓ // NetSdk_SendTo(send data to endpoint) // // ********************************udp broadcast********************************************** // NetSdk_Init → NetSdk_Bind NetSdk_CloseHandle→ NetSdk_Cleanup // ↓ ↓ // ↓ ↓ // (send broadcast to everyone) (receive data from endpoint) // NetSdk_Broadcast PRECVDATACALLBACK // //-------------------------------------------------------------------------------------------------

服務(wù)端netsdk使用流程

我這里稍作說明,如果是作為服務(wù)器端我們的使用方式如下:

NetSdk_Init初始化網(wǎng)絡(luò)庫=>NetSdk_Listen開始監(jiān)聽本機端口=> 接收連接=>處理數(shù)據(jù)=> NetSdk_UnListen停止端口監(jiān)聽=>NetSdk_Cleanup清理網(wǎng)絡(luò)庫資源

我們可以同時監(jiān)聽多個網(wǎng)卡的多個端口,如果需要服務(wù)端反饋數(shù)據(jù)給客戶端,可以通過連接返回的clientId,使用客戶端相關(guān)接口進行回復(fù)和反饋。

客戶端netsdk使用流程

作為客戶端,如果是tcp客戶端,使用接口流程如下:

NetSdk_Init初始化網(wǎng)絡(luò)庫=>NetSdk_Connect連接服務(wù)器=>處理數(shù)據(jù)=>NetSdk_Send發(fā)送數(shù)據(jù)到服務(wù)端=> NetSdk_CloseHandle關(guān)閉與服務(wù)端連接=>NetSdk_Cleanup清理網(wǎng)絡(luò)庫資源

作為tcp客戶端,數(shù)據(jù)發(fā)送也可以支持同步和異步發(fā)送,默認是異步,同步發(fā)送接口NetSdk_SendSync

作為客戶端,如果是udp客戶端,使用接口流程如下:

NetSdk_Init初始化網(wǎng)絡(luò)庫=>NetSdk_Bind綁定本機端口=>處理數(shù)據(jù)=>NetSdk_SendTo發(fā)送數(shù)據(jù)報文到對應(yīng)機器=> NetSdk_CloseHandle關(guān)閉與服務(wù)端連接=>NetSdk_Cleanup清理網(wǎng)絡(luò)庫資源

作為udp客戶端,數(shù)據(jù)發(fā)送也支持同步發(fā)送,同步發(fā)送接口:NetSdk_SendTo_Sync;除此之外udp還支持廣播,廣播接口也支持同步也異步發(fā)送,接口如下:

NetSdk_Broadcast NetSdk_Broadcast_Sync

我的測試工具如下所示:

包括了服務(wù)端和客戶端,可以將該工具放在2臺機器,一臺做服務(wù)端,一臺做客戶端,如果沒有多余機器,可以使用一個工具進行測試既作為服務(wù)端,也作為客戶端,客戶端使用同一個ip和端口。

作為服務(wù)端進行測試

服務(wù)端監(jiān)聽和斷開監(jiān)聽代碼

void CNetsdkDemonDlg::OnBnClickedButtonListen() {UpdateData(TRUE);if (m_listenHandle < 0) {if (NETERR_SUCCESS != NetSdk_Listen(m_local_port, Connect_Callback,Receive_Data_Callback,Error_Callback,this, &m_listenHandle)) {AfxMessageBox("監(jiān)聽本機端口失敗!");return;}GetDlgItem(IDC_BUTTON_LISTEN)->SetWindowText("停止監(jiān)聽");AddLog("服務(wù)端:開始監(jiān)聽本機端口:%d", m_local_port);EnableServerButton(FALSE);}else {CloseServer();GetDlgItem(IDC_BUTTON_LISTEN)->SetWindowText("開始監(jiān)聽");AddLog("服務(wù)端:停止監(jiān)聽本機端口");EnableServerButton(TRUE);} } void CNetsdkDemonDlg::CloseServer() {if (m_listenHandle > 0){NetSdk_UnListen(m_listenHandle);m_listenHandle = -1;} }

如本機默認監(jiān)聽的端口為1234,啟動demon后點擊監(jiān)聽(本地ip使用默認的127.0.0.1監(jiān)聽所有網(wǎng)卡)

監(jiān)聽成功后效果

監(jiān)聽成功后可以使用tcp-dup測試工具測試連接本機的1234端口了

可以看到使用tcp-udp測試工具連接上了我的服務(wù)端,注意我的本機真實地址192.168.50.7,服務(wù)端監(jiān)聽的是所有網(wǎng)卡的1234端口!

然后我們發(fā)送數(shù)據(jù)試試看!

可以看到服務(wù)端收到了客戶端id為3的客戶發(fā)送到服務(wù)端的數(shù)據(jù)!

作為客戶端測試

為了避免干擾,我們使用tcp-udp工具作為服務(wù)端,我的測試工具作為客戶端連接到服務(wù)端(當然客戶端和服務(wù)端完全可以用我的工具)測試如下:

可以看到客戶端連接到了服務(wù)端,下面我們開始發(fā)送數(shù)據(jù):

總結(jié)

我給的demon僅僅調(diào)用了tcp服務(wù)端和tcp客戶端相關(guān)接口,當然還包括udp相關(guān)接口,這里可以自己測試調(diào)用,我想說明的是本網(wǎng)絡(luò)庫是經(jīng)過了大量數(shù)據(jù)測試和多個實戰(zhàn)項目測試的一個穩(wěn)定高效的網(wǎng)絡(luò)庫組件(120路音視頻主碼流同時發(fā)送接收),只要有了網(wǎng)絡(luò)庫組件,你再也不在為項目之間的通信而擔憂,只需關(guān)注業(yè)務(wù)邏輯處理即可。

當然,網(wǎng)絡(luò)庫進行是封裝了tcp和udp等相關(guān)通信,協(xié)議層(私有協(xié)議或http、rtsp等與業(yè)務(wù)相關(guān)的協(xié)議)設(shè)計還是需要你個人去設(shè)計的,這個與項目的具體業(yè)務(wù)息息相關(guān),與底層的通信無關(guān)(不關(guān)心傳輸?shù)氖鞘裁磾?shù)據(jù))。

另外,本網(wǎng)絡(luò)庫是經(jīng)過了大量實戰(zhàn)和不斷更新和修改的穩(wěn)定高效的網(wǎng)絡(luò)庫,花費了較多的心思,所以如果需要本項目的源碼,可以與本人直接溝通購買意向,價格在500-1000不等(自己考量一下應(yīng)該是很值得了,買一個視頻教程都已經(jīng)到這個數(shù)了),該庫是一個boost封裝了跨平臺的庫(linux只需要稍作改動,請自行修改,本人不會幫忙修改),代碼風格絕對是一個c++老手寫的代碼,閱讀性較強,新手上手較快,很容易修改得linux或定制自己接口或添加其他模塊或功能,代碼一瞥:

源碼獲取、合作、技術(shù)交流請獲取如下聯(lián)系方式:

QQ交流群:961179337

微信賬號:lixiang6153
公眾號:IT技術(shù)快餐
電子郵箱:lixx2048@163.com

總結(jié)

以上是生活随笔為你收集整理的boost网络库开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

亚洲国产美女精品久久久久∴ | 国产成人精品综合久久久久99 | 国产精品久久久久久久久久久久 | 亚洲不卡123 | 丁香花在线观看免费完整版视频 | 开心激情五月婷婷 | 国产视频中文字幕在线观看 | 国产精品国产三级国产不产一地 | 亚洲综合视频在线 | 99亚洲视频 | 天天操天天操天天操天天操天天操 | 99在线观看视频 | 久久国产片 | 综合久久影院 | 久久久久久久免费看 | 欧美一区二区三区四区夜夜大片 | 偷拍精品一区二区三区 | 视色网站 | 最近日本韩国中文字幕 | 国产视频网站在线观看 | 久久久精品高清 | 九九日韩| 黄色一级在线观看 | 高清视频一区二区三区 | bbb搡bbb爽爽爽 | 激情影院在线 | 亚洲在线网址 | 亚洲精品在线视频网站 | 国产一区在线看 | 婷婷亚洲最大 | 国产欧美日韩一区 | 久久夜色电影 | 亚洲精品国偷拍自产在线观看 | 久久久五月婷婷 | 又黄又爽又湿又无遮挡的在线视频 | 超碰在线人人爱 | 欧美激情xxxx性bbbb | 探花视频在线观看免费版 | 九九热精品视频在线播放 | 久久久香蕉视频 | 91精品一区国产高清在线gif | 国产精品美女 | 国产精品网址在线观看 | 久久a国产 | 欧美在线一 | 亚洲少妇影院 | 久久这里有 | 91麻豆精品| 久久永久免费视频 | 五月天色丁香 | 国产精品第一页在线观看 | 国产日女人 | www.夜夜爽| 午夜视频在线网站 | 一性一交视频 | 亚洲黑丝少妇 | 天天射天天操天天色 | 欧美在线视频免费 | 午夜少妇一区二区三区 | 日韩在线播放欧美字幕 | 久久线视频 | 亚洲综合欧美日韩狠狠色 | 亚洲一区二区三区四区在线视频 | 日韩在线精品 | 久久视频免费在线观看 | 久久激情久久 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 亚洲精品视频在线免费播放 | 五月网婷婷 | 精品自拍sae8—视频 | 免费下载高清毛片 | 国产在线看一区 | 丰满少妇久久久 | 午夜黄色大片 | 人人看黄色 | 亚洲激情校园春色 | 精品xxx| 在线免费观看一区二区三区 | 欧美另类成人 | 2022久久国产露脸精品国产 | 久久在线免费视频 | 久久人人爽人人爽人人 | 毛片99| 色综合久久久久综合体桃花网 | 亚洲在线网址 | 日韩av看片 | 中文字幕黄色网址 | h动漫中文字幕 | 日韩在线视频一区 | 五月综合色| 久久久久中文字幕 | 国产亚洲激情视频在线 | 日韩欧美高清视频在线观看 | 99久久精品费精品 | 免费网站在线观看成人 | 97精品国产97久久久久久免费 | 国产精品网红福利 | 色婷婷激情五月 | 亚洲在线a| 久久99久久99精品免观看粉嫩 | 国产精品一区二区在线播放 | 亚洲 精品在线视频 | 四虎国产精品永久在线国在线 | 色网av| 在线免费看黄色 | 日本黄色一级电影 | 国产精品一区二区三区在线 | 亚洲视频aaa | 亚洲精品mv在线观看 | 久久国产成人午夜av影院宅 | 黄色免费网站大全 | 992tv又爽又黄的免费视频 | 黄色软件视频网站 | 成人av免费电影 | 超碰97中文 | 久久久99久久 | 国产色拍拍拍拍在线精品 | 91精品在线播放 | 国产一区二区在线观看免费 | 日韩 精品 一区 国产 麻豆 | 欧美成年黄网站色视频 | 日韩乱色精品一区二区 | 国产精品久久久久久久免费 | 久久精品国产精品亚洲精品 | 精品久久91 | 黄视频网站大全 | 区一区二区三区中文字幕 | 在线亚洲高清视频 | 干av在线 | 亚洲男人天堂a | 一本一道久久a久久综合蜜桃 | 国产成人精品免高潮在线观看 | 蜜臀av一区二区 | 亚洲精品乱码久久久久久蜜桃动漫 | 久久久一本精品99久久精品 | 黄色在线免费观看网址 | 欧美另类调教 | 婷婷5月激情5月 | 天天久久综合 | 日韩免费视频观看 | 国产亚洲情侣一区二区无 | 午夜 久久 tv| 怡红院成人在线 | 六月激情网 | 高清在线一区二区 | av大片网址 | 在线视频欧美精品 | 国产精品亚洲片夜色在线 | 日韩免费观看一区二区 | 久久免费资源 | 国语自产偷拍精品视频偷 | 99精品热视频 | 婷婷深爱五月 | 色婷婷国产精品一区在线观看 | 亚洲一二三区精品 | 成人国产电影在线观看 | 欧美二区在线播放 | 黄色小说18 | 午夜三级福利 | 丁香av| 91视频最新网址 | 激情婷婷六月 | 成人在线播放av | 亚洲精品国产精品国 | 四川bbb搡bbb爽爽视频 | 天天干,天天草 | 欧美日韩3p | 国产精品一区免费在线观看 | 国产精品视频区 | 天天操福利视频 | 成人作爱视频 | 久久精品人人做人人综合老师 | 毛片永久新网址首页 | 久久一线 | 高清在线观看av | 久久影院精品 | 婷婷色综合| 狠狠操狠狠插 | 免费看av在线| 欧美aⅴ在线观看 | 天天综合色天天综合 | 在线之家官网 | 久久综合中文字幕 | 国产亚洲免费的视频看 | av在线影视| 国产精品久久久久永久免费看 | 精品欧美在线视频 | 欧美成人黄色 | 手机av在线免费观看 | 97天天干| 精品国产一区二区三区四 | 99久热在线精品视频 | 中文字幕一区二区三区四区在线视频 | 中文字幕免费在线看 | 成全免费观看视频 | 欧美日韩中 | 99久热精品 | 国产精品女视频 | 一级免费看 | 一级成人网 | 欧美日韩国产伦理 | 国产精品va视频 | 久久视频这里只有精品 | 国产精品第一页在线观看 | 国产在线观看99 | 色婷婷亚洲精品 | 国产v在线 | av大片网址 | 99精品国产福利在线观看免费 | 69xxxx欧美| 久草9视频| 亚洲激情 欧美激情 | 四虎免费av | 国产91九色视频 | 97视频在线免费 | 国产69久久精品成人看 | 亚洲涩涩网 | 天天鲁一鲁摸一摸爽一爽 | 日韩网站免费观看 | 日韩av在线小说 | 特级xxxxx欧美 | 日本中文字幕网站 | 99免费在线播放99久久免费 | 2000xxx影视| 欧美视频99| 欧美日本不卡视频 | 国产中文字幕一区 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 精品视频久久久 | 在线天堂中文www视软件 | 丁香 久久 综合 | 久草网站在线 | av最新资源 | 中文字幕韩在线第一页 | av在线免费观看不卡 | 国产1级毛片 | 久久久久国产成人精品亚洲午夜 | 国产免费观看久久黄 | 欧美精品久久久久久久久久丰满 | wwwav视频 | 国产精品永久免费 | 天天操天天干天天插 | 免费观看完整版无人区 | 麻豆视频免费入口 | 中文字幕一区二区三区乱码不卡 | 天天爽夜夜爽人人爽一区二区 | 在线天堂日本 | 毛片网站在线 | 久久午夜电影网 | 一区二区三区四区五区在线视频 | 免费福利片 | 久久久久亚洲最大xxxx | 国产在线观看中文字幕 | 在线亚洲免费视频 | www.色五月 | 久久国产欧美日韩 | 婷婷六月中文字幕 | 黄色在线看网站 | 亚洲成人av一区 | 在线亚洲精品 | se婷婷| 久久精品中文视频 | 欧美日韩精品久久久 | 九月婷婷色 | 日韩av成人 | 狠狠狠狠狠色综合 | 国产剧情一区二区 | 国产原创在线 | 91chinesexxx | 在线观看黄色小视频 | 午夜成人免费影院 | 亚洲日本一区二区在线 | 在线黄网站 | 国产午夜视频在线观看 | 夜添久久精品亚洲国产精品 | 国产91精品欧美 | 操操色 | 97人人模人人爽人人少妇 | 美女视频黄是免费的 | 99精品在线免费视频 | 狠狠躁日日躁狂躁夜夜躁 | 日本爱爱免费 | 久久99国产精品自在自在app | 国产视频91在线 | 亚洲精品乱码久久久久 | 又黄又爽又色无遮挡免费 | 久久久精品综合 | 欧美在线视频一区二区 | 夜夜澡人模人人添人人看 | 91网页版在线观看 | 欧美成人基地 | 91欧美在线| 欧美在线一级片 | 国产青青青 | 五月天亚洲综合 | 一区二区精品视频 | 久久免费视频99 | 日本最新中文字幕 | 在线电影 你懂得 | 亚洲精欧美一区二区精品 | 久久精品亚洲一区二区三区观看模式 | 日韩成人在线免费观看 | 色欧美成人精品a∨在线观看 | 欧美另类美少妇69xxxx | 天天综合天天综合 | 亚洲午夜精品电影 | 91大神电影| 久久九九精品久久 | 国产免费又粗又猛又爽 | 国产成人一区二区啪在线观看 | 久久久久久久久电影 | 日韩狠狠操 | 中文字幕永久 | 国产成人99久久亚洲综合精品 | 天天操福利视频 | 在线免费观看国产精品 | av网站大全免费 | 国产精品久久久久婷婷二区次 | 免费在线观看a v | 久草网在线视频 | 91自拍视频在线观看 | 国产成人精品一区在线 | 狠狠狠狠狠狠干 | 亚洲精品中文字幕视频 | 天堂av一区二区 | 欧美二区三区91 | 不卡的av在线 | www.av小说| 日韩精品在线视频免费观看 | 日韩久久久久久久久久久久 | 国内免费久久久久久久久久久 | 国产精品高清一区二区三区 | 伊人黄 | 日韩一级电影在线观看 | 久久国产电影院 | 成人在线观看免费 | 成人av资源网 | 97品白浆高清久久久久久 | 久久久精品国产一区二区 | 丁香高清视频在线看看 | 久草视频在线免费播放 | 欧女人精69xxxxxx | 久久精品看片 | 精品国产一区二区三区四区vr | 亚洲精品成人网 | 亚洲激情六月 | 在线观看久久久久久 | 美女网站在线免费观看 | 日本xxxxav| 国产又粗又猛又色又黄网站 | 在线视频观看成人 | 久久国产精品电影 | 中文字幕在线观看第一区 | 黄色影院在线播放 | 亚洲国产午夜精品 | av免费电影在线观看 | 欧美亚洲国产精品久久高清浪潮 | 日韩中文幕 | 久热免费在线 | 欧美成人区 | 精品久久毛片 | av中文字幕亚洲 | 在线观看国产区 | 色射色 | 福利视频一二区 | 九九久久久久久久久激情 | 91av资源在线 | 精品久久久久久久久久久久久久久久久久 | 色在线视频网 | 手机色在线 | 又黄又色又爽 | 911av视频 | 国产成人一区二区三区在线观看 | 欧美a级免费视频 | bbbbb女女女女女bbbbb国产 | 91热视频在线观看 | 91九色视频在线播放 | www.久久久.cum | 九九免费在线看完整版 | 96看片| 又黄又爽又无遮挡免费的网站 | 日韩欧美电影在线 | 成人黄色在线观看视频 | 天天操网址 | 99久久久成人国产精品 | 国产精品久久久久久一区二区 | 中文字幕日韩一区二区三区不卡 | 亚洲精品456在线播放乱码 | 国产一级精品在线观看 | 中文字幕乱码在线播放 | 国产一区二区三区在线 | 国产精品网在线观看 | av一区二区三区在线 | 久久伊99综合婷婷久久伊 | av线上免费观看 | 久久1区 | 久久一区精品 | 久久久久久久久久久久av | www.五月婷婷.com | 黄色美女免费网站 | 99在线观看免费视频精品观看 | 天天干天天拍 | 美国人与动物xxxx | 色婷婷国产精品 | 久久伊人爱 | 国产短视频在线播放 | 人人干人人添 | 亚洲年轻女教师毛茸茸 | 中文字幕av一区二区三区四区 | 丁香花在线观看免费完整版视频 | 亚洲精品欧美专区 | 国产美女网| 久久久久亚洲a | 亚洲免费不卡 | 在线播放日韩 | 欧洲精品亚洲精品 | 东方av在线免费观看 | 在线小视频 | 成人欧美亚洲 | 97av在线| 久久国产色 | 精品国产免费一区二区三区五区 | 在线观看av片 | 亚洲狠狠丁香婷婷综合久久久 | 国产色拍拍拍拍在线精品 | 久久成人毛片 | 色香蕉在线视频 | 国产精品久久久久久av | 天天干天天拍天天操 | 日韩一区二区三区不卡 | 99操视频| 精品亚洲成人 | 国产精品久久久久久久久久久久午夜片 | 成人午夜黄色影院 | 香蕉久草在线 | 欧美日韩高清一区二区 国产亚洲免费看 | 久香蕉| 久久久久久国产一区二区三区 | 国产欧美精品xxxx另类 | 西西444www| 国产色黄网站 | 97精品超碰一区二区三区 | 日韩成人免费观看 | 国产又粗又猛又色 | 久草视频中文 | 中文字幕 国产视频 | 国产精品一区二区av麻豆 | 五月天天色 | 国产精品大尺度 | 91在线看 | 国产精品系列在线观看 | 成人av片免费观看app下载 | 日韩欧美第二页 | 久久韩国免费视频 | 人人添人人澡 | 色综合色综合久久综合频道88 | 免费色av | 中文字幕在线观看第三页 | 亚洲艳情 | 最近中文字幕 | 国内精品久久久久久久影视简单 | 国产精品一区在线观看你懂的 | 日韩中文三级 | 免费亚洲婷婷 | 久草在线综合 | 亚洲精品99久久久久中文字幕 | 久久久www成人免费精品张筱雨 | 久久久天天操 | 天天五月天色 | 四虎影视成人精品 | 丁香五月网久久综合 | 日韩欧美成 | 欧美天堂视频在线 | 国产免费久久久久 | 在线亚洲欧美日韩 | 日韩一二区在线观看 | 毛片永久免费 | 日韩成人精品 | 午夜视频不卡 | 国产高清小视频 | 一区二区视频电影在线观看 | 久久精品99久久久久久 | 毛片基地黄久久久久久天堂 | 婷婷色网址 | 在线观看亚洲精品 | 国产精品无av码在线观看 | 国产精品一区二区在线 | 午夜999| 久久精品婷婷 | 福利视频午夜 | 成人蜜桃视频 | 日韩影视精品 | 久久久国产精品一区二区三区 | 波多野结衣视频一区 | 人人舔人人干 | 亚洲精品黄网站 | 毛片激情永久免费 | 91桃色国产在线播放 | 久久久免费观看完整版 | 国产在线观看一 | 日本久久片 | 99久久一区 | 99精品免费久久久久久久久日本 | 精品久久久久久久久久国产 | 亚洲第一伊人 | 九九热在线观看 | 国产精品欧美久久久久天天影视 | 久久久久久黄色 | 一级做a爱片性色毛片www | 久久爱综合| 999成人网 | 日本久久中文 | 久久av网| 久久经典国产视频 | 日日夜夜网站 | 国产精品美女久久久久久网站 | 99tvdz@gmail.com | 成人免费在线视频 | 三日本三级少妇三级99 | 天天操天天色天天射 | 区一区二区三区中文字幕 | 久久69精品久久久久久久电影好 | 日韩有码在线播放 | 91麻豆精品国产91久久久无限制版 | 欧美成人亚洲成人 | 日本bbbb摸bbbb | 成人av电影在线 | 国产精品av免费观看 | 黄色一级大片免费看 | www色com| 五月婷婷丁香六月 | 成年人黄色在线观看 | 久久少妇av| 99精品亚洲 | 亚洲一二区视频 | 九色激情网 | 日躁夜躁狠狠躁2001 | 四虎国产精品成人免费影视 | 亚洲国产美女精品久久久久∴ | 亚洲国产精品va在线看 | 色就色,综合激情 | 午夜视频久久久 | 亚洲午夜精品久久久久久久久久久久 | 五月天免费网站 | 国产成人区 | 国产成人99久久亚洲综合精品 | 日日夜夜添 | 午夜电影一区 | 97精品国自产拍在线观看 | www.伊人色.com | 美女在线免费视频 | 丁香影院在线 | 天天综合网天天 | 亚洲精品国产精品乱码在线观看 | 日韩精品中文字幕久久臀 | 国产一区二区三区久久久 | 精品国模一区二区三区 | 干狠狠| 黄色av电影一级片 | wwwwww色 | 成人黄色片免费 | 成人蜜桃 | 色干干 | 1024手机基地在线观看 | 国产精品久久久久永久免费看 | 精品久久久久久久久久久久久久久久 | 成人免费看片网址 | 伊人网av | 在线а√天堂中文官网 | 国产亚洲精品久久久久久无几年桃 | aaa黄色毛片 | 波多野结衣视频网址 | 日韩大片免费在线观看 | 91麻豆产精品久久久久久 | 久久精品国亚洲 | 天天干天天插 | 精品电影一区 | 久久精品久久99精品久久 | 区一区二区三区中文字幕 | 午夜久久视频 | 日韩中文免费视频 | 亚洲a资源 | 91丨九色丨91啦蝌蚪老版 | 欧美色综合久久 | 欧美日韩一区二区视频在线观看 | 毛片网站免费 | 亚洲精品视频第一页 | 久操免费视频 | 在线观看一区 | 国产精品99精品 | 96久久精品 | 激情欧美一区二区免费视频 | 日日碰狠狠添天天爽超碰97久久 | 亚洲精品综合一二三区在线观看 | 久久黄色成人 | 特级大胆西西4444www | 亚洲成人av在线电影 | 91爱爱中文字幕 | 国产v在线播放 | 久久99深爱久久99精品 | 久久久久99精品国产片 | 国产精品久久久久久久久久妇女 | 国产精品毛片一区视频 | 久久免费视频这里只有精品 | 久草在线资源免费 | 五月花丁香婷婷 | 五月婷香 | 欧美日本国产在线观看 | 蜜桃传媒一区二区 | 激情影院在线观看 | 久久免费视频这里只有精品 | 国产精品美女免费视频 | 国产亚洲精品女人久久久久久 | 天天操天天干天天摸 | 69成人在线| 激情网综合 | 麻豆视频www | 色黄www小说 | 91成人免费视频 | 久久电影中文字幕视频 | 日韩欧美精品在线观看 | 亚洲精品国产精品乱码在线观看 | 婷婷色吧| 欧美污网站 | 久久综合狠狠 | 免费高清无人区完整版 | 欧美精品被 | 国内精品久久久久影院男同志 | 在线观看韩日电影免费 | 成人在线一区二区三区 | 国产一区视频在线播放 | 深夜国产福利 | 一区二区三区四区免费视频 | 97色婷婷成人综合在线观看 | 天天干国产 | 欧美性生交大片免网 | av在线一| 999成人精品 | 久草在线最新免费 | 久久国产影视 | 欧美日韩国产精品爽爽 | 中文字幕123区 | 日批在线看 | 午夜 在线| 综合激情久久 | 一本一道久久a久久精品 | 久久这里只有精品23 | 久久视频在线 | 狠狠婷婷 | 亚洲欧美综合精品久久成人 | 亚洲成av人片一区二区梦乃 | 成人黄色在线视频 | 欧美日韩视频 | 国产成人99久久亚洲综合精品 | 亚洲欧美成人综合 | 国产精品一区二区久久国产 | 久久国产精品网站 | 国产三级精品在线 | 在线看一级片 | 最近免费中文视频 | 午夜在线观看影院 | 国产精品刺激对白麻豆99 | 色在线网站 | 欧美午夜a | 久久成年人网站 | 日韩成人精品一区二区三区 | 日韩影视在线观看 | 中文字幕亚洲欧美 | 久久久久女人精品毛片九一 | 激情狠狠干 | 黄色av网站在线免费观看 | www.天天成人国产电影 | 天天色天天色 | 国产91对白在线播 | 91福利视频网站 | 久久99热精品这里久久精品 | 97成人在线 | 欧美日比视频 | 欧美日韩视频网站 | 成人理论电影 | 久久精品精品电影网 | 日本一区二区三区视频在线播放 | 91最新中文字幕 | 91亚洲欧美 | 在线观看久草 | 毛片99| 久久久久久免费毛片精品 | 日韩高清不卡在线 | 国产精品久久久久久久久久妇女 | 免费黄色网址网站 | 色偷偷网站视频 | 色婷婷播放 | 九九热有精品 | 久热av在线 | 在线观看视频福利 | 亚洲一区二区三区毛片 | 国产精品久久久久久一二三四五 | 久久这里 | 亚洲精品乱码久久久久久按摩 | 狠狠干激情 | 91精品天码美女少妇 | 久爱综合 | 日韩在线不卡av | 日韩欧美国产精品 | 日本在线观看一区 | 最新高清无码专区 | 国产精品99久久久久的智能播放 | 国产专区视频在线观看 | 久久精品影片 | 免费在线成人 | 精品国产一区二区三区噜噜噜 | 国产免费嫩草影院 | 国产中的精品av小宝探花 | 欧美成人h版在线观看 | 在线看小早川怜子av | 成人超碰在线 | 国产福利资源 | 国产 日韩 欧美 在线 | 97超碰站 | 国产 欧美 日本 | 亚洲天天干 | 爱射综合 | 九九电影在线 | 亚洲精品午夜国产va久久成人 | 天天操夜夜看 | 国产99在线播放 | 涩涩网站在线播放 | 激情五月婷婷综合 | 久久综合之合合综合久久 | 综合在线亚洲 | 四虎永久视频 | 最近中文字幕高清字幕在线视频 | 黄a网| 69视频网站| 国产一区二区三区高清播放 | 久久久久久久久久影视 | 最近高清中文在线字幕在线观看 | 日韩欧美一区二区在线观看 | 黄色片网站 | 五月天婷婷综合 | 97人人澡人人添人人爽超碰 | 国产成人三级三级三级97 | 国产精品入口麻豆www | 欧美一二区在线 | 狠狠激情中文字幕 | 久久在线免费 | 久久在草 | 亚洲成人黄色在线 | 91成人免费视频 | 日韩毛片在线一区二区毛片 | 成人在线观看日韩 | 精品久久久久久久久久久久久久久久久久 | 一级黄视频 | 久久8| 中文字幕 第二区 | 一二三精品视频 | 免费av在线网站 | 一区二区伦理电影 | av短片在线| 天天干天天插伊人网 | 五月天婷亚洲天综合网鲁鲁鲁 | 日b视频国产 | 综合色站 | 国产精品成人自产拍在线观看 | 4438全国亚洲精品在线观看视频 | 日韩激情小视频 | 激情影院在线观看 | 欧美日韩不卡一区 | 夜夜操天天操 | 日韩免费大片 | 亚洲国产操 | 美女网站久久 | 日日夜夜干 | 丁香六月激情 | 国产精品手机在线播放 | 久久精品成人 | 欧美精品久久久久久久久老牛影院 | 成人在线免费看视频 | 国产成人综合精品 | 九九热在线观看视频 | 久久久久免费精品国产小说色大师 | 国内久久久 | 97人人澡人人爽人人模亚洲 | 日本女人在线观看 | 美女视频黄免费 | 成人影音在线 | 国产福利精品在线观看 | 91少妇精拍在线播放 | 亚洲色图美腿丝袜 | 欧美精品久久天天躁 | 91完整版在线观看 | 亚洲日韩中文字幕在线播放 | 最新日韩中文字幕 | 亚洲电影久久久 | 五月婷婷激情六月 | 中文字幕高清有码 | 久草在线免费电影 | 韩国av免费观看 | 欧美一级黄色网 | 色视频在线观看免费 | 日本久久成人中文字幕电影 | a级黄色片视频 | 日韩小视频| 久久久久久久久久网站 | 在线色亚洲| 国产精品对白一区二区三区 | 国产高清视频色在线www | 精品免费在线视频 | 黄色精品视频 | 国产精品久久久一区二区三区网站 | 黄网站污| 中文字幕在线视频国产 | 五月天亚洲综合小说网 | 久久九九网站 | www.久久成人| 成人app在线免费观看 | 91中文字幕在线播放 | 国产特级毛片aaaaaaa高清 | 婷婷激情网站 | 国产美女永久免费 | 三级黄色a| 337p日本欧洲亚洲大胆裸体艺术 | 中文字幕色在线视频 | 天天夜操| 日日干,天天干 | 国产日本在线 | 久草在线久草在线2 | 天天综合入口 | 欧美日韩免费一区 | 精品国产电影一区二区 | 久久人视频 | 最近中文字幕视频网 | 日本中文字幕系列 | 天天天天爱天天躁 | 不卡视频一区二区三区 | 亚洲久久视频 | 在线观看成人毛片 | 亚洲视频综合在线 | 看片网站黄 | 日韩在线观看电影 | 免费看的黄网站软件 | 狠狠色丁香婷婷综合久小说久 | 亚洲精品毛片一级91精品 | 中文在线天堂资源 | 亚洲综合成人在线 | 精品福利网站 | 欧美一区二区免费在线观看 | 天天激情综合 | 日韩videos| 免费看片亚洲 | 天天看天天干 | 天天夜夜亚洲 | 超碰成人网 | 丁香在线观看完整电影视频 | 国产视频亚洲精品 | 精品久久久久久久久久岛国gif | 91 在线视频播放 | 成年人看片网站 | 日本h视频在线观看 | 激情婷婷av | 日韩三级久久 | 果冻av在线 | 国产一区自拍视频 | 久操操| 91亚洲精品视频 | 国产精品第一页在线观看 | 欧美日韩在线免费视频 | 国产拍在线 | 免费黄色在线播放 | 亚洲成人影音 | 国产清纯在线 | 免费福利视频导航 | 免费网站看av片 | 欧美日韩在线观看不卡 | 国产精彩在线视频 | 日韩视频一区二区在线 | 日韩精品综合在线 | 91精品亚洲影视在线观看 | 天堂av免费在线 | 日本在线视频网址 | 中中文字幕av在线 | www.天天色.com | 国产原厂视频在线观看 | 人人爽人人射 | 久久视屏网 | 久久亚洲综合国产精品99麻豆的功能介绍 | 伊人色播| 国产精品永久在线 | 99精品一级欧美片免费播放 | 伊人中文在线 | 国产亚洲免费观看 | 午夜日b视频 | 91精品网站在线观看 | 国产精品中文字幕在线观看 | 亚洲区视频在线观看 | 国产精品免费成人 | 九九久久免费视频 | 免费观看全黄做爰大片国产 | 96精品视频 | 国产爽视频| 欧美日韩综合在线 | 国产一区欧美日韩 | 91色蜜桃| 久久97久久97精品免视看 | 精品国产乱码久久久久久久 | 欧美性做爰猛烈叫床潮 | 日韩电影一区二区三区在线观看 | 美女免费黄网站 | 亚洲精品一区二区三区四区高清 | 在线观看 亚洲 | japanesexxxhd奶水| 欧美日韩xx| 日韩欧美国产视频 | 久久精品国产一区二区电影 | 成人黄色视| 婷婷色中文网 | 色综合久久综合网 | av观看在线观看 | 96久久精品 | 国产96在线观看 | 九九国产精品视频 | 999视频精品 | 激情av资源 | 午夜视频二区 | av看片在线观看 | 69亚洲乱| 欧美日韩视频精品 | 亚洲一级久久 | 一区在线播放 | 热久久视久久精品18亚洲精品 | 免费在线播放视频 | 精品产品国产在线不卡 | 一区二区三区四区在线 | www.色婷婷.com | 成人影音av| av黄网站| 久久久免费高清视频 | 欧美日韩中文在线观看 | 午夜黄网 | 亚洲国产精品成人av | 久久综合九色综合欧美狠狠 | 久久在线免费观看 | 在线视频欧美精品 | 欧美日韩国产网站 | 久久精品中文 | 久久国产精品99久久人人澡 | 日韩a在线播放 | 射射射综合网 | 97香蕉久久超级碰碰高清版 | 亚洲一级片免费观看 | wwwwww国产| 亚洲综合精品视频 | 国产成人av | 国产一区二区成人 | 91九色蝌蚪视频网站 | 91福利社区在线观看 | www免费视频com━ | 五月婷婷,六月丁香 | 九草在线观看 | 91九色视频导航 | 日韩av不卡在线播放 | 亚洲激情在线 | 欧美激情精品一区 | 在线观看中文字幕2021 | 国产精品99精品 | 欧美精品免费一区二区 | 精品视频免费 | 在线观看欧美成人 | 91麻豆精品国产91久久久久久 | 国产淫片 | 夜夜高潮夜夜爽国产伦精品 | 久久午夜鲁丝片 | 久久99网站 | 99视频在线播放 | 日韩v在线91成人自拍 | 伊人国产在线播放 | 成人黄色免费在线观看 | 国产日产精品久久久久快鸭 | 九九精品视频在线观看 | 毛片视频电影 | 久草在线观 | 亚洲成人999 | 黄色的视频 | 精品国内 | 国产一级在线观看视频 | 最近高清中文字幕在线国语5 | 国产成人在线精品 | 国产精品免费视频网站 | 99人成在线观看视频 | 一区二区影院 | 人人爽人人干 | 天天曰视频| 久久精品在线 | 精品国产乱码久久 | www色com | 中文字幕免费高清 | 国产手机视频精品 | 国产精品欧美久久久久天天影视 |