![信息處理課程設(shè)計(jì)實(shí)踐報(bào)告聊天軟件設(shè)計(jì)_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/b3ca6631-ff29-4faa-8f24-4de1edd7f2f5/b3ca6631-ff29-4faa-8f24-4de1edd7f2f51.gif)
![信息處理課程設(shè)計(jì)實(shí)踐報(bào)告聊天軟件設(shè)計(jì)_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/b3ca6631-ff29-4faa-8f24-4de1edd7f2f5/b3ca6631-ff29-4faa-8f24-4de1edd7f2f52.gif)
![信息處理課程設(shè)計(jì)實(shí)踐報(bào)告聊天軟件設(shè)計(jì)_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/b3ca6631-ff29-4faa-8f24-4de1edd7f2f5/b3ca6631-ff29-4faa-8f24-4de1edd7f2f53.gif)
![信息處理課程設(shè)計(jì)實(shí)踐報(bào)告聊天軟件設(shè)計(jì)_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/b3ca6631-ff29-4faa-8f24-4de1edd7f2f5/b3ca6631-ff29-4faa-8f24-4de1edd7f2f54.gif)
![信息處理課程設(shè)計(jì)實(shí)踐報(bào)告聊天軟件設(shè)計(jì)_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/b3ca6631-ff29-4faa-8f24-4de1edd7f2f5/b3ca6631-ff29-4faa-8f24-4de1edd7f2f55.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、信息處理課程設(shè)計(jì)實(shí)踐報(bào)告題 目: 聊 天 軟 件 班 級(jí): 信科04-4班 學(xué) 號(hào): 姓 名: 指導(dǎo)教師: 中國(guó)礦業(yè)大學(xué)計(jì)算機(jī)學(xué)院2007-1-11摘 要本文介紹了一個(gè)基于client/server模式的聊天軟件的設(shè)計(jì)與實(shí)現(xiàn)。運(yùn)用visual c+ 6.0開發(fā),利用mfc對(duì)話框開發(fā)軟件界面。 本軟件分兩個(gè)模塊:服務(wù)器端和客戶端。采用winsock編程技術(shù),實(shí)現(xiàn)了點(diǎn)對(duì)點(diǎn)的通信。服務(wù)器和客戶端工程在網(wǎng)絡(luò)方面都單獨(dú)設(shè)計(jì)了socket相關(guān)類繼承與windows csocket類,封裝性好。很好的體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想和開發(fā)方法。軟件實(shí)現(xiàn)上采用了多線程技術(shù)。不但實(shí)現(xiàn)了普通聊天軟件的網(wǎng)絡(luò)聊天功能,還增加
2、了網(wǎng)絡(luò)文件傳輸和抓取對(duì)方屏幕截圖的功能。關(guān)鍵詞 qq聊天 聊天軟件 csocket 網(wǎng)絡(luò)編程 課程設(shè)計(jì)目 錄3第1章 課題概述11.1 課題目的與意義11.2 課程設(shè)計(jì)及報(bào)告的說明2第2章 網(wǎng)絡(luò)編程相關(guān)的理論與技術(shù)32.1 計(jì)算機(jī)網(wǎng)絡(luò)模型32.1.1 osi的7層模型32.1.2 tcp/ip模型52.2 網(wǎng)絡(luò)應(yīng)用程序62.3winsock 編程82.4多線程12第3章 聊天軟件的設(shè)計(jì)與實(shí)現(xiàn)183.1 服務(wù)器端實(shí)現(xiàn)183.1.1 服務(wù)器端資源準(zhǔn)備183.1.2 服務(wù)器端程序?qū)崿F(xiàn)193.2 客戶端實(shí)現(xiàn)223.2.1 客戶端資源準(zhǔn)備223.2.2 客戶端程序?qū)崿F(xiàn)273.3聊天軟件的其他技術(shù)29結(jié)
3、束 語30參考文獻(xiàn)32第1章 課題概述1.1 課題目的與意義本課程設(shè)計(jì)是網(wǎng)絡(luò)通信課程設(shè)計(jì),課題可以有1、設(shè)計(jì)組織局域網(wǎng)2、網(wǎng)絡(luò)通信程序設(shè)計(jì)(基于各類網(wǎng)絡(luò)協(xié)議,例如tcp、udp等等)。我們選擇實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)通信軟件。利用網(wǎng)絡(luò)協(xié)議和windows編程技術(shù)做一個(gè)簡(jiǎn)易qq。 通過本課程設(shè)計(jì)的實(shí)現(xiàn),我們能進(jìn)一步掌握常用的網(wǎng)絡(luò)協(xié)議及其在程序中的運(yùn)用。同時(shí),也更進(jìn)一步學(xué)習(xí)和熟練windows編程技術(shù),加強(qiáng)自己的動(dòng)手能力。并且一個(gè)這樣的聊天軟件在設(shè)計(jì)上是可以在教育網(wǎng)用戶給同學(xué)們之間免上公網(wǎng)聊天的,而且還可以快速傳輸一些文件,對(duì)于距離比較遠(yuǎn)的兩個(gè)人是相當(dāng)實(shí)用的,另外,增加的抓取對(duì)方屏幕截圖功能可以在遠(yuǎn)程幫助對(duì)方
4、解決一些難以用語言描述的問題,對(duì)于電腦新用戶遠(yuǎn)程請(qǐng)教或求助極其方便。當(dāng)然,要使其更實(shí)用還有待進(jìn)一步完善,不過我們的這個(gè)課題在設(shè)計(jì)上是具備以上意義的。 1.2 課程設(shè)計(jì)及報(bào)告的說明本次課程設(shè)計(jì)由我和曾亮組成一個(gè)小組共同完成。本次課程設(shè)計(jì)設(shè)計(jì)報(bào)告組織結(jié)構(gòu)為:1、課題概述;2、網(wǎng)絡(luò)編程相關(guān)的理論與技術(shù);3、軟件的設(shè)計(jì)與實(shí)現(xiàn);4、結(jié)束語; 5、參考文獻(xiàn);第2章 網(wǎng)絡(luò)編程相關(guān)的理論與技術(shù)2.1 計(jì)算機(jī)網(wǎng)絡(luò)模型網(wǎng)絡(luò)有多種多樣的分層模型,這里介紹osi的7層模型和tcp/ip模型。2.1.1 osi的7層模型osi模型是由iso(國(guó)際標(biāo)準(zhǔn)化組織)的建議發(fā)展起來的,稱作“開放式系統(tǒng)互連參考模型” 。osi模型
5、一共分為7層,如下圖,分層的原則主要是: (1) 當(dāng)需要有一個(gè)不同等級(jí)的抽象時(shí),就應(yīng)當(dāng)有一個(gè)相應(yīng)的層次。(2) 每一層的功能是明確的。(3) 層與層的邊界選擇應(yīng)使通過這些邊界的信息量盡量少。(4) 層數(shù)不能太多或者太少: 層數(shù)太少會(huì)使每一層的協(xié)議太復(fù)雜;層數(shù)太多,又會(huì)是描述合作和各層功能的系統(tǒng)工作任務(wù)時(shí),遇到較多的困難。以下簡(jiǎn)單說明各層及其功能:(1) 物理層向上層提供物理連接,透明傳送比特流。(2) 數(shù)據(jù)鏈路層負(fù)責(zé)在相鄰的兩個(gè)站點(diǎn)間無差錯(cuò)的傳送以幀為單位的數(shù)據(jù)。他要負(fù)責(zé)差錯(cuò)控制,流量控制。(3) 網(wǎng)絡(luò)層主要功能是從源端到目的端為傳送的數(shù)據(jù)選擇一條合適的路由,還要解決擁塞控制問題。(4) 傳輸
6、層負(fù)責(zé)為會(huì)話層建立一條網(wǎng)絡(luò)連接,解決流量控制問題。(5) 會(huì)話層主要是負(fù)責(zé)對(duì)數(shù)據(jù)傳輸進(jìn)行管理。(6) 表示層主要解決用戶信息的語法表示問題。(7) 應(yīng)用層這一層包括了大量人們需要的協(xié)議。應(yīng)用層確定用戶通信的性質(zhì)以滿足用戶的需要。2.1.2 tcp/ip模型在目前的計(jì)算機(jī)網(wǎng)絡(luò)上被廣泛采用的是tcp/ip參考模型,他是一個(gè)與osi模型相比更簡(jiǎn)單高效的模型,tcp/ip模型是一個(gè)四層的模型系統(tǒng),如下圖:tcp/ip最初提出的是協(xié)議,模型其實(shí)是對(duì)已有協(xié)議的描述,這里簡(jiǎn)要介紹tcp/ip四層模型及作用:(1) 網(wǎng)絡(luò)接口層這一層指出主機(jī)必須使用某種協(xié)議與網(wǎng)絡(luò)連接。(2) 互聯(lián)網(wǎng)層這一層定義了分組格式和協(xié)議
7、,及ip協(xié)議。(3) 傳輸層使源端和目的端主機(jī)上的對(duì)等實(shí)體可以進(jìn)行會(huì)話。這里定義了兩個(gè)端到端協(xié)議:tcp和udp。(4) 應(yīng)用層它包含所有的高層協(xié)議,例如telnet協(xié)議,ftp協(xié)議,smtp協(xié)議,http協(xié)議等。下圖還給出了這兩種模型的層次對(duì)應(yīng)關(guān)系及比較:2.2 網(wǎng)絡(luò)應(yīng)用程序網(wǎng)絡(luò)應(yīng)用程序包括兩個(gè)部分:一部分是服務(wù)器端的應(yīng)用程序;另一部分是客戶端的應(yīng)用程序。但在網(wǎng)絡(luò)應(yīng)用程序中,不管是服務(wù)器端還是客戶端,發(fā)送數(shù)據(jù)是主動(dòng)的,而接收數(shù)據(jù)總是被動(dòng)的。服務(wù)器為客戶端請(qǐng)求建立一個(gè)socket,以處理客戶端的數(shù)據(jù)通信請(qǐng)求。服務(wù)器端為了接收客戶端的數(shù)據(jù),在為客戶端建立的socket上建立消息響應(yīng)函數(shù)onrec
8、eive,用來接受數(shù)據(jù)??蛻舳藶榱私邮芊?wù)器端的數(shù)據(jù),則在連接的socket上,建立一個(gè)消息響應(yīng)函數(shù)onreceive,用來接收數(shù)據(jù)。一般網(wǎng)絡(luò)應(yīng)用程序?qū)崿F(xiàn)包括以下幾個(gè)步驟:(1) 建立socket對(duì)象:可以使用casyncsocket或csocket建立對(duì)象,一般使用csocket來建立socket對(duì)象。(2) 建立連接:客戶端必須要連接到服務(wù)器端,同時(shí)指定服務(wù)器地址和端口號(hào)。(3) 發(fā)送和接收數(shù)據(jù)。(4) 監(jiān)聽socket:對(duì)于服務(wù)器端,建立連接后,必須創(chuàng)建監(jiān)聽線程,以便隨時(shí)能夠監(jiān)測(cè)到是否有客戶端的連接請(qǐng)求。(5) 為客戶端連接請(qǐng)求建立socket隊(duì)列:服務(wù)器端要同時(shí)處理多個(gè)客戶端的請(qǐng)求,與
9、多個(gè)客戶端實(shí)現(xiàn)并行通信,因此監(jiān)測(cè)到有客戶端的連接請(qǐng)求,須為每個(gè)客戶端均建立一個(gè)socket,以便通信時(shí)不至于發(fā)生混亂。2.3 winsock 編程通過winsock可實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)或廣播通信程序,實(shí)際這兩者之間的區(qū)別不大,編程時(shí)其程序流程所用代碼幾乎相同,不同的地方在于目標(biāo)地址選擇的不同。本課程中所舉實(shí)例為點(diǎn)對(duì)點(diǎn)的形式,并以客戶/服務(wù)器形式來構(gòu)建通過winsock進(jìn)行通信的點(diǎn)對(duì)點(diǎn)通信,并對(duì)通信過程的兩點(diǎn)分別命名為server和client。為更清楚的說明出winsock的結(jié)構(gòu)原理,下面以電信局的普通電話服務(wù)為比較對(duì)象進(jìn)行說明:1、電信局提供電話服務(wù)類似版主們這的server,普通電話用戶類似版主們
10、這的client。2、首先電信局必須建立一個(gè)電話總機(jī)。這就如果版主們必須在server端建立一個(gè)socket(套接字),這一步通過調(diào)用socket()函數(shù)實(shí)現(xiàn)。3、電信局必須給電話總機(jī)分配一個(gè)號(hào)碼,以便使用戶要撥找該號(hào)碼得到電話服務(wù),同時(shí)接入該電信局的用戶必須知道該總機(jī)的號(hào)碼。同樣,版主也在server端也要為這一套接字指定一port(端口),并且要連接該server的client必須知道該端口。這一步通過調(diào)用bind()函數(shù)實(shí)現(xiàn)。4、接下來電信局必須使總機(jī)開通并使總機(jī)能夠高效地監(jiān)聽用戶撥號(hào),如果電信局所提供服務(wù)的用戶數(shù)太多,你會(huì)發(fā)現(xiàn)撥打電信局總機(jī)老是忙音,通常電信局內(nèi)部會(huì)使該總機(jī)對(duì)應(yīng)的電話號(hào)
11、碼連到好幾個(gè)負(fù)責(zé)交換的處理中心,在一個(gè)處理中心忙于處理當(dāng)前的某個(gè)用戶時(shí),新到用戶可自動(dòng)轉(zhuǎn)到一下處理中心得到服務(wù)。同樣版主們的server端也要使自己的套接口設(shè)置成監(jiān)聽狀態(tài),這是通用listen()函數(shù)實(shí)現(xiàn)的,listen()的第二個(gè)參數(shù)是等待隊(duì)列數(shù),就如同你可以指定電信局的建立幾個(gè)負(fù)責(zé)交換的處理中心。5、用戶知道了電信局的總機(jī)號(hào)后就可以進(jìn)行撥打請(qǐng)求得到服務(wù)。在winsock的世界里做為client端是要先用socket()函數(shù)建立一個(gè)套接字,然后調(diào)connect()函數(shù)進(jìn)行連接。當(dāng)然和電話一樣,如果等待隊(duì)列數(shù)滿了、與server的線路不通或是server沒有提供此項(xiàng)服務(wù)時(shí),連接就不會(huì)成功。5、
12、電信局的總機(jī)接受了這用戶撥打的電話后負(fù)責(zé)接通用戶的線路,而總機(jī)本身則再回到等待的狀態(tài)。server也是一樣,調(diào)用accept()函數(shù)進(jìn)入監(jiān)聽處理過程,server端的代碼即在中處暫停,一旦server端接到申請(qǐng)后系統(tǒng)會(huì)建立一個(gè)新的套接字來對(duì)此連接做服務(wù),而原先的套接字則再回到監(jiān)聽等待的狀態(tài)。6、當(dāng)你電話掛完了,你就可以掛上電話,彼此間也就離線了。client和server間的套接字的關(guān)閉也是如此;這個(gè)關(guān)閉離線的動(dòng)作,可由client端或server端先關(guān)閉。有些電話查詢系統(tǒng)不也是如此嗎?關(guān)閉套接字的函數(shù)為closesocket()從以上情況可以看出在服務(wù)器端建立一個(gè)套接字,并進(jìn)入實(shí)際的監(jiān)聽步驟
13、的過程如下:socket()-bind()-listen()-accept()那么在accept()完了后,版主們說在server端將生成一個(gè)新的套接字,然后server將繼續(xù)進(jìn)入accept()狀態(tài),版主們?cè)撊绾斡眠@個(gè)新的套接字來進(jìn)行與client端的通信呢,這就用到了recv()函數(shù),而client端則是通過send()函數(shù)來向服務(wù)器發(fā)信息的。在客戶端也是采取類似的過程,其調(diào)用winsock的過程如下:socket()-connect()-send()首先建立一個(gè)socket,然后用connect()函數(shù)將其與server端的socket連接,連接成功后調(diào)用send()發(fā)送信息。2.4 多
14、線程線程概述進(jìn)程和線程都是操作系統(tǒng)的概念。進(jìn)程是應(yīng)用程序的執(zhí)行實(shí)例,每個(gè)進(jìn)程是由私有的虛擬地址空間、代碼、數(shù)據(jù)和其它各種系統(tǒng)資源組成,進(jìn)程在運(yùn)行過程中創(chuàng)建的資源隨著進(jìn)程的終止而被銷毀,所使用的系統(tǒng)資源在進(jìn)程終止時(shí)被釋放或關(guān)閉。線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行單元。系統(tǒng)創(chuàng)建好進(jìn)程后,實(shí)際上就啟動(dòng)執(zhí)行了該進(jìn)程的主執(zhí)行線程,主執(zhí)行線程以函數(shù)地址形式,比如說main或winmain函數(shù),將程序的啟動(dòng)點(diǎn)提供給windows系統(tǒng)。主執(zhí)行線程終止了,進(jìn)程也就隨之終止。每一個(gè)進(jìn)程至少有一個(gè)主執(zhí)行線程,它無需由用戶去主動(dòng)創(chuàng)建,是由系統(tǒng)自動(dòng)創(chuàng)建的。用戶根據(jù)需要在應(yīng)用程序中創(chuàng)建其它線程,多個(gè)線程并發(fā)地運(yùn)行于同一個(gè)進(jìn)程中。一
15、個(gè)進(jìn)程中的所有線程都在該進(jìn)程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統(tǒng)資源,所以線程間的通訊非常方便,多線程技術(shù)的應(yīng)用也較為廣泛。多線程可以實(shí)現(xiàn)并行處理,避免了某項(xiàng)任務(wù)長(zhǎng)時(shí)間占用cpu時(shí)間。要說明的一點(diǎn)是,目前大多數(shù)的計(jì)算機(jī)都是單處理器(cpu)的,為了運(yùn)行所有這些線程,操作系統(tǒng)為每個(gè)獨(dú)立線程安排一些cpu時(shí)間,操作系統(tǒng)以輪換方式向線程提供時(shí)間片,這就給人一種假象,好象這些線程都在同時(shí)運(yùn)行。由此可見,如果兩個(gè)非?;钴S的線程為了搶奪對(duì)cpu的控制權(quán),在線程切換時(shí)會(huì)消耗很多的cpu資源,反而會(huì)降低系統(tǒng)的性能。這一點(diǎn)在多線程編程時(shí)應(yīng)該注意。win32 sdk函數(shù)支持進(jìn)行多線程的程序設(shè)
16、計(jì),并提供了操作系統(tǒng)原理中的各種同步、互斥和臨界區(qū)等操作。visual c+ 6.0中,使用mfc類庫(kù)也實(shí)現(xiàn)了多線程的程序設(shè)計(jì),使得多線程編程更加方便。win32 api對(duì)多線程編程的支持win32 提供了一系列的api函數(shù)來完成線程的創(chuàng)建、掛起、恢復(fù)、終結(jié)以及通信等工作。下面將選取其中的一些重要函數(shù)進(jìn)行說明。 1、handlecreatethread(lpsecurity_attributes lpthreadattributes, dword dwstacksize, lpthread_start_routine lpstartaddress, lpvoid lpparameter, dw
17、ord dwcreationflags, lpdword lpthreadid);該函數(shù)在其調(diào)用進(jìn)程的進(jìn)程空間里創(chuàng)建一個(gè)新的線程,并返回已建線程的句柄,其中各參數(shù)說明如下:lpthreadattributes:指向一個(gè) security_attributes 結(jié)構(gòu)的指針,該結(jié)構(gòu)決定了線程的安全屬性,一般置為 null; dwstacksize:指定了線程的堆棧深度,一般都設(shè)置為0; lpstartaddress:表示新線程開始執(zhí)行時(shí)代碼所在函數(shù)的地址,即線程的起始地址。一般情況為(lpthread_start_routine)threadfunc,threadfunc 是線程函數(shù)名; lppa
18、rameter:指定了線程執(zhí)行時(shí)傳送給線程的32位參數(shù),即線程函數(shù)的參數(shù); dwcreationflags:控制線程創(chuàng)建的附加標(biāo)志,可以取兩種值。如果該參數(shù)為0,線程在被創(chuàng)建后就會(huì)立即開始執(zhí)行;如果該參數(shù)為create_suspended,則系統(tǒng)產(chǎn)生線程后,該線程處于掛起狀態(tài),并不馬上執(zhí)行,直至函數(shù)resumethread被調(diào)用; lpthreadid:該參數(shù)返回所創(chuàng)建線程的id; 如果創(chuàng)建成功則返回線程的句柄,否則返回null。 2、dword suspendthread(handle hthread);該函數(shù)用于掛起指定的線程,如果函數(shù)執(zhí)行成功,則線程的執(zhí)行被終止。3、dword resu
19、methread(handle hthread);該函數(shù)用于結(jié)束線程的掛起狀態(tài),執(zhí)行線程。 4、void exitthread(dword dwexitcode);該函數(shù)用于線程終結(jié)自身的執(zhí)行,主要在線程的執(zhí)行函數(shù)中被調(diào)用。其中參數(shù)dwexitcode用來設(shè)置線程的退出碼。 5、bool terminatethread(handle hthread,dword dwexitcode);一般情況下,線程運(yùn)行結(jié)束之后,線程函數(shù)正常返回,但是應(yīng)用程序可以調(diào)用terminatethread強(qiáng)行終止某一線程的執(zhí)行。各參數(shù)含義如下:hthread:將被終結(jié)的線程的句柄; dwexitcode:用于指定線程
20、的退出碼。 使用terminatethread()終止某個(gè)線程的執(zhí)行是不安全的,可能會(huì)引起系統(tǒng)不穩(wěn)定;雖然該函數(shù)立即終止線程的執(zhí)行,但并不釋放線程所占用的資源。因此,一般不建議使用該函數(shù)。 6、bool postthreadmessage(dword idthread, uint msg, wparam wparam, lparam lparam);該函數(shù)將一條消息放入到指定線程的消息隊(duì)列中,并且不等到消息被該線程處理時(shí)便返回。idthread:將接收消息的線程的id; msg:指定用來發(fā)送的消息; wparam:同消息有關(guān)的字參數(shù); lparam:同消息有關(guān)的長(zhǎng)參數(shù); 調(diào)用該函數(shù)時(shí),如果即將
21、接收消息的線程沒有創(chuàng)建消息循環(huán),則該函數(shù)執(zhí)行失敗。第3章 聊天軟件的設(shè)計(jì)與實(shí)現(xiàn)3.1 服務(wù)器端實(shí)現(xiàn)聊天軟件服務(wù)器端完成網(wǎng)絡(luò)通信中的服務(wù)器功能,除了建立socket對(duì)象,監(jiān)聽socket連接以外,還為客戶端建立了socket隊(duì)列,即允許多個(gè)客戶端連接到同一服務(wù)器,并且服務(wù)器端還支持對(duì)連上服務(wù)器的客戶單個(gè)或者群發(fā)消息的功能,及可以實(shí)現(xiàn)網(wǎng)上答疑室功能。3.1.1 服務(wù)器端資源準(zhǔn)備服務(wù)器端只是一個(gè)簡(jiǎn)單的對(duì)話框界面,沒有做過多的修飾,但也簡(jiǎn)單大方。在服務(wù)器端可以顯示客戶端的連接狀態(tài),可以自己設(shè)定要監(jiān)聽的端口,還可以對(duì)任意一個(gè)客戶端發(fā)送消息,也可以廣播式的群發(fā)消息。對(duì)話框(dialog)包括管理界面對(duì)話框
22、和關(guān)于(about)信息對(duì)話框采用一種簡(jiǎn)潔大方的設(shè)計(jì),便于操作。服務(wù)器端的資源準(zhǔn)備比較簡(jiǎn)單,以下是運(yùn)行時(shí)截取的畫面,具體介紹參見3.3節(jié)。3.1.2 服務(wù)器端程序?qū)崿F(xiàn)1在初始化階段調(diào)用wsastartup()此函數(shù)在應(yīng)用程序中初始化windows sockets dll ,只有此函數(shù)調(diào)用成功后,應(yīng)用程序才可以再調(diào)用其他windows sockets dll中的api函數(shù)。在程式中調(diào)用該函數(shù)的形式如下:wsastartup(word)(18|1),(lpwsadata)&wsadata),其中(18|1)表示我們用的是winsocket1.1版本,wsaata用來存儲(chǔ)系統(tǒng)傳回的關(guān)于winsock
23、et的資料。2、建立socket初始化winsock的動(dòng)態(tài)連接庫(kù)后,需要在服務(wù)器端建立一個(gè)監(jiān)聽的socket,為此可以調(diào)用socket()函數(shù)用來建立這個(gè)監(jiān)聽的socket,并定義此socket所使用的通信協(xié)議。此函數(shù)調(diào)用成功返回socket對(duì)象,失敗則返回invalid_socket(調(diào)用wsagetlasterror()可得知原因,所有winsocket 的api函數(shù)都可以使用這個(gè)函數(shù)來獲取失敗的原因)。如果要建立的是遵從tcp/ip協(xié)議的socket,第二個(gè)參數(shù)type應(yīng)為sock_stream,如為udp(數(shù)據(jù)報(bào))的socket,應(yīng)為sock_dgram。3、綁定端口接下來要為服務(wù)器端
24、定義的這個(gè)監(jiān)聽的socket指定一個(gè)地址及端口(port),這樣客戶端才知道待會(huì)要連接哪一個(gè)地址的哪個(gè)端口,為此我們要調(diào)用bind()函數(shù),該函數(shù)調(diào)用成功返回0,否則返回socket_error。 如果使用者不在意地址或端口的值,那么可以設(shè)定地址為inaddr_any,及port為0,windows sockets 會(huì)自動(dòng)將其設(shè)定適當(dāng)之地址及port (1024 到 5000之間的值)。此后可以調(diào)用getsockname()函數(shù)來獲知其被設(shè)定的值。4、監(jiān)聽當(dāng)服務(wù)器端的socket對(duì)象綁定完成之后,服務(wù)器端必須建立一個(gè)監(jiān)聽的隊(duì)列來接收客戶端的連接請(qǐng)求。listen()函數(shù)使服務(wù)器端的socket
25、 進(jìn)入監(jiān)聽狀態(tài),并設(shè)定可以建立的最大連接數(shù)(目前最大值限制為 5, 最小值為1)。該函數(shù)調(diào)用成功返回0,否則返回socket_error。服務(wù)器端的socket調(diào)用完listen()后,如果此時(shí)客戶端調(diào)用connect()函數(shù)提出連接申請(qǐng)的話,server 端必須再調(diào)用accept() 函數(shù),這樣服務(wù)器端和客戶端才算正式完成通信程序的連接動(dòng)作。為了知道什么時(shí)候客戶端提出連接要求,從而服務(wù)器端的socket在恰當(dāng)?shù)臅r(shí)候調(diào)用accept()函數(shù)完成連接的建立,我們就要使用wsaasyncselect()函數(shù),讓系統(tǒng)主動(dòng)來通知我們有客戶端提出連接請(qǐng)求了。該函數(shù)調(diào)用成功返回0,否則返回socket_e
26、rror。5、服務(wù)器端接受客戶端的連接請(qǐng)求當(dāng)client提出連接請(qǐng)求時(shí),server 端hwnd視窗會(huì)收到winsock stack送來我們自定義的一個(gè)消息,這時(shí),我們可以分析lparam,然后調(diào)用相關(guān)的函數(shù)來處理此事件。為了使服務(wù)器端接受客戶端的連接請(qǐng)求,就要使用accept() 函數(shù),該函數(shù)新建一socket與客戶端的socket相通,原先監(jiān)聽之socket繼續(xù)進(jìn)入監(jiān)聽狀態(tài),等待他人的連接要求。該函數(shù)調(diào)用成功返回一個(gè)新產(chǎn)生的socket對(duì)象,否則返回invalid_socket。6、結(jié)束 socket 連接結(jié)束服務(wù)器和客戶端的通信連接是很簡(jiǎn)單的,這一過程可以由服務(wù)器或客戶機(jī)的任一端啟動(dòng),只
27、要調(diào)用closesocket()就可以了,而要關(guān)閉server端監(jiān)聽狀態(tài)的socket,同樣也是利用此函數(shù)。另外,與程序啟動(dòng)時(shí)調(diào)用wsastartup()憨數(shù)相對(duì)應(yīng),程式結(jié)束前,需要調(diào)用 wsacleanup() 來通知winsock dll釋放socket所占用的資源。這兩個(gè)函數(shù)都是調(diào)用成功返回0,否則返回socket_error。3.2 客戶端實(shí)現(xiàn)3.2.1 客戶端資源準(zhǔn)備為了讓軟件更容易使用,該聊天軟件的界面和操作都騰訊qq為基礎(chǔ),又加上了自己的設(shè)計(jì)。這里我們用圖標(biāo)提取工具從騰訊qq中提取了一些頭像圖片,目的是為了讓我們的軟件看起來更親切!而且軟件中的頭像圖標(biāo)有大小兩種不同的顯示方式。在
28、工作空間中選擇resource 進(jìn)入資源編輯,插入位圖(bitmap),這里先準(zhǔn)備兩張不同大小的位圖作為頭像,并設(shè)置id。在制作不同的光標(biāo)(cursor),在用戶鼠標(biāo)在不同位置時(shí)顯示不同的光標(biāo),并設(shè)置id。然后插入圖標(biāo)(icon)。完成這些,就該制作對(duì)話框了(dialog)。對(duì)話框由自己設(shè)計(jì),包括注冊(cè)對(duì)話框,登陸對(duì)話框,用戶管理界面對(duì)話框,消息通知對(duì)話框,聊天對(duì)話框和關(guān)于(about)信息對(duì)話框。運(yùn)行時(shí)效果如圖: 3.2.2 客戶端程序?qū)崿F(xiàn)1、建立客戶端的socket客戶端應(yīng)用程序首先也是調(diào)用wsastartup()函數(shù)來與winsock的動(dòng)態(tài)連接庫(kù)建立關(guān)系,然后同樣調(diào)用socket()來建立
29、一個(gè)tcp或udp socket(相同協(xié)定的sockets才能相通,tcp對(duì)tcp,udp對(duì)udp)。與服務(wù)器端的socket不同的是,客戶端的socket可以調(diào)用bind()函數(shù),由自己來指定ip地址及port號(hào)碼;但是也可以不調(diào)用 bind(),而由 winsock來自動(dòng)設(shè)定ip地址及port號(hào)碼。2、提出連接申請(qǐng)客戶端的socket使用connect()函數(shù)來提出與服務(wù)器端的socket建立連接的申請(qǐng),函數(shù)調(diào)用成功返回0,否則返回socket_error。數(shù)據(jù)的傳送雖然基于tcp/ip連接協(xié)議(流套接字)的服務(wù)是設(shè)計(jì)客戶機(jī)/服務(wù)器應(yīng)用程序時(shí)的主流標(biāo)準(zhǔn),但有些服務(wù)也是可以通過無連接協(xié)議(數(shù)
30、據(jù)報(bào)套接字)提供的。先介紹一下tcp socket 與udp socket在傳送數(shù)據(jù)時(shí)的特性:stream (tcp) socket提供雙向、可靠、有次序、不重復(fù)的資料傳送。datagram(udp) socket雖然提供雙向的通信,但沒有可靠、有次序、不重復(fù)的保證,所以u(píng)dp傳送數(shù)據(jù)可能會(huì)收到無次序、重復(fù)的資料,甚至資料在傳輸過程中出現(xiàn)遺漏。由于udp socket 在傳送資料時(shí),并不保證資料能完整地送達(dá)對(duì)方,所以絕大多數(shù)應(yīng)用程序都是采用tcp處理socket,以保證資料的正確性。一般情況下tcp socket 的數(shù)據(jù)發(fā)送和接收是調(diào)用send() 及recv() 這兩個(gè)函數(shù)來達(dá)成,而 udp
31、 socket則是用sendto() 及recvfrom() 這兩個(gè)函數(shù),這兩個(gè)函數(shù)調(diào)用成功返回發(fā)送或接收的資料的長(zhǎng)度,否則返回socket_error。對(duì)于datagram socket而言,若是 datagram 的大小超過限制,則將不會(huì)送出任何資料,并會(huì)傳回錯(cuò)誤值。對(duì)stream socket 言,blocking 模式下,若是傳送系統(tǒng)內(nèi)的儲(chǔ)存空間不夠存放這些要傳送的資料,send()將會(huì)被block住,直到資料送完為止;如果該socket被設(shè)定為 non-blocking 模式,那么將視目前的output buffer空間有多少,就送出多少資料,并不會(huì)被 block 住。flags 的值可設(shè)為 0 或 msg_dontroute及 msg_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 13《橋》第一課時(shí)(說課稿)-2024-2025學(xué)年統(tǒng)編版語文六年級(jí)上冊(cè)001
- 1-1《氓》 說課稿 2023-2024學(xué)年統(tǒng)編版高中語文選擇性必修下冊(cè)
- 第18課+辛亥革命說課教學(xué)設(shè)計(jì) 高中歷史統(tǒng)編版(2019)必修中外歷史綱要上冊(cè)+
- 2024年高中物理 1.3 分子運(yùn)動(dòng)速率分布規(guī)律說課稿 新人教版選擇性必修第三冊(cè)
- 5 走近我們的老師 第一課時(shí) 說課稿-2023-2024學(xué)年道德與法治三年級(jí)上冊(cè)統(tǒng)編版
- 二零二五年度物流企業(yè)人力輸出與運(yùn)輸服務(wù)協(xié)議3篇
- 13《林教頭風(fēng)雪山神廟》說課稿2024-2025學(xué)年高一語文下學(xué)期(必修下冊(cè))
- 汽車撞到別人協(xié)議書(2篇)
- 海底養(yǎng)護(hù)合同(2篇)
- 2025年度酒店總經(jīng)理核心管理團(tuán)隊(duì)聘用合同
- 長(zhǎng)江委水文局2025年校園招聘17人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年湖南韶山干部學(xué)院公開招聘15人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 廣東省廣州市番禺區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末數(shù)學(xué)試題
- 智研咨詢發(fā)布:2024年中國(guó)MVR蒸汽機(jī)械行業(yè)市場(chǎng)全景調(diào)查及投資前景預(yù)測(cè)報(bào)告
- IF鋼物理冶金原理與關(guān)鍵工藝技術(shù)1
- JGJ46-2024 建筑與市政工程施工現(xiàn)場(chǎng)臨時(shí)用電安全技術(shù)標(biāo)準(zhǔn)
- 煙花爆竹重大危險(xiǎn)源辨識(shí)AQ 4131-2023知識(shí)培訓(xùn)
- 銷售提成對(duì)賭協(xié)議書范本 3篇
- 企業(yè)動(dòng)火作業(yè)安全管理制度范文
- EPC項(xiàng)目階段劃分及工作結(jié)構(gòu)分解方案
- 《跨學(xué)科實(shí)踐活動(dòng)4 基于特定需求設(shè)計(jì)和制作簡(jiǎn)易供氧器》教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論