基于socket的聊天程序設(shè)計_第1頁
基于socket的聊天程序設(shè)計_第2頁
基于socket的聊天程序設(shè)計_第3頁
基于socket的聊天程序設(shè)計_第4頁
基于socket的聊天程序設(shè)計_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、基于socket的聊天程序設(shè)計摘要無論是Windows還是Linux,網(wǎng)絡(luò)通信的協(xié)議已經(jīng)成為組成互聯(lián)網(wǎng)的關(guān)鍵,硬件方面的路由交換協(xié)議:rip,ospf,eigrp,bgp,isis,stp,rstp,vtp等,軟件方面特別是傳輸層上的:TCP/IP,UDP,應(yīng)用層上的FTP,HTTP,TELNET,DNS,DHCP等。這些都成了網(wǎng)絡(luò)穩(wěn)定通信的保證,但從某種意義上講,網(wǎng)絡(luò)本身是不穩(wěn)定的,我們只是努力讓其穩(wěn)定。即時通訊軟件(IM),就是基于系統(tǒng)的消息交換機(jī)制,它在很大程度上方便了我們的交流,本系統(tǒng)是基于C/S模式,消息轉(zhuǎn)發(fā),語音,視頻交互的簡易局域網(wǎng)聊天工具,本身具有很強(qiáng)的擴(kuò)展性,從98年到現(xiàn)在I

2、M軟件的發(fā)展是各個巨頭的合作與統(tǒng)籌的結(jié)果。本文是在線聊天室系統(tǒng)的開發(fā)說明,重點(diǎn)運(yùn)用軟件工程知識對系統(tǒng)進(jìn)行分析、設(shè)計實(shí)現(xiàn)和測試的思想的具體描述,其中包括軟件定義,軟件開發(fā)和運(yùn)行的維護(hù)這三個方面。整個系統(tǒng)分為客戶端和服務(wù)端兩大端,客戶端既可以實(shí)現(xiàn)局域網(wǎng)的文字聊天也可以實(shí)現(xiàn)點(diǎn)對點(diǎn)的語音和遠(yuǎn)程控制服務(wù),目的是使軟件的擴(kuò)展性得到發(fā)揮,使軟件滿足廣大客戶的需求。關(guān)鍵詞:IM,API,SOCKET,C/S,網(wǎng)絡(luò)協(xié)議 Communication Software DesignBased on WinSocketAbstract:Either Windows or Linux, networ

3、k communication protocols has become a key component of the Internet, hardware, routing exchange protocol: rip, ospf, eigrp, bgp, isis, stp, rstp, vtp, etc., software in particular on the transport layer: TCP / IP, UDP, application layer FTP, HTTP, TELNET, DNS, DHCP and so on. The stabilit

4、y of communication networks have become a guarantee, but from some sense, the network itself is unstable, we just try to make them stable.Instant messenger (IM), is based on the system message exchange mechanism, it is largely to facilitate our communication, the system is based on the C / S mode, m

5、essage forwarding, voice, video, interactive simple LAN chat tool itself highly scalable, from 98 years to the present development of IM software giant is all the result of cooperation and co-ordination. This article is the development of online chat room that focus on&

6、#160;using softwareengineering knowledge of the system analysis, design, implement and test the specific description of the idea, including software-defined, software development and maintenance of these three areas is running. The whole system 

7、is divided intotwo main :client and server, the client can either text chat in LAN and also point to point voice and remote control service is intended to enable the expansion of the softwareinto full play, to make the s

8、oftware to content our customers Needs.Key words: IM, API, SOCKET, C / S, network protocol 目錄第一章 VisualC+及Socket套接字介11.1開發(fā)環(huán)境visual studio 201011.2 socket套接字基礎(chǔ)11.2.1 數(shù)據(jù)報文方式21.2.2 套接字的編程要點(diǎn)及過程21.3 基本概念31.3.1帶外數(shù)據(jù)31.3.2 廣播31.3.3 字節(jié)順序31.3.4 阻塞和非阻塞41.3.5 Winsock編程原理41.3.6 MFC Windows Socket類

9、4第二章 軟件需求分析5第三章 功能描述63.1服務(wù)器方案分析63.2 客戶端系統(tǒng)分析73.3可擴(kuò)展端的分析83.3.1語音聊天模塊分析83.3.2遠(yuǎn)程控制模塊分析9第四章 關(guān)鍵技術(shù)與算法104.1服務(wù)端主體類104.1.1 主體服務(wù)端的函數(shù)104.1.2 具體算法104.2客戶端類124.2.1 主體客戶端類124.2.2 具體算法:12第五章 程序的實(shí)現(xiàn)及測試135.1客戶端實(shí)現(xiàn)145.2 擴(kuò)展部分175.2.1語音部分175.2.2遠(yuǎn)控部分建立遠(yuǎn)程服務(wù)端接收控制的客戶端225.2.3客戶端整體演示實(shí)例245.3服務(wù)端的代碼和界面程序?qū)崿F(xiàn)245.3.1主

10、要的成員函數(shù)255.4 整體程序的測試28結(jié)束語29致 謝30參考文獻(xiàn)31第一章 VisualC+及Socket套接字介1.1開發(fā)環(huán)境visual studio 2010 VS2010引入了多個新特性,整合了對象、關(guān)系型數(shù)據(jù)、XML的訪問方式,語言更加簡潔。使用Visual Studio 2010可以高效開發(fā)Windows應(yīng)用。設(shè)計中可以實(shí)時反映變更,XAML中智能感知功能可以提高開發(fā)效率。同時微軟也更新了他的sdk,使api更加的完善,比如本文后面使用的設(shè)置窗口透明度函數(shù),這個在6.0中是不存在的,而vs2010增加了這個特性,并定義了這個API。從vs的界面使用方面,對對象的分類和視圖的屬

11、性更加強(qiáng)大,工具欄也人性話了。對于代碼的運(yùn)行效果上看,查錯能里得到了增強(qiáng),比如printf這個函數(shù)會出發(fā)警告,因?yàn)榇撕瘮?shù)很有可能產(chǎn)生溢出。在整體上,vs2010增加了使用效果,是整個系統(tǒng)更加穩(wěn)定。圖1-1 vs2010界面1.2 socket套接字基礎(chǔ)Winsock是一套開放的,支持多種協(xié)議的Windows下網(wǎng)絡(luò)編程接口,是Windows網(wǎng)絡(luò)編程實(shí)是上的標(biāo)準(zhǔn).應(yīng)用程序通過調(diào)用Winsock的API實(shí)現(xiàn)相互間的通信,而Winsock利用下層的網(wǎng)絡(luò)通信協(xié)議功能和操作系統(tǒng)調(diào)用實(shí)現(xiàn)實(shí)際的通信工作。1.2.1 數(shù)據(jù)報文方式套接字支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的操作單元.可以將套接字看作不同主機(jī)間的進(jìn)程進(jìn)

12、行雙向通信的端點(diǎn),它構(gòu)成了單個主機(jī)內(nèi)及整個網(wǎng)絡(luò)間的編程界面.套接字存在于通信域中.通信域是為了處理一般的線程通過套接字通信而引進(jìn)的一種抽象概念.套接字通過通常和同一個域中的套接字交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時一定要執(zhí)行某種解釋程序).Winsock規(guī)范支持單一的通信域,即Internet域.各種進(jìn)程使用這個域互相之間用Internet協(xié)議簇來進(jìn)行通信(Winsock 1.1以上的版本支持其他的域)。根據(jù)傳輸數(shù)據(jù)類型的不同,套按字可分為面向連接的數(shù)據(jù)套接字TCP和UDP兩種類型:l TCP字節(jié)流不按記錄定界,在TCP/IP協(xié)議簇中對應(yīng)TCP協(xié)議,即傳輸控制協(xié)議(Transmitio

13、nControlProtocol)。它是一個提供給用戶進(jìn)程可靠的全雙工的面向連接的協(xié)議,大多數(shù)INTERNET應(yīng)用程序如ftp、telnet使用TCP協(xié)議。通信端點(diǎn)使用TCP對應(yīng)的INTERNET地址互相連接,可保證按正確的順序以及單一和可靠的地址傳輸數(shù)據(jù)。由于它是字節(jié)流,所以包長包沒有限制,信包傳輸也不重復(fù),因而是一種常用的套接字類型。流套接字提供雙向的,有序的,無重復(fù)并且無記錄邊界的數(shù)據(jù)流服務(wù),它適應(yīng)于處理大量數(shù)據(jù).網(wǎng)絡(luò)傳輸層可以將數(shù)據(jù)分散或集中到合適尺寸的數(shù)據(jù)包中。流套接字是面向連接的,通信雙方進(jìn)行數(shù)據(jù)交換之前,必須建立一條路徑,這樣即確定了它們之間存在的路徑,又保證了雙方都是活動的,可

14、彼此相應(yīng)的,但在通信雙方之間建立一個通信信道需要很多開支.除此以外,大部分面向連接的協(xié)議為保證發(fā)送無誤,可能會需要執(zhí)行額外的計算機(jī)來驗(yàn)證正確性,為此會進(jìn)一步增加開支。l 數(shù)據(jù)報對應(yīng)記錄型數(shù)據(jù)流,在TCP/IP協(xié)議簇中對應(yīng)UDP協(xié)議,即用戶數(shù)據(jù)報協(xié)議(UserDatagramProtocol)。利用數(shù)據(jù)報服務(wù)可實(shí)現(xiàn)一些簡單的網(wǎng)絡(luò)服務(wù),如網(wǎng)點(diǎn)檢測程序PING。由于不建立連接,數(shù)據(jù)報協(xié)議比連接協(xié)議快。但不能保證所有數(shù)據(jù)都準(zhǔn)確有序地到達(dá)目的地。不保證順序性、可靠性和無重復(fù)性。它是無連接的服務(wù),以獨(dú)立的信包進(jìn)行傳輸,通信端點(diǎn)使用UDP對應(yīng)的INTERNET地址。雙方不需互連,按固定的最大長度進(jìn)行傳輸,因

15、而適用于單個報文傳輸,或較小文件的傳輸。數(shù)據(jù)報套接字支持雙向的數(shù)據(jù)流,但不保證數(shù)據(jù)傳輸?shù)目煽啃?有序性,和無重復(fù)性.也就是說,一個從數(shù)據(jù)報套接字接受信息的進(jìn)程有可能發(fā)現(xiàn)信息重復(fù),或者和發(fā)出時間順序不同的情況.此外,數(shù)據(jù)報套接字的一個重要特點(diǎn)是它保留了記錄邊界。1.2.2 套接字的編程要點(diǎn)及過程圖1-2 套接字建立過程1.3 基本概念1.3.1帶外數(shù)據(jù)帶外數(shù)據(jù),也稱為TCP緊急數(shù)據(jù),它是相連的每一對流套接字間的一個邏輯上獨(dú)立的傳輸通道,帶外數(shù)據(jù)是獨(dú)立于普通數(shù)據(jù)傳輸給用戶的,這一抽象要求帶外數(shù)據(jù)設(shè)備必須支持每一時刻僅有一個帶外數(shù)據(jù)信息等候發(fā)送。對于僅支持帶外數(shù)據(jù)的通信協(xié)議來說(例如緊急數(shù)據(jù)是與普通

16、數(shù)據(jù)在同一序列發(fā)送),系統(tǒng)通常把緊急數(shù)據(jù)從普通數(shù)據(jù)中分離出來單獨(dú)存放。這就允許用戶可以在順序接受緊急數(shù)據(jù)和非順序接收緊急數(shù)據(jù)之間作出選擇。1.3.2 廣播數(shù)據(jù)報套接字可以用來向許多系統(tǒng)支持的網(wǎng)絡(luò)發(fā)送廣播數(shù)據(jù)包。要實(shí)現(xiàn)這種功能,網(wǎng)絡(luò)必須支持廣播功能。為此系統(tǒng)軟件并不提供對廣播功能的任何模擬。廣播信息將會給網(wǎng)絡(luò)造成極重的負(fù)擔(dān),為此它們要求網(wǎng)絡(luò)上的每臺主機(jī)都為他們服務(wù),所以發(fā)送廣播數(shù)據(jù)包的能力被限制于那些用顯式標(biāo)記了允許廣播的套接字中。廣播通常應(yīng)用于以下兩種情況:一個應(yīng)用程序希望在本地網(wǎng)絡(luò)中找到一個資源。而應(yīng)用程序?qū)υ撡Y源的地址又沒有任何先驗(yàn)的知識。一些重要功能,例如路由要求把它們的信息發(fā)送給所有可

17、以找到的鄰機(jī)。1.3.3 字節(jié)順序不同的計算機(jī)有時使用不同的字節(jié)順序存儲數(shù)據(jù)。例如,基于Intel處理器的計算機(jī)和Macintosh計算機(jī)使用了相反的字節(jié)排序順序。Intel的字節(jié)順序被成為“Little-Endian”,它與網(wǎng)絡(luò)的字節(jié)排序順序“Big-Endian”排序順序相反。任何從Winsock函數(shù)對IP地址和端口號的引用和傳送給Winsock函數(shù)的IP地址和端口號均是按照網(wǎng)絡(luò)順序組織的,這也包括了sockaddr_in這一數(shù)據(jù)結(jié)構(gòu)中的IP地址域和端口域1.3.4 阻塞和非阻塞套接字可以處于阻塞模式或非阻塞模式。調(diào)用任何一個阻塞模式地函數(shù),都回產(chǎn)生相同地后果-耗費(fèi)或長或短地時間等待操作地

18、完成。而當(dāng)套接字處于非阻塞模式時,API函數(shù)的調(diào)用會立即返回,大多數(shù)情況這些調(diào)用都回“失敗”,并返回一個WASEWOULDBLOCK的錯誤,它意味著請求的操作在調(diào)用期間沒有時間完成。Winsock的套接字I/O模型可以幫助應(yīng)用程序判斷一個套接字何時可供讀寫。 套接字的行為在Windows 9X 和Windows NT中與在 Windows 3.1中不同.在32位操作系統(tǒng)中,可以采用多線程編程,在不同的線程中使用套接字,這樣即使某個線程中的套接字被阻塞,也不會影響應(yīng)用程序的其他操作,同時也不會在阻塞線程上耗費(fèi)CPU時間。1.3.5 Winsock編程原理客戶機(jī)/服務(wù)器模型工作時要求有一套為客戶機(jī)

19、和服務(wù)器所共識的慣例來保證服務(wù)能夠被提供(或被接受),這一套慣例包含了一套協(xié)議,它必須在通信的兩頭都被實(shí)現(xiàn)。根據(jù)不同的實(shí)際情況,協(xié)議可能是對稱的或非對稱的。在對稱的協(xié)議中每一方都有可能扮演主從角色;在非對稱協(xié)議中一方被不可改變地認(rèn)為是主機(jī),而另一方則是從機(jī)。一個對稱協(xié)議地例子是Internet中用于終端仿真地Telnet,而非對稱協(xié)議地例子是Internet中的http。無論具體的協(xié)議是對稱的或是非對稱的,當(dāng)服務(wù)被提供時必然存在客戶進(jìn)程和服務(wù)進(jìn)程。一個服務(wù)程序通常在一個眾所周知地地址監(jiān)聽客戶對服務(wù)地請求,也就是說,服務(wù)進(jìn)程一直處于休眠狀態(tài),直到一個客戶對這個服務(wù)地址提出連接請求。在這個時刻,服

20、務(wù)程序被“驚醒”并且為客戶提供服務(wù)-對客戶地請求作出適當(dāng)?shù)姆磻?yīng)。1.3.6 MFC Windows Socket類Vsual C+對眾多的socket函數(shù)進(jìn)行了封裝,MFC提供的封裝類是:CAsyncSocket和CSocket類。l CAsyncSocket類所提供的唯一的抽象就是將與套接字相聯(lián)系Windows消息以回調(diào)函數(shù)的形式表示,因此它帶來的唯一方便就是程序員無需自行處理Winsock的I/O模型,而對于如阻塞處理、字節(jié)順序差異以及Unicode等依然負(fù)有責(zé)任并有靈活的控制權(quán)。l CSocket類是CAsyncSocket類的派生類,它提供了對通過Carchive對象使用套接字工作的更

21、高級抽象。CSocket類的使用比CAsynCSocket類更加容易,它繼承了CAsyncSocket類的許多封裝了API的成員函數(shù),并且管理了通信的大多數(shù)方面,這使得用戶從原來不得不使用原始API或者CAsyncSocket類的煩雜的工作中解脫出來。更加重要的是CSocket和Carchive類提供了對于同步操作Carchive對象十分重要的阻塞功能,且CSocket通過與CSocketFile和Carchive一起使用來管理對象數(shù)據(jù)的發(fā)送和接收,使發(fā)送數(shù)據(jù)和操作變得簡單明了。第二章 軟件需求分析需求分析在軟件設(shè)計中扮演著決策者的角色,所以在所有設(shè)計中起著非常重要的作用。根據(jù)網(wǎng)絡(luò)應(yīng)用程序的特

22、點(diǎn),網(wǎng)絡(luò)在線聊天系統(tǒng)應(yīng)就有即時,快速的特點(diǎn)。服務(wù)器端和客戶端應(yīng)就有不同的功能特性。對于服務(wù)器端應(yīng)能夠正確地建立與客戶端的連接并能正確地斷開,能即時地接收、處理和發(fā)送接收到的數(shù)據(jù)。能及時地通知在線用戶當(dāng)前好友在線狀況,能夠處理非正常數(shù)據(jù)的能力。對于客戶端應(yīng)能夠快速地檢查是否能夠連接到服務(wù)器端。能正確的獲得和反映當(dāng)前好友在線情況。能夠正確的與特定好友交流。能及時地接收到服務(wù)器端地數(shù)據(jù),并能即時處理數(shù)據(jù),并能將處理結(jié)果反映給用戶。服務(wù)器端:l 能夠正確地、無沖突地啟動服務(wù)器。l 監(jiān)聽指定的端口,等待用戶的連接。l 建立與客戶端的邏輯連接,并能通知其他好友。l 向新進(jìn)入的好友發(fā)出已上線的好友名單。l

23、接收客戶端的消息請求,并能正確無誤地處理消息,并能發(fā)出消息到客戶端。l 反映當(dāng)前在線人數(shù)和在線好友狀況。l 及時地反映發(fā)出地消息和聊天消息。l 當(dāng)好友斷開與服務(wù)器端地連接時,服務(wù)器能夠正確地斷開連接,并通知其他用戶。l 當(dāng)用戶違反聊天系統(tǒng)規(guī)定時,服務(wù)器系統(tǒng)管理員能夠斷開與此用戶的連接。l 當(dāng)服務(wù)器關(guān)閉時,應(yīng)通知所有用戶??蛻舳耍簂 能夠正確啟動應(yīng)用程序,并能向服務(wù)器發(fā)出連接請求。l 反映當(dāng)前好友在線情況。l 能夠向群體或指定好友發(fā)出消息l 能夠及時接收好友發(fā)出消息,并通知用戶。l 能夠正確地斷開與服務(wù)器端地的連接。擴(kuò)展模塊:l 能夠?qū)崿F(xiàn)簡單的語音端對端的對話功能。l 能夠?qū)崿F(xiàn)不要求畫質(zhì)簡單的遠(yuǎn)

24、程控制功能。第三章 功能描述3.1服務(wù)器方案分析圖3-1 服務(wù)端方案服務(wù)端分析:a.在特定端口上等待來自聊天客戶端的連接請求,并且需要維護(hù)一個客戶連接表,記錄所有成功的連接。 b.即使接受從各個聊天客戶發(fā)送過來的消息,然后把這些消息轉(zhuǎn)發(fā)到另一個客戶端的鏈接里。 c.監(jiān)控這些連接的狀態(tài),在客戶端離開時或發(fā)生故障時從表中刪除對應(yīng)的表項。服務(wù)端的主要目的在于建立一個數(shù)據(jù)中轉(zhuǎn),完成客戶端的各種需求,所以服務(wù)端的功能依據(jù)與客戶端來建立,包括顯示客戶端的客戶在線情況,客戶端的消息等。3.2 客戶端系統(tǒng)分析圖3-2 客戶端方案客戶端分析:a.建立和維護(hù)與服務(wù)器的連接,并且隨時監(jiān)測連接的狀態(tài)。b.把用戶輸入的

25、消息時時發(fā)送到服務(wù)器,另一客戶端等待隨時接受消息。c.在用戶端退出消息時 關(guān)閉與服務(wù)器連接并告知。經(jīng)過這3個步驟,客戶端即能完成簡單的通信,在登錄框中登錄,登陸后在好友列表中顯示,文本框的內(nèi)容可以快速發(fā)送,如果有人退出,則在好友列表發(fā)出消息,這需要向服務(wù)器進(jìn)行相應(yīng)??蛻舳说臄U(kuò)展部分分為語音和遠(yuǎn)程控制,服務(wù)器和客戶端的建立完全依靠點(diǎn)對點(diǎn)的建立方式,為了和服務(wù)端產(chǎn)生沖突,在這兩個擴(kuò)展上使用了MFC的套接字建立方式,在遠(yuǎn)程控制中為了提高QOS,使用多線程的阻塞模式,這樣數(shù)據(jù)可以連續(xù)傳輸,雖然阻塞模式有多種缺點(diǎn),但采用多線程后會使視頻質(zhì)量更好,對于鼠標(biāo)和鍵盤的模擬控制也更快,當(dāng)然這也需要帶寬的支持。3

26、.3可擴(kuò)展端的分析3.3.1語音聊天模塊分析圖3-3-1 語音模塊分析語音部分分析:語音聊天實(shí)現(xiàn)起來很簡單,但涉及到底層wave函數(shù)的開發(fā),想要把數(shù)據(jù)進(jìn)行壓縮,實(shí)現(xiàn)高質(zhì)量的通話就比較難了。所以在寫代碼時避開了底層上的代碼,只涉及簡單的wave函數(shù)利用。語音聊天的模塊設(shè)計思路是發(fā)送聲音的一端將硬件接口采集到得聲音數(shù)據(jù)通過Socket發(fā)送到另一端,另外一端根據(jù)采集到得數(shù)據(jù)調(diào)用硬件接口的播放聲音,其核心就是聲音數(shù)據(jù)的采集,播放和數(shù)據(jù)網(wǎng)絡(luò)的傳輸。程序模塊接口設(shè)計:負(fù)責(zé)接收連接的服務(wù)器Socket模塊,負(fù)責(zé)程序作為服務(wù)器的監(jiān)聽端口負(fù)責(zé)接收、發(fā)送數(shù)據(jù)的客戶端Socket,負(fù)責(zé)對Socket的數(shù)據(jù)進(jìn)行消息處

27、理聲卡的數(shù)據(jù)采集與播放:采用相關(guān)波形的API,負(fù)責(zé)采集數(shù)據(jù)和播放聲音數(shù)據(jù)主框架的設(shè)計采用消息,參數(shù)和界面統(tǒng)一控制,負(fù)責(zé)整個程序的操作,負(fù)責(zé)用戶的輸入,聲卡消息的處理a.在建立好服務(wù)器和客戶端后,首先進(jìn)行音頻初始化。b.調(diào)用waveInOpen函數(shù)打開音頻設(shè)備。c.調(diào)用wavePrepareHeader函數(shù)開設(shè)錄音緩沖區(qū)。d.調(diào)用waveInAddBuffer函數(shù)實(shí)現(xiàn)錄音。(音頻的捕捉和播放相反)3.3.2遠(yuǎn)程控制模塊分析圖 3-3-2 遠(yuǎn)控模塊方案遠(yuǎn)控端的分析:遠(yuǎn)程監(jiān)控的程序設(shè)計通過Socket和應(yīng)用消息機(jī)制來監(jiān)控客戶端與被監(jiān)控端得數(shù)據(jù)交換,從而達(dá)到監(jiān)控與被監(jiān)控的目的。 這樣我們就需要2個獨(dú)立

28、的 程序:客戶端Client和服務(wù)端Server。 服務(wù)端的模塊設(shè)計:網(wǎng)絡(luò)模塊 負(fù)責(zé)監(jiān)聽客戶端的connect,接收客戶端發(fā)來的消息,包括鍵盤、鼠標(biāo)等動作,本PC對這些消息進(jìn)行處理,做出動作后發(fā)送到客戶端。編碼、解碼:如果要對得到的圖像進(jìn)行處理,則需要對數(shù)據(jù)進(jìn)行編碼解碼處理,本程序采用霍夫曼壓縮。主框架:負(fù)責(zé)對Server端得消息窗口處理和映射??蛻舳说脑O(shè)計:網(wǎng)絡(luò)部分:負(fù)責(zé)監(jiān)聽服務(wù)端的Socket,對向服務(wù)端發(fā)來的數(shù)據(jù)進(jìn)行處理,對發(fā)來的數(shù)據(jù)進(jìn)行解壓。編碼、解碼:對數(shù)據(jù)進(jìn)行解壓,多數(shù)采用霍夫曼來對數(shù)據(jù)進(jìn)行解壓。主框架:負(fù)責(zé)客戶端窗口的消息機(jī)制處理。第四章 關(guān)鍵技術(shù)與算法4.1服務(wù)端主體類4.1.

29、1 主體服務(wù)端的函數(shù)CServerDlg:創(chuàng)建服務(wù)器主窗口,管理用戶信息,用戶在線狀態(tài)等CListenSocket:用于監(jiān)聽客戶端端口CChatPacket:數(shù)據(jù)包類CCuserInfo:用戶信息類CServerApp:應(yīng)用程序?qū)嵗怌Archive和CSocketFile為MFC類,與CClientSocket類一起實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與接受。這些類都是為啟動服務(wù)端服務(wù)而創(chuàng)建的,其中啟動服務(wù)中的InitInstance()函數(shù)定義了啟動方式,用Creat方式創(chuàng)建了套接字和綁定了套接字,最后在Listen函數(shù)中監(jiān)聽。如果在異步中創(chuàng)建套接字,則使用CAsyncSocket類。當(dāng)一切準(zhǔn)備工作建立完成后,

30、數(shù)據(jù)就應(yīng)該被傳送和接收,其中用到了OnReceive,OnSend,OnAccept,OnConnect,OnClose。這樣就完成了服務(wù)端的建立,并啟動了監(jiān)聽。4.1.2 具體算法在創(chuàng)建一個socket時,可以把他設(shè)置為阻塞,也可以設(shè)置為異步。在缺省情況下,都創(chuàng)建為阻塞模式。要使程序變成非阻塞,則可以使用WSAAsynSelect函數(shù),這個函數(shù)的原型為:int WSAAsyncSelect(SOCKET s,HWND hWnd,u_int wMsg,long IEvent);其中參數(shù)1指定了要操作的socket句柄;參數(shù)2使用了窗口句柄,則最重要的是指定一個網(wǎng)絡(luò)事件。IEvent下的主要參數(shù)

31、類型FD_READ 期望在套接字上收到數(shù)據(jù)(即讀準(zhǔn)備好)時接到通知FD_WRITE 期望在套接字上可發(fā)送數(shù)據(jù)(即寫準(zhǔn)備好)時接到通知FD_OOB 期望在套接字上有帶外數(shù)據(jù)到達(dá)時接到通知FD_ACCEPT 期望在套接字上有外來連接時接到通知FD_CONNECT 期望在套接字連接建立完成時接到通知FD_CLOSE 期望在套接字關(guān)閉時接到通知rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);一般這樣建立,就可以完成異步模式了。如果想注銷次次對話,則把事件置0就行了。服務(wù)端創(chuàng)建完套接字后,剩下的就是綁定,監(jiān)聽,連接,關(guān)閉連接,關(guān)閉套接字。如果采用了CREA

32、TE算法建立套接字,則采用另一種異步方式,也是建立套接字的主流方式,因?yàn)檫@種方式是面向流的套接字,使傳輸更加圓滑。Create的函數(shù)原型為:Create( UINT nSocketPort=0,Int nSocketType=SOCK_STREAM,Long Ievent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress = NULL);這時Ievent 已經(jīng)有了整個通信的過程:l FD_ACCEPT 通知偵聽套接字當(dāng)前有連接請求可以接受 OnAccept(int nErrorCode

33、); l FD_CONNECT 通知請求連接的套接字,連接要求已被處理 OnConnect(int nErrorCode); l FD_CLOSE 通知套接字與其連接的套接字已關(guān)閉 OnClose(int nErrorCode); l FD_READ 通知有數(shù)據(jù)到達(dá) OnReceive(int nErrorCode);l FD_WRITE 通知可以發(fā)送數(shù)據(jù) OnSend(int nErrorCode); l FD_OOB 通知將有外帶數(shù)據(jù)到達(dá) OnOutOfBandData(int ErrorCode);在MFC里建立套接字,其中有個著名的異步套接字類:CAsyncSocket與Winsock

34、不同,CAsyncSocket服務(wù)端不用綁定(Bind),不用連接(Connect)。正常情況下,服務(wù)器端必須首先創(chuàng)建一個 CAsyncSocket 套接字對象,并調(diào)用它的 Create成員函數(shù)創(chuàng)建底層套接字句柄。這個套接字對象專門用來偵聽來自客戶機(jī)的連接請求,所以稱它為偵聽套接字對象。再調(diào)用偵聽套接字對象的。Listen 函數(shù),使偵聽套接字對象開始偵聽來自客戶端的連接請求。(1) 當(dāng) Listen 函數(shù)確認(rèn)并接納了一個客戶端連接請求后,觸發(fā)FD_ACCEPT 事件,偵聽套接字收到通知,MFC 框架自動調(diào)用偵聽套接字的 OnAccept 事件處理函數(shù)。一般需要重載 OnAccept 函數(shù),再在

35、其中調(diào)用偵聽套接字對象的Accept 函數(shù)。(2) 創(chuàng)建一個新的空套接字對象,專門用來與客戶端連接并進(jìn)行數(shù)據(jù)的傳輸,一般稱為連接套接字,并作為參數(shù)傳遞給下一步的 Accept 成員函數(shù)。m_sListenSocket.Accept(m_sConnectSocket);在本次擴(kuò)展端C/S模式中均采用這種方式來建立算法。圖 4-1 服務(wù)端算法4.2客戶端類4.2.1 主體客戶端類CClientDlg:創(chuàng)建客戶端主窗口,接收和發(fā)送消息CLientLoginDlg:登陸服務(wù)器窗口類CChatPacket:數(shù)據(jù)包類CClientApp:應(yīng)用程序?qū)嵗P(guān)于客戶端,也需要Init來實(shí)現(xiàn)客戶端的建立,只不過,這

36、里使用了異步的方式,用到了TCP面向連接的監(jiān)聽方式,使用Connect進(jìn)行連接。在接收和發(fā)送數(shù)據(jù)上附加了更多的處理,為了讓消息顯示出來,使用了共有成員函數(shù)ProcessPendingRead(),設(shè)置緩沖區(qū),并定義為200,然后對格式進(jìn)行format,最后在列表框中顯示出來,發(fā)送消息時用OnSend()就可以了,這個之需要一個響應(yīng)。這樣客戶端就建立起來了,至于擴(kuò)展方式,下面會有詳細(xì)分析。4.2.2 具體算法:創(chuàng)建客戶端套接字算法和服務(wù)端大體相似,不同之處在于Create的函數(shù),這里所指定的地址為服務(wù)端的地址:BOOL Create(UINT nSocketPort = 端口號,Int nSoc

37、ketPort = SOCK_STREAM | SOCK_DGRAM,LPCTSTR lpszSocketAddress = 套接字所用的網(wǎng)絡(luò)地址 );客戶端請求連接到服務(wù)器端,在服務(wù)器端套接字對象已經(jīng)進(jìn)入偵聽狀態(tài)之后,客戶應(yīng)用程序可以調(diào)用CAsyncSocket類的 Connect 成員函數(shù),向服務(wù)器發(fā)出一個連接請求。調(diào)用結(jié)束返回時發(fā)生FD_CONNECT事件,MFC 框架會自動調(diào)用客戶端套接字的 OnConnect 事件處理函數(shù)。CSocket 類是 CAsyncSocket 的派生類。創(chuàng)建 CSocket 對象時,首先要調(diào)用 CSocket 類的構(gòu)造函數(shù)創(chuàng)建一個空的 CSocket 對象

38、,再調(diào)用其 Create 成員函數(shù),創(chuàng)建對象的底層套接字。這里必須對CSocket的算法進(jìn)行了解:CSocket 類使用基類 CAsyncSocket 的同名成員函數(shù) Connect、Listen、Accept 來建立服務(wù)器和客戶機(jī)套接字之間的連接,使用方法基本相同。在創(chuàng)建 CSocket 類對象后,對于流式套接字,首先在服務(wù)器和客戶機(jī)之間建立連接,然后使用 Send 函數(shù)、Receive 函數(shù)來發(fā)送和接收數(shù)據(jù)。需要注意的是,CSocket對象從不調(diào)用OnConnect和OnSend事件處理函數(shù)。CSocket類繼承了 CAsyncSocket 類的許多成員函數(shù),用法基本一致。CSocket類

39、的高級性主要表現(xiàn)在3個方面。(1) CSocket 結(jié)合 CArchive 類來使用套接字。(2) CSocket 管理了通信的許多方面,比如字節(jié)順序問題和字符串轉(zhuǎn)換問題。(3) CSocket 類為 Windows 消息的后臺處理提供了阻塞的工作模式。有關(guān)阻塞的概念讀者可參閱相關(guān)文獻(xiàn)資料,此處不再贅述。因此,一般將 CSocket 與 CArchive、CSocketFile 類相結(jié)合,來發(fā)送和接收數(shù)據(jù),這將使編程更為簡單。圖 4-2 客戶端算法第五章 程序的實(shí)現(xiàn)及測試5.1客戶端實(shí)現(xiàn)圖 5-1-1 聊天窗口登錄窗口對話框類Login 基于CDialog封裝中有3個觸發(fā)函數(shù):OnBnClic

40、kedOk();OnBnClickedButton1();OnEnChangeEdit1();OnBnClickedOk() 觸發(fā)了登陸按鈕控件,這個事件是為了檢查服務(wù)器IP是否設(shè)置正確,用戶賬戶是否為空,空則返回MessageBox 錯誤提示。OnBnClickedButton1() 觸發(fā)了幫助按鈕,此處使用CreateProcess()函數(shù) 調(diào)用了成都理工大學(xué)主頁,當(dāng)然也可以改成你所需要的幫助頁面。OnEnChangeEdit1() 觸發(fā)了輸入編輯框,輸入IP和用戶賬戶。如果成功登陸則顯示:圖 5-1-2 聊天系統(tǒng)客戶端主窗口圖 5-1-3 雙方進(jìn)行通信的客戶端1窗口l OnInitDia

41、log()函數(shù)進(jìn)行初始化:主要對套接字進(jìn)行綁定,監(jiān)聽,接收和發(fā)送數(shù)據(jù)的處理。1) 指定端口,綁定:指定需要綁定的地址類型:SOCKADDR_IN sin; 字符型服務(wù)器地址 ulAddress=inet_addr(dlg.m_ip);m_name=dlg.m_name;綁定套接字 sockServer=socket(PF_INET,SOCK_STREAM,0);地址家族 sin.sin_family=AF_INET;把IP地址保存為一個4字節(jié)的數(shù)值 sin.sin_addr.s_addr=ulAddress;指定端口 sin.sin_port=htons(9000); 2) 進(jìn)行連接服務(wù)器In

42、t nConnect=connect(sockServer,(LPSOCKADDR)&sin,sizeof(struct sockaddr);3) 采用第一種方式建立套接字WSAAsyncSelect(sockServer,m_hWnd,WM_SOCKET_READ,FD_READ);4) 發(fā)送用戶信息nCharSend=send(sockServer,(char*)&myinfo,sizeof(myinfo),0);5) 初始化完成后,進(jìn)入消息發(fā)送和接受狀態(tài):發(fā)送消息事件由ok()按鈕觸發(fā)接受消息 recv(sockServer, (char*)&reinfo, si

43、zeof(reinfo), 0); 客戶端這邊很明顯的劃分了消息傳輸?shù)恼鎮(zhèn)€過程:從套接字的建立,完成綁定,監(jiān)聽,連接,發(fā)送數(shù)據(jù),接受數(shù)據(jù),關(guān)閉套接字。這些都是winsock必須完成的事例,對于消息完全由按鈕鍵觸發(fā)。l 客戶端顯示用戶列表消息發(fā)送到加入姓名m_list.AddString();在線用戶列表加入姓名m_list1.AddString();自己的消息框顯示內(nèi)容m_read=m_read+"rn"+reinfo.msg;l 客戶端發(fā)送消息對話框?qū)Ψ较⒖蝻@示內(nèi)容 m_read=m_read+"rn"+r

44、einfo.msg;圖 5-1-4 客戶端的主類及其重要函數(shù)5.2 擴(kuò)展部分5.2.1語音部分圖 5-2-1-1 語音部分的建立窗口圖 5-2-1-2 語音部分的主類及其函數(shù)語音部分的代碼設(shè)計及其分析:在QQ中,我們經(jīng)常使用語音來進(jìn)行溝通,這樣既方便又能達(dá)到我們雙方溝通的目的。如果我們在建立連接時,當(dāng)然這里是點(diǎn)對點(diǎn)的,我們只需要調(diào)用WaveInOpen來錄音,WaveOutOpen來放音,把聲音數(shù)據(jù)放到waveOutPrepareHeader函數(shù)里,最后釋放waveInBuffer來錄音,本身沒什么難度,在建立連接時,還是使用面向連接的TCP協(xié)議,帶寬就成了聲音質(zhì)量的關(guān)鍵。以下對一些重要的函數(shù)

45、進(jìn)行分析:l PlaySound函數(shù)BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);pszSound是指定了要播放聲音的字符串,該參數(shù)可以是WAVE文件的名是WAV資源的名字,或是內(nèi)存中聲音數(shù)據(jù)的指針,或是在系統(tǒng)注冊表WIN.INI中定義的系統(tǒng)事件聲音。如果該參數(shù)為NULL則停止正在播放的聲音。hmod是應(yīng)用程序的實(shí)例句柄,除非pszSound的指向一個資源標(biāo)識符fdwSound被定義為SND_RESOURCE),否則必須設(shè)置為NULL。fdwSound是標(biāo)志的組合,如下表所示。若成功則函數(shù)返回TRUE,否則返回FALSE

46、。使用PlaySound函數(shù)時需要在#include<windows.h>后面加上(注意:不能加在前面):#include <mmsystem.h>,#pragma comment(lib, "WINMM.LIB")l waveInGetNumDevs 返回系統(tǒng)中存在的波形輸入設(shè)備的數(shù)量 用于音頻的檢測。l waveOutGetNumDevs 和上面的相反,用于波形輸出的檢測。l waveInOpen():MMRESULT waveInOpen(LPHWAVEIN phwi,UINT_PTR uDeviceID,LPWAVEFORMATEX pwfx

47、, DWORD_PTR dwCallback,DWORD_PTR dwCallbackInstance,DWORD fdwOpen);Phwi:指向一個表示波形音頻輸入設(shè)備緩沖區(qū)的句柄,當(dāng)調(diào)用到其他的設(shè)備時,需要使用這個句柄。如果參數(shù)fdwOpen被定義成WAVE_FORMAT_QUERY,則phwi可以設(shè)為NULL.Pwfx:指向了一個WAVEPORMATEX結(jié)構(gòu)體,這個結(jié)構(gòu)體表示具體的需要錄音的波形音頻格式,調(diào)用玩waveInOpen后立即調(diào)用,用完后釋放就可以。dwCallBack:指向一個回調(diào)函數(shù),里面有3個消息dwCallBackInstall:回調(diào)的參數(shù)。fdwOpen:打開音頻設(shè)

48、備。如果waveInOpen調(diào)用成功,則返回MMSYSTERR_NOERROR.l waveInPrepareHeader(HWAVEIN hwi,LPWAVEHDR pwh,UINT Cbwh);Hwi:波形音頻輸入設(shè)備的句柄。Pwh:WAVEHDR結(jié)構(gòu)體的一個指針,用來識別準(zhǔn)備接受數(shù)據(jù)的緩沖區(qū)。Cbwh:WAVEHDR結(jié)構(gòu)體的長度。這個函數(shù)主要是用來準(zhǔn)備一塊接受音頻設(shè)備的輸入緩沖區(qū),如果這個函數(shù)調(diào)用成功,則返回MMSYSTERR_NOERROR.l waveInPrepareHeader(HWAVEIN hwi,LPWAVEHDR pwh,UINT cbwh);這個函數(shù)主要是用來清理緩沖區(qū)

49、的,設(shè)置和上面的設(shè)置是一樣的,這個函數(shù)是在驅(qū)動填滿緩沖區(qū)后調(diào)用,且必須在調(diào)用Buffer函數(shù)之前調(diào)用此函數(shù)。l waveInStart(HWAVEIN hwi) Hwi是音頻輸入設(shè)備的句柄,開始錄音。l waveInReset(HWAVEIN hwi) 停止輸入數(shù)據(jù),將所有的Buffer填滿。l waveInStop(HWAVEIN hwi) 停止錄音關(guān)于waveIn方面的函數(shù)已經(jīng)介紹完了,也就是錄音。放音方面的函數(shù)也和其有近似,只挑出一些前面沒用過的函數(shù)分析;l waveOutWrite(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh);Hwo:波形輸出的句柄。Pw

50、h:WAVEHDR結(jié)構(gòu)體的一個指針,用來表示Buffer。Cbwh:WAVEHDR結(jié)構(gòu)體的大小。這個函數(shù)主要是發(fā)送一個數(shù)據(jù)塊到給定的波形輸出設(shè)備。完成所有的網(wǎng)絡(luò)通信用異步套接字CAsynSocket類為基類,使用Creat方法建立套接字。5.2.2遠(yuǎn)控部分遠(yuǎn)程監(jiān)控程序是通過socket和消息機(jī)制,監(jiān)控程序的客戶端和被監(jiān)控端進(jìn)行的數(shù)據(jù)交換,達(dá)到監(jiān)控的目的。整個模塊分為:Server和Client兩個部分,其中網(wǎng)絡(luò)塊負(fù)責(zé)監(jiān)聽客戶端的鏈接,對客戶端發(fā)來的信息就是消息進(jìn)行處理,在本機(jī)上完成這些消息處理,并并發(fā)的發(fā)送各種數(shù)據(jù),再其次解碼模塊負(fù)責(zé)對數(shù)據(jù)圖像進(jìn)行壓縮解碼。建立遠(yuǎn)程服務(wù)端圖 5-

51、2-2-1 遠(yuǎn)程登錄的服務(wù)器圖 5-2-2-2 遠(yuǎn)程登錄的主類及其函數(shù)我們在使用一些需要鍵盤或鼠標(biāo)操作的程序時,比如聊QQ,這些敲擊鍵盤和點(diǎn)擊鼠標(biāo)的消息都是首先被驅(qū)動所截獲,然后外設(shè)將這些消息加入到系統(tǒng)的消息隊列中,這些外設(shè)比如說是系統(tǒng)內(nèi)核(kernel),這樣程序就會得到消息而得到相應(yīng)的響應(yīng)。但對于一些ring3級別的程序來講,無法提供外設(shè)的輸入,需要自己去模擬這些消息,然后發(fā)送到隊列中去,這樣就形成了消息模擬,對于遠(yuǎn)控程序,客戶端可以隨時操作服務(wù)器,所以服務(wù)端的消息響應(yīng)就成了模擬的了。l 服務(wù)端的監(jiān)控相關(guān)函數(shù)的功能及其作用:keybd_event(BYTE bVk, BYTE bScan,

52、 DWORD dwFlags, ULONG_PTR dwExtraInfo);bVk:<輸入>定義一個虛擬鍵碼。鍵碼值必須在1254之間。bScan:<輸入>定義該鍵的硬件掃描碼。dwFlags:<輸入>定義函數(shù)操作的名個方面的一個標(biāo)志位集。應(yīng)用程序可使用如下一些預(yù)定義常數(shù)的組合設(shè)置標(biāo)志位*程序如果想模擬PRINTSCAN的消息,抓取屏幕中的內(nèi)容并保存到剪切板中,那么將參數(shù)bVk設(shè)置成為VK_SNAPSHOT。如果想模擬按鍵的按下與彈起:Keybd_envet(BYTE)vk,(BYTE)vk,0,0); /按鍵的按下Keybd_envet(BYTE)vk,

53、(BYTE)vk,KEYEVENTF_KEYUP,0); /按鍵的彈起mouse_event(DWORD dwFlags,DWORD dx,DWORD dy,DWORD dwData,ULONG dwExtraInfo);dwFlags:<輸入>定義各種鼠標(biāo)移動和點(diǎn)擊的flags。dx,dy:<輸入>定義鼠標(biāo)沿著x,y的絕對位置。dwData:<輸入>如果dwFlags為MOUSEEVENTF_WHEEL,則dwData指定鼠標(biāo)輪移動的數(shù)量。正值表明鼠標(biāo)輪向前轉(zhuǎn)動,即遠(yuǎn)離用戶的方向;負(fù)值表明鼠標(biāo)輪向后轉(zhuǎn)動,即朝向用戶。一個輪擊定義為WHEEL_DELTA,即

54、120。如果 dwFlagsS不是MOUSEEVENTF_WHEEL,則dWData應(yīng)為零。dwExtralnfo:指定與鼠標(biāo)事件相關(guān)的附加32位值。應(yīng)用程序調(diào)用函數(shù)GetMessgeExtraInfo來獲得此附加信息。如果將基于畫筆的信息傳給自己的應(yīng)用程序,可以寫一個直接與板硬件通信的動態(tài)鍵接(DLL)獲得附加的信息,并保存到一個隊列中。DLL然后調(diào)用 mouse_event,用標(biāo)準(zhǔn)按鍵和x/y位置數(shù)據(jù),并在參數(shù)dwExtralnfo設(shè)置排列的附加信息的指針或索引。當(dāng)應(yīng)用程序需要附加信息時,調(diào)用 DLL連同存貯在dwEXtralnfo中的指針或索引,則DLL返回附加信息。Server服務(wù)端得

55、實(shí)現(xiàn)(1).窗體、視圖、文件MainWind.h/MainWind.cpp:顯示主窗體的界面,窗口消息處理。WndProc.h/WndProc.cpp:Windows函數(shù)的入口點(diǎn)。(2).網(wǎng)絡(luò)連接和數(shù)據(jù)交換Server.h/Server.cpp:用Winsock處理網(wǎng)絡(luò)連接和數(shù)據(jù)的傳輸,完成從客戶端法國來的消息處理。(3).數(shù)據(jù)編碼解碼(哈弗曼解壓碼)HuffCompress.h/ HuffCompress.cpp 完成霍夫曼壓縮的算法。(4).屏幕的數(shù)據(jù)鏈表結(jié)構(gòu)和操作命令Command.h/Command.cpp:用于Server和Client交互信息的鏈表GDI.h/GDI.CPP:用于繪

56、制屏幕的屏幕數(shù)據(jù)鏈表。l 服務(wù)端的網(wǎng)絡(luò)設(shè)置為了減小CPU的利用率,禁止在socket上將數(shù)據(jù)發(fā)送到緩沖。設(shè)置SO_SNDBUF為0,從而使winsock直接發(fā)送數(shù)據(jù)到客戶端,而不是將數(shù)據(jù)緩沖才發(fā)送。監(jiān)聽方式:setsockopt(Listen,SOL_SOCKET,SO_SNDBUF,(char*)&nZero,sizeof(nZero);為了節(jié)省CPU,使用線程創(chuàng)建客戶端連接,這時使用的是阻塞方式:CreateThread(NULL,0,ClientThread,(LPVOID)&myStructure,0,&dwThreadId);其中myStructure是客戶端

57、信息的數(shù)據(jù)結(jié)構(gòu)myStructure.Socket = Socket;客戶端線程函數(shù),這個函數(shù)等候從客戶端程序發(fā)送過來的消,如果這個消息是"REFRESH",那么它發(fā)送當(dāng)前的桌面圖片,如果這個消息是"DISCONNECT",那么它結(jié)束和客戶端的連接,如果這個消息以"WM_"開頭,那么它就根據(jù)消息類型,在服務(wù)器端執(zhí)行該消息。DWORD WINAPI ClientThread(LPVOID lpParam);此函數(shù)是建立客戶端線程的經(jīng)典函數(shù),其中包括對客戶端超時,客戶端建立套接字、連接的處理,還有一些消息的處理,DispatchWMMessage(szMessage)是最重要的消息函數(shù),其中解析了從客戶端發(fā)送過來的消息并發(fā)送到本機(jī)的消息隊列。接收完消息后,還需要對消息進(jìn)行發(fā)送WSASend(MySocket,&buffSend,1,&dwNumBytes,0,&olSend,NULL);這是一個持續(xù)發(fā)送的socketWSAWaitForMultipleEvents(1,eventArr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論