




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第12章U DP編程 在網(wǎng)絡(luò)高速發(fā)展和普及應(yīng)用的今天,UDP已逐步發(fā)展成為一種非常重要的數(shù)據(jù)傳輸方式,其應(yīng)用非常廣泛。UDP可以用來(lái)傳輸實(shí)時(shí)性要求高而數(shù)據(jù)安全性又不是特別重要的數(shù)據(jù),例如現(xiàn)在的網(wǎng)絡(luò)視頻、音頻以及網(wǎng)絡(luò)聊天大都是采用UDP方式進(jìn)行傳輸。本章就重點(diǎn)介紹如何實(shí)現(xiàn)UDP編程。 本章主要包括如下內(nèi)容: · UDP編程概述 · UDP編程示例121 UDP編程概述 無(wú)連接通信是通過(guò)“用戶數(shù)據(jù)報(bào)協(xié)議”(User Datagram Protocol,UDP)來(lái)完成的。UDP無(wú)法保障數(shù)據(jù)的可靠傳輸,但能夠向若干個(gè)目標(biāo)發(fā)送數(shù)據(jù),接收發(fā)自若干個(gè)源的數(shù)據(jù)。簡(jiǎn)單地說(shuō)就是,如果一個(gè)客戶機(jī)
2、向服務(wù)器發(fā)送數(shù)據(jù),這一數(shù)據(jù)會(huì)立即發(fā)出,不管服務(wù)器是否已準(zhǔn)備接收數(shù)據(jù);如果服務(wù)器收到了客戶機(jī)的數(shù)據(jù),它不會(huì)確認(rèn)收到與否。 由于不需要建立連接,所以UDP的傳輸效率要比TCP高,但它不能保證所有數(shù)據(jù)都準(zhǔn)確有序地到達(dá)目的地,不保證順序性、可靠性和無(wú)重復(fù)性。它是面向無(wú)連接的服務(wù),以獨(dú)立的信包進(jìn)行傳輸,通信端點(diǎn)使用UDP對(duì)應(yīng)的Internet地址。雙方不需互連,按固定的最大長(zhǎng)度進(jìn)行傳輸,因而適用于單個(gè)報(bào)文傳輸。 UDP編程相對(duì)于TCP編程來(lái)說(shuō)簡(jiǎn)單許多:首先調(diào)用socket函數(shù)創(chuàng)建數(shù)據(jù)報(bào)套接字,然后調(diào)用bind函數(shù)綁定本地地址后,接著就可以調(diào)用sendt0和recvfrom函數(shù)來(lái)直接發(fā)送數(shù)據(jù)和接收數(shù)據(jù)了。
3、在sendt0函數(shù)里參數(shù)t0直接指定了接受方的地址和端口號(hào),而recvfrom函數(shù)里的參數(shù)from可以直接得到接收數(shù)據(jù)的來(lái)源。 UDP服務(wù)器端和客戶端編程流程可參考流程圖l21,該流程圖簡(jiǎn)單地描述了阻塞式的UDP編程流程。122 UDP編程示例 上一節(jié)中簡(jiǎn)要介紹了UDP通訊特點(diǎn)以及編程方式,本節(jié)就基于SOCKET APl封裝一個(gè)CUDP CE類,并通過(guò)CUDP CE類來(lái)演示雙方通過(guò)UDP進(jìn)行傳輸數(shù)據(jù)的過(guò)程。本示例將使用UDP異步通訊,并利用事件機(jī)制來(lái)判斷數(shù)據(jù)的接收,具體實(shí)現(xiàn)步驟如下: (1)建立新項(xiàng)目。 使用vs2005lvc+1智能設(shè)備IMFC智能設(shè)備應(yīng)用程序向?qū)?chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序
4、UDPDem0,編譯環(huán)境設(shè)置為Windows Mobile 6 Professional SDK(ARMV4I),設(shè)備選擇CHSWindows Mobile 6 Classic Emulator,把窗口字體改成宋體小五號(hào)。盆幽幽。幽幽幽幽疊第12章UDP編程423 UDP服務(wù)器 UDP客戶器調(diào)用socket(),建立數(shù)據(jù)包套 接字,返回套接字S調(diào)用socket(),建立數(shù)據(jù)包套 接字,返回套接字S + 調(diào)用bind(),將套接字S和本 地地址綁字調(diào)用bind(),將套接字S和本 地地址綁字 + 調(diào)用recvfrom接收數(shù)據(jù) 、, 阻塞等待客戶數(shù)據(jù) 調(diào)用sendt0發(fā)送數(shù)據(jù) 、一, 士 調(diào)用se
5、ndt0發(fā)送數(shù)據(jù) 荔!送應(yīng)0j L 調(diào)用recvfrom接收數(shù)據(jù) + +調(diào)用closesocket0,關(guān)閉套接 字S調(diào)用closesocket0,關(guān)閉套接 字S圖121 UDP服務(wù)器端和客戶端編程流程圖 (2)新建CUDP CE類,用于封裝UDP通訊。 使用WinSockAPl函數(shù)封裝一個(gè)UDP類,用于控制所有的UDP操作。CUDP CE類提供了Open方法用于打開(kāi)UDP服務(wù),同時(shí)Open方法參數(shù)里指定了UDP本地端口、UDP遠(yuǎn)程IP地址和UDP遠(yuǎn)程端口。執(zhí)行Open方法,系統(tǒng)創(chuàng)建一個(gè)單獨(dú)的線程,并通過(guò)select事件模型來(lái)檢測(cè)UDP事件,這里主要包括數(shù)據(jù)到達(dá)事件和UDP發(fā)生錯(cuò)誤事件;Clos
6、e方法用于關(guān)閉已打開(kāi)的UDP服務(wù);SendData方法用于向遠(yuǎn)程發(fā)送數(shù)據(jù)。CUDP CE類同時(shí)還提供了兩個(gè)回調(diào)函數(shù)接口,分別為UDP接收數(shù)據(jù)事件和UDP發(fā)生錯(cuò)誤事件。CUDP CE類圖如圖l22所示。 CUDP CE+m_OnUdpRecv+m_OnUdpError+Open0:lon9 +Close0:long+SendData0:long圖12-2 CUDP_CE類圖 下面就分步介紹CUDP CE類的創(chuàng)建過(guò)程。 1)定義UDP客戶端發(fā)送錯(cuò)誤回調(diào)函數(shù)和UDP接收數(shù)據(jù)回調(diào)函數(shù),即在類CUDP CE定義文件UDP CEh里,類CUDP CE定義之前,添加如程序清單l21所示代碼。 +程序清單l2
7、-i+ #include”winsockh” UDP客戶端發(fā)送錯(cuò)誤回調(diào)函數(shù) UDP客戶端接收數(shù)據(jù)回調(diào)函數(shù) typedef void(CALLBACK+ONUDPRECV)(CWnd+,char+buf,int bufLen,sockaddr+); + 這里添加了對(duì)winsockh文件的引用,是因?yàn)閁DP所用到的相關(guān)SOCKET函數(shù)以及數(shù)據(jù)結(jié)構(gòu)都在此文件里被定義。 2)為CUDP CE類添加私有變量,用于定義UDP通訊句柄、遠(yuǎn)程通訊地址、線程退出事件句柄、存儲(chǔ)父對(duì)象句柄以及接收數(shù)據(jù)緩沖區(qū)。代碼片段如下: private: SOCKET m UDPSocket; UDP Socket通訊套接字 s
8、truct sockaddr in m RemoteAddr; 存儲(chǔ)遠(yuǎn)程通訊地址 HANDLE m ExitThreadEvent; 線程退出事件 void+m pOwner; 存儲(chǔ)父對(duì)象句柄 char m recvBuf4096, 接收數(shù)據(jù)緩沖區(qū) 接著在類構(gòu)造函數(shù)里初始化這些變量,具體實(shí)現(xiàn)如程序清單l22所示。、 +程序清單l22 構(gòu)造函數(shù) CUDPCE:CUDPCE(void) m UDPSocket=0; UDP Socket通訊套接字 m pOwner=NULL; 存儲(chǔ)父對(duì)象旬柄 ZeroMemory(m recvBuf,4096); 接收數(shù)據(jù)緩沖區(qū) m OnUdpError=NULL
9、; UDP發(fā)生錯(cuò)誤事件 m OnUdpRecv=NULL; UDP接收數(shù)據(jù)事件 ) + 3)為CUDP CE類添加數(shù)據(jù)接收和通訊錯(cuò)誤事件,代碼片段如下: public: UDP發(fā)生錯(cuò)誤事件ONUDPERROR m_OnUdpError;UDP接收數(shù)據(jù)事件 ONUDPRECV m_OnUdpRecv; 4)為CUDP CE類添加3個(gè)全局方法,分別為“打開(kāi)UDP通訊端口”方法Open、“關(guān)閉UDP通訊端口”方法Close和“發(fā)送數(shù)據(jù)”方法SendData,這3個(gè)方法將被外部調(diào)用。在使用時(shí),將首先調(diào)用0pen方法打開(kāi)UDP通訊端口,然后調(diào)用SendData方法發(fā)送數(shù)據(jù),同時(shí)還可以調(diào)用m 回調(diào)函數(shù)來(lái)接
10、收數(shù)據(jù),當(dāng)使用完成時(shí),再調(diào)用 方法關(guān)閉OnUdpRecv Close UDP通訊端口。這3個(gè)方法的聲明如下:public:打開(kāi)UDP通訊DWORD Open(voidpOwner,int localPort,LPCTSTR remoteHost ,int remotePort)j關(guān)閉UDP通訊DWORD Close(void);發(fā)送數(shù)據(jù)DWORD SendData(const char+buf,int len);Open、Close和SendData方法的實(shí)現(xiàn)如程序清單l 23所示。“+*程序清單l2-3"*+*+*+*+*+*函數(shù)介紹:打開(kāi)UDP通訊端口+入口參數(shù):pOwner:指
11、定父對(duì)象指針 localPort:指定遠(yuǎn)程UDP端口 romoteHost:指定遠(yuǎn)程IP地址 remotePort:指定遠(yuǎn)程UDP端口*出口參數(shù):(無(wú))*返回值:l代表成功;一l、一2、一3等都代表失敗jDWORD CUDPCE:0pen(void+pOwner,int localPort,LPCTSTR remoteHost,int remotePort) WSADATA WSa; 傳遞父對(duì)象指針 m_pOwner=pOwner; 加載winsock動(dòng)態(tài)鏈接庫(kù) if(WSAStartup(MAKEWORD(2,2),&wsa)!-0) f return一1;代表失敗 ) 創(chuàng)建UDP套
12、接字 mUDPSocket。socket(AFINET,SOCK_DGRAM,IPPROT0UDP)j if(mUDPSocket=INVALI吐SOCKET) return-2; 設(shè)置本地地址SOCKADDRIN localAddr;localAddrsinfamily=AF_INET;localAddrsin_port=htons(10calPort)jlocalAddr-sinaddrsaddr=INADDRANY;綁定地址if(bind(m_UDPSocket,(sockaddr+)&localAddr,sizeof(10calAddr)!-0) return一3;)設(shè)置非堵塞
13、通訊DWORD ul=1jioctlsocket(mUDPSocket,F(xiàn)IONBl0,&u1);創(chuàng)建一個(gè)線程退出事件mExitThreadEvent =CreateEvent(NULL t TRUE f FALSE f NULL);創(chuàng)建通訊線程AfxBeginThread(RecvThread,this);設(shè)置對(duì)方地址m RemoteAddrSin family=AF INETjm RemoteAddrSin port=htons(remotePort);此處要將雙字節(jié)轉(zhuǎn)換成單字節(jié)char anSiRemoteHost255;ZeroMemory(ansiRemoteHoSt,255
14、);WideCharToMultiByte(CP ACP,WC COMPOSITECHECK,remoteHost,wcslen(remoteHost) ,ansiRemoteHost,WCSlen(remoteHost),NULL,NULL);m RemoteAddrsin addrs addr=inet addr(ansiRemoteHost);return l;|+*函數(shù)介紹:關(guān)閉UDP通訊端口*入口參數(shù):(無(wú))*出口參數(shù):(無(wú))+返回值:l代表成功;一l、一2等都代表失敗fDWORD CUDPCE:Close(void)( 設(shè)置通訊線程退出事件,通知線程退出 SetEvent(mExi
15、tThreadEvent); Sleep(1000); 關(guān)閉線程旬柄 CloseHandle(m ExitThreadEvent)j 關(guān)閉socket if(closesocket(m UDPSocket)=SOCKETERROR) return一1; )釋放socket資源if(WSACleanup()=SOCKETERROR) return一2;return l;”*函數(shù)介紹:*入口參數(shù):發(fā)送數(shù)據(jù)buf:緩沖區(qū)數(shù)據(jù)醬糊圈圈第12章UDP編程427 Len:緩沖數(shù)據(jù)長(zhǎng)度*出口參數(shù):(無(wú))+返回值:發(fā)送成功代表實(shí)際發(fā)送的字節(jié)數(shù),否則返回一lfDWORD CUDPCE:SendData(cons
16、t char+buf,int len) int nBytes=0;每次發(fā)送出去的字節(jié) int nSendBytes=O j 已經(jīng)發(fā)送出去的字節(jié) int nErrorCode=0;錯(cuò)誤碼 發(fā)送數(shù)據(jù) while(nSendBytes<len) 發(fā)送數(shù)據(jù) nBytes=sendto(m_UDPSocket,buf+nSendBytes,lennSendBytes,0,(sockaddr+)m RemoteAddr,Sizeof(m RemoteAddr); if(nBytes=SOCKETERROR) nErrorCode=WSAGetLastError()j i f(m_OnUdpError
17、) m_OnUdpError(m_pOwner,nErrorCode); ) retUrn一1;全部發(fā)送完畢 if(nSendBytes=len) break; 循環(huán)發(fā)送 Sleep(500); nSendBytes=nSendBytes+nBytes; ) return nSendBytes;)+5)為CUDP CE類添加接收數(shù)據(jù)線程函數(shù)RecvThread,該線程在UDP打開(kāi)后就開(kāi)始運(yùn)行,到關(guān)閉UDP后退出。RecvThread線程函數(shù)用于實(shí)時(shí)檢測(cè)是否有UDP數(shù)據(jù)到達(dá),實(shí)現(xiàn)實(shí)時(shí)異步數(shù)據(jù)讀取。該線程函數(shù)定義如下: private: 通訊線程函數(shù)StatiC UINT RecvThread(L
18、PVOIDRecvThread函數(shù)的具體實(shí)現(xiàn)如程序清單iparam);124所示。程序清單l24+p+函數(shù)介紹:接收線程函數(shù)*入口參數(shù):iparam:指?jìng)鬟M(jìn)線程的參數(shù)*出口參數(shù):(無(wú))*返回值:、無(wú)意義。fUINT CUDP CE:RecvThread(LPVOID iparam)( 川 CUDP CE*pSocket=(CUDPCE+)iparam; fd set fdRead; int ret; TIMEVAL aTime j aTimetv sec=1; aTimetv usec=0; SOCKADDR IN tmpAddr; int tmpRecVLen; 。 int recvLen;
19、 int iErrorCode;while(TRUE) 收到退出事件,結(jié)束線程 if fwaitF。rSingleObj ect(pSocket->m_ExitThreadEvent,O)=WAIT_OBJECT 0) ( break; ) 將set初始化為空集合 FD ZERO(&fdRead); 藉pSocket一>mUDPSocket套接字添加到集合中 FD SET(pSocket->mUDPSocket,&fdRead); 調(diào)用select函數(shù),判斷套接字Il0狀態(tài) ret:select(0,fdRead,NULL,NULL,&aTime);
20、if(ret=SOCKETERROR) iErrorCode =WSAGetLastError(); if(pSocket一>m_OnUdpError) oSocket一>m OnUdpError(pSocket一>m pOwner,iErrorCode); break; 有事件發(fā)生if(ret>0)收到數(shù)據(jù)if(FDISSET(pSocket一>mUDPSocket,fdRead), f f tmpAddrsinfamily=AFINET; tmpAddr·sin_port 2 htons(pSocket一>mRemoteAddrsin_port
21、); tmpAddrsin addrs addr=INADDR ANY; tmpRecvLen=sizeof(tmpAddr)j 置空接收緩沖區(qū) ZeroMemory(pSocket一>m recvBuf,4096); 接收數(shù)據(jù) recvLen 2 recvfrom(pSocket一>m_UDPSocket,pSocket一>m_recvBuf,4096,0,(SOCKADDR+)&tmpAddr,&tmpRecvLen); i f f recvLen=SOCKET ERROR) f iErrorCode=WSAGetLastError()j if(pSock
22、et。>m_OnUdpError) pSocket一>m_OnUdpError(pSocket一>m_pOwner,iErrorCode); else if(recvLen=0) iErrorCode=WSAGetLastError(); if(pSocket一>m OnUdpError) pSocket一>m_OnUdpError(pSocket一>m_pOwner,iErrorCode); ) else 調(diào)用回調(diào)函數(shù)將數(shù)據(jù)發(fā)送出去 if(pSocket>m_OnUdpRecv) f pSocket一>m_OnUdpRecv(pSocket一&
23、gt;m_pOwner,pSocket一>m_recvBuf,recvLen,(SOCKADDR*)&tmpAddr)j ) TRACE(L”The read thread had exitedn-·)jWindows CE嵌入式高級(jí)編程及其實(shí)例詳解(用c+實(shí)現(xiàn)) return 0;)+至此,CUDP CE類就設(shè)計(jì)完成了,下面就來(lái)看看CUDP CE類的使用效果。(3)設(shè)計(jì)主對(duì)話框,實(shí)現(xiàn)UDP通訊。1)設(shè)計(jì)如圖l23所示的主對(duì)話框。 圖123使用CUDP_CE類示例界面窗體上的主要控件及其屬性設(shè)置如表l21所示。表121 CUDP CE類使用例子界面控件及其屬性設(shè)置表 控
24、制lD 備注IDCEDITREMOTEHOST編輯框,用于輸入遠(yuǎn)程lP地址,對(duì)應(yīng)成員變量:mRemoteHost,類型CString IDCEDITREMOTEPORT編輯框,用于輸入遠(yuǎn)程端121,對(duì)應(yīng)成員變量:mRemotePort,類型int IDCEDl0CALPORT編輯框,用于輸入本地端口,對(duì)應(yīng)成員變量:m_LocalPort,類型int IDCBTN0PEN按鈕,標(biāo)題設(shè)為“打開(kāi)”,用于打開(kāi)UDP服務(wù)IDCBTNCLOSE按鈕,標(biāo)題設(shè)為“關(guān)閉”,用于關(guān)閉UDP服務(wù)IDCB刀吐SEND按鈕,標(biāo)題設(shè)為“發(fā)送”,用于發(fā)送數(shù)據(jù)IDCEDTSEND編輯框,用于輸入發(fā)送的字符串IDCEDTREC
25、V編輯框,用于顯示接收到的字符串 2)在CUDPDemoDl9類中添加CUDP CE類私有變量。代碼片段如下: private: 定義UDP通訊類變量 CUDPCE mCEUdp j 注意:在UDPDEMODl9h文件要引用UDP CEh,因?yàn)檫@里使用到了CUDP CE類。 3)添加“打開(kāi)”、“關(guān)閉”和“發(fā)送數(shù)據(jù)”按鈕的單擊事件代碼?!按蜷_(kāi)”按鈕用于打開(kāi)指定的UDP服務(wù)端口,基于此端口可以進(jìn)行UDP數(shù)據(jù)報(bào)的發(fā)送和接收;“關(guān)閉”按鈕用于關(guān)閉打開(kāi)的UDP端口,釋放相關(guān)資源;“發(fā)送數(shù)據(jù)”用于向指定的遠(yuǎn)程地址和端口發(fā)送數(shù)據(jù)。 這3個(gè)事件函數(shù)的實(shí)現(xiàn)如程序清單l25所示。+程序清單l25 f f瓠開(kāi)UDP
26、 void CUDPDemoDl9:0nBnClickedBtnOpen() UpdateData(TRUE); m_CEUdpm_OnUdpRecv=OnUdpCERecv; mCEUdpm_OnUdpError=OnUdpCEError; DWORD nResult。mCEUdpOpen(this,m_LocalPort,m_RemoteHostGetBuffer(m_RemoteHostGetLength(),mRemotePort)j if(nResult<=O) AfxMessageBox(一T(”打開(kāi)端口失敗); ) 關(guān)閉UDPvoid CUDPDemoDl9:0nBnCl
27、ickedBtnClose() mCEUdpClose()j發(fā)送數(shù)據(jù)void CUDPDemoDl9:0nBnClickedBtnSend() char+buf=NULL; 定義發(fā)送緩沖區(qū) DWORD dwBufLen=0j 定義發(fā)送緩沖區(qū)長(zhǎng)度 CString strSend=L”:得到發(fā)送輸入框CEdit+pEdtSendMs92(CEdit+)GetDlgItem(IDCEDTSEND);ASSERT(pEdtSendMsg!=NULL);得到待發(fā)送的字符串pEdtSendMs9一>GetWindowTextW(strSend)? 將待發(fā)送的字符串轉(zhuǎn)換成單字節(jié),進(jìn)行發(fā)送 buf=ne
28、w charStrSendGetLength()+2+1; ZeroMemory(buf,strSendGetLength()+2+1); 轉(zhuǎn)換成單字節(jié)進(jìn)行發(fā)送 WideCharToMultiByte(CP ACP,WC COMPOSITECHECK,StrSendGetBuffer(strSendGetLength() ,strSendGetLength(),buf,strSendGetLength()+2,NULL,NULL);dwBufLen=strlen(buf)+1, 432 Windows CE嵌入式高級(jí)編程及其實(shí)例詳解(用c+實(shí)現(xiàn))發(fā)送數(shù)據(jù)m_CEUdpSendData(buf,
29、dwBufLen);釋放內(nèi)存delete】bufjbuf=NULL; 4)在CUDPDemoDl9類中添加兩個(gè)UDP事件函數(shù),分別為數(shù)據(jù)接收事件和通訊錯(cuò)誤事件。在數(shù)據(jù)接收事件函數(shù)里,將接收到的數(shù)據(jù),通過(guò)Windows消息發(fā)送給主窗口,由主窗口消息處理函數(shù),顯示接收到的UDP數(shù)據(jù)。這兩個(gè)事件函數(shù)的定義如下: private: UDP接收數(shù)據(jù)事件 static void CALLBACK OnUdpCERecv(void+pOwner,char+buf,DWORDdwBufLen,sockaddr+addr); UDP通訊錯(cuò)誤事件 static void CALLBACK OnUdpCEError
30、(void+pOwner,int nErrorCode); 。 它們的實(shí)現(xiàn)如程序清單l26所示。 程序清單l26+ UDP數(shù)據(jù)接收回調(diào)函數(shù) void CALLBACK CUDPDemoDl9:0nUdpCERecv(void +pOwner,char+ buf,DWORDdwBufLen,sockaddr+addr) BYTE*pRecvBuf=NULLj接收緩沖區(qū) 得到父對(duì)象指針 CUDPDemoDl9pThis=(CUDPDemoDlg+)pOwnerj 將接收的緩沖區(qū)拷貝到pRecvBuf中 pRecvBuf=new BYTEdwBufLen; CopyMemory(pRecvBuf,b
31、uf,dwBufLen);發(fā)送異步消息,表示收到串口數(shù)據(jù),消息處理完,應(yīng)釋放內(nèi)存pThis一>PostMessage(WMRECV_UDPDATA,WPARAM(pRecvBuf),dwBufLen);UDP報(bào)錯(cuò)回調(diào)函數(shù)void CALLBACK CUDPDemoDl9:0nUdpCEError(voidpOwner,int nErrorCode)f ) + 5)實(shí)現(xiàn)WM RECV UDP_DATA消息處理函數(shù)。OnRecvUdpData回調(diào)函數(shù)中,將接收到的數(shù)據(jù),通過(guò)WindowS消息異步發(fā)送出去。這樣就需要在CUDPDemoDl9對(duì)話框中,實(shí)現(xiàn)此消息處理,將接收到的數(shù)據(jù)顯示到主窗體的接收框中。 第l2章UDP編程433首先在UDPDemoDl9h文件中添加UDP接收數(shù)據(jù)消息WM RECV UDP DATA消息常量定義。#define WMRECVUDPDATA WMUSER+101然后,為CUDPDemoDl9類添加如下自定義消息處理函數(shù)定義:UDP接收數(shù)據(jù)處理函數(shù)afx msg LONG OnRecVUdpData(WPARAM wParam,LPARAM lParam)j備注:該定義可添加在DECLAREMESSAGE_MAP0語(yǔ)句之前。OnRecvUdpData函數(shù)的實(shí)現(xiàn)如程序清單l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度房產(chǎn)抵押小微企業(yè)貸款合同模板
- 2025年度兒童房安全木門(mén)定制合同
- 2025年度專利技術(shù)許可協(xié)議模板-智能硬件
- 2025年度家具行業(yè)專利技術(shù)許可合同
- 冷藏肉類電商運(yùn)輸合同
- 2025年度導(dǎo)演聘用合同范例:院線電影導(dǎo)演合作協(xié)議書(shū)
- 2025年吉安職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)完整
- 2025年度農(nóng)業(yè)種植合同解除協(xié)議樣本
- 親子教育居間合同
- 2025年度文化旅游產(chǎn)業(yè)投資合作協(xié)議書(shū)范文
- 婚內(nèi)財(cái)產(chǎn)債務(wù)協(xié)議書(shū)(通用)
- 部編版四年級(jí)下冊(cè)道德與法治 第4課 買東西的學(xué)問(wèn)(第2課時(shí)) 教學(xué)課件
- 慢性活動(dòng)性EB病毒課件
- 葡萄胎全面版課件
- 《冷沖壓工藝與模具設(shè)計(jì)》完整版ppt課件全套教程
- 業(yè)務(wù)招待費(fèi)明細(xì)單
- 高效液相色譜法分析(三聚氰胺)原始記錄1
- 典雅中國(guó)風(fēng)詩(shī)詞大會(huì)古風(fēng)PPT模板
- Part 7 Formal and Informal Styles課件
- 文化差異及跨文化交際試題集
- 油畫(huà)人體張東方姑娘的極致美
評(píng)論
0/150
提交評(píng)論