版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于socket的聊天程序設(shè)計(jì)與實(shí)現(xiàn)學(xué)生姓名:XXXXXXXX指導(dǎo)老師:XXXXXXXXXXXX摘要本設(shè)計(jì)在WINDOWS平臺(tái)上,以C語(yǔ)言為編程語(yǔ)言,實(shí)現(xiàn)局域網(wǎng)內(nèi)的即時(shí)通信工功能即聊天的功能。本設(shè)計(jì)是基于WindowsSocket的編程,分別在同一局域網(wǎng)內(nèi)的兩臺(tái)PC機(jī)的VC++6.0平臺(tái)上運(yùn)行效勞端和客戶端程序。效勞器與客戶端在Windows7環(huán)境下采用了TCP/IP連接方式,由客戶端登錄到效勞端PC機(jī),實(shí)現(xiàn)客戶端與效勞端PC的信息傳輸。關(guān)鍵詞socket;C語(yǔ)言;TCP/IP;程序設(shè)計(jì);VC++6.01引言近年來(lái),隨著全球信息化進(jìn)程的不斷開(kāi)展,網(wǎng)絡(luò)也在飛速開(kāi)展。出于高效、快速地處理各種事務(wù)的目的,越來(lái)越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來(lái)進(jìn)行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡(jiǎn)化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴(kuò)大,業(yè)務(wù)量的增加,在局域網(wǎng)上運(yùn)行的應(yīng)用越來(lái)越多,如知識(shí)庫(kù)、網(wǎng)絡(luò)會(huì)議、數(shù)據(jù)庫(kù)應(yīng)用和數(shù)據(jù)的同步與備份等,這些應(yīng)用對(duì)局域網(wǎng)的信息吞吐、處理能力的要求也越來(lái)越高。這些在企業(yè)內(nèi)部原有局域網(wǎng)設(shè)計(jì)之初未曾考慮到的新情況的出現(xiàn)使得局域網(wǎng)不堪重負(fù),容易發(fā)生信息阻塞,此時(shí),局域網(wǎng)不但不能提高生產(chǎn)效率,反而成為企業(yè)開(kāi)展的瓶頸。為了解決上述矛盾,人們提出了許多方法。提升網(wǎng)絡(luò)帶寬及增加效勞器的吞吐能力是解決此矛盾的一種方法。然而,從企業(yè)運(yùn)行的本錢方面考慮,無(wú)論是單純地提升網(wǎng)絡(luò)帶寬或增加效勞器的吞吐能力都不能從根本上解決局域網(wǎng)資源緊張的問(wèn)題,對(duì)舊有局域網(wǎng)的大規(guī)模硬件改造反而會(huì)增加企業(yè)的負(fù)擔(dān)?;赟ocket的局域網(wǎng)通信軟件可以為企業(yè)原有的局域網(wǎng)提供一種良好,平安,快速的通信機(jī)制。它的實(shí)現(xiàn)無(wú)需對(duì)企業(yè)原有的局域網(wǎng)硬件進(jìn)行任何改動(dòng),具有實(shí)現(xiàn)本錢低廉的優(yōu)點(diǎn),它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求?;赟ocket的局域網(wǎng)聊天工具是此類局域網(wǎng)通信軟件的具體實(shí)例之一,它很好地詮釋了Socket通信的原理,并且在企業(yè)內(nèi)部通信、教學(xué)、討論等應(yīng)用中都具有一定的實(shí)用價(jià)值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡(luò)帶寬資源低,占用效勞器吞吐能力低,易于編程實(shí)現(xiàn)等優(yōu)點(diǎn)。基于Socket的局域網(wǎng)通信軟件應(yīng)用范圍廣闊,不但可以處理傳統(tǒng)的通信需求,而且也能擴(kuò)展以適應(yīng)新型的網(wǎng)絡(luò)應(yīng)用,如網(wǎng)絡(luò)教育,數(shù)據(jù)影音傳輸?shù)?,擁有廣泛的應(yīng)用前景。1.1課程設(shè)計(jì)目的了解基于socket的程序設(shè)計(jì)方法,增強(qiáng)程序編寫(xiě)能力,加深對(duì)計(jì)算機(jī)網(wǎng)絡(luò)通信的理解。另外,通過(guò)課程設(shè)計(jì)培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真的工作作風(fēng)、團(tuán)隊(duì)協(xié)作精神、自主設(shè)計(jì)和獨(dú)力思考的能力。使同學(xué)們學(xué)會(huì)文獻(xiàn)檢索的根本方法和綜合運(yùn)用文獻(xiàn)的能力。1.2設(shè)計(jì)平臺(tái)網(wǎng)絡(luò):局域網(wǎng)。操作系統(tǒng):Windows7。VC++6.0簡(jiǎn)介:VC++6.0是Microsoft公司推出的一個(gè)基于Windows系統(tǒng)平臺(tái)、可視化的集成開(kāi)發(fā)環(huán)境,它的源程序按C++語(yǔ)言的要求編寫(xiě),并參加了微軟提供的功能強(qiáng)大的MFC(MicrosoftFoundationClass)類庫(kù)。MFC中封裝了大局部WindowsAPI函數(shù)和Windows控件,它包含的功能涉及到整個(gè)Windows操作系統(tǒng)。MFC不僅給用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)立應(yīng)用程序的組件,這樣,開(kāi)發(fā)人員不必從頭設(shè)計(jì)創(chuàng)立和管理一個(gè)標(biāo)準(zhǔn)Windows應(yīng)用程序所需的程序,而是從一個(gè)比擬高的起點(diǎn)編程,故節(jié)省了大量的時(shí)間。另外,它提供了大量的代碼,指導(dǎo)用戶編程時(shí)實(shí)現(xiàn)某些技術(shù)和功能。因此,使用VC++提供的高度可視化的應(yīng)用程序開(kāi)發(fā)工具和MFC類庫(kù),可使應(yīng)用程序開(kāi)發(fā)變得簡(jiǎn)單。2設(shè)計(jì)原理程序采用WindowsSocket編程,利用MFC類庫(kù)中,對(duì)WindowsSocketAPI進(jìn)行了封裝的CAsyncSocket類及其子類CSocket中提供的成員函數(shù),完成網(wǎng)絡(luò)的連接以及對(duì)字符消息的傳送。2.1win32編程原理所謂的Win32開(kāi)發(fā),就是在C語(yǔ)言的層面上,直接使用Win32API開(kāi)發(fā)Windows應(yīng)用程序或者系統(tǒng)程序。雖說(shuō)現(xiàn)在直接用Win32API開(kāi)發(fā)應(yīng)用程序的人已經(jīng)不多了,但是深入理解Windows系統(tǒng)程序設(shè)計(jì)原理,仍然是成為Windows開(kāi)發(fā)高手的良好途徑。所謂的Win32,其實(shí)是一個(gè)API標(biāo)準(zhǔn),與UNIX系統(tǒng)編程接口標(biāo)準(zhǔn)POSIX是相對(duì)應(yīng)的。下面是進(jìn)行直接的WIN32SDK方式編程的根本思路或者說(shuō)是一個(gè)框架:一個(gè)WINDOWS程序分為程序代碼和UI(UserInterface用戶接口)資源兩大部份,兩部份最后以RC編譯程序整合為一個(gè)完整的EXE文件。所謂UI資源是指功能菜單、對(duì)話框、程序圖標(biāo)、光標(biāo)形狀等等東西。這些UI資源的實(shí)際內(nèi)容〔二進(jìn)制代碼〕系借助各種工具產(chǎn)生,并以各種擴(kuò)展名存在,如.ico.bmp.cur等等。程序員必須在一個(gè)所謂的資源描述檔〔.rc〕中描述它們。RC編譯器〔RC.EXE〕讀取RC文件的描述后將所有UI資源文件集中制作出一個(gè).RES文件,再與程序代碼結(jié)合在一起,這才是一個(gè)完整的Windows可執(zhí)行文件。與控制臺(tái)程序相同的是,一個(gè)WIN32程序也必須有一個(gè)程序入口點(diǎn),但是在這兒它不再叫main(),而叫做WinMain(),當(dāng)WINDOWS的SHELL檢測(cè)到用戶欲執(zhí)行一個(gè)EXE程序,就會(huì)調(diào)用加載器把程序進(jìn)行加載,然后調(diào)用Cstartupcode,后者再調(diào)用WinMain(),程序的執(zhí)行就開(kāi)始了,WinMain()函數(shù)的原型為:intCALLBACKWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);2.2TCP/IP協(xié)議簡(jiǎn)介TCP/IP協(xié)議實(shí)際上就是在物理網(wǎng)上的一組完整的網(wǎng)絡(luò)協(xié)議。其中TCP是提供傳輸層效勞,而IP那么是提供網(wǎng)絡(luò)層效勞。TCP/IP主要包括以下協(xié)議:IP:網(wǎng)間協(xié)議(InternetProtocol)負(fù)責(zé)主機(jī)間數(shù)據(jù)的路由和網(wǎng)絡(luò)上數(shù)據(jù)的存儲(chǔ)。同時(shí)為ICMP,TCP,UDP提供分組發(fā)送效勞。用戶進(jìn)程通常不需要涉及這一層。ICMP:網(wǎng)間報(bào)文控制協(xié)議(InternetControlMessageProtocol)此協(xié)議處理網(wǎng)關(guān)和主機(jī)的過(guò)失和傳送控制。TCP:傳輸控制協(xié)議(TransmissionControlProtocol)這是一種提供應(yīng)用戶進(jìn)程的可靠的全雙工字節(jié)流面向連接的協(xié)議。它要為用戶進(jìn)程提供虛電路效勞,并為數(shù)據(jù)可靠傳輸建立檢查。TCP/IP協(xié)議的核心局部是傳輸層協(xié)議(TCP、UDP),網(wǎng)絡(luò)層協(xié)議(IP)和物2.3WINDOWSSOCKETS網(wǎng)絡(luò)編程接口概述在網(wǎng)絡(luò)編程中最常用的方案便是Client/Server(客戶機(jī)/效勞器)模型。在這種方案中客戶應(yīng)用程序向效勞器程序請(qǐng)求效勞。一個(gè)效勞程序通常在一個(gè)眾所周知的地址監(jiān)聽(tīng)對(duì)效勞的請(qǐng)求,也就是說(shuō),效勞進(jìn)程一直處于休眠狀態(tài),直到一個(gè)客戶向這個(gè)效勞的地址提出了連接請(qǐng)求。在這個(gè)時(shí)刻,效勞程序被"驚醒"并且為客戶提供效勞-對(duì)客戶的請(qǐng)求作出適當(dāng)?shù)姆错?。為了方便這種Client/Server模型的網(wǎng)絡(luò)編程,90年代初,由Microsoft聯(lián)合了其他幾家公司共同制定了一套WINDOWS下的網(wǎng)絡(luò)編程接口,即WindowsSockets標(biāo)準(zhǔn),它不是一種網(wǎng)絡(luò)協(xié)議,而是一套開(kāi)放的、支持多種協(xié)議的Windows下的網(wǎng)絡(luò)編程接口?,F(xiàn)在的Winsock已經(jīng)根本上實(shí)現(xiàn)了與協(xié)議無(wú)關(guān),你可以使用Winsock來(lái)調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。Socket實(shí)際在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過(guò)這個(gè)端口與任何一個(gè)具有Socket接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過(guò)這個(gè)Socket接口來(lái)實(shí)現(xiàn)。微軟為VisualC++定義了Winsock類如CAsyncSocket類和派生于CAsyncSocket的CSocket類,它們簡(jiǎn)單易用,我們當(dāng)然可以使用這些類來(lái)實(shí)現(xiàn)自己的網(wǎng)絡(luò)程序,但是為了更好的了解WinsockAPI編程技術(shù),本設(shè)計(jì)中將使用底層的API函數(shù)實(shí)現(xiàn)Winsock平臺(tái)的即時(shí)通信工具。在VC中進(jìn)行WINSOCK的API編程開(kāi)發(fā)的時(shí)候,需要在工程中使用下面的三個(gè)文件,否那么會(huì)出現(xiàn)編譯錯(cuò)誤。(1)WINSOCK.H:這是WINSOCKAPI的頭文件,需要包含在工程中。(2)WSOCK32.LIB:WINSOCKAPI連接庫(kù)文件。(3)WINSOCK.DLL:WINSOCK的動(dòng)態(tài)連接庫(kù),位于WINDOWS的安裝目錄下。3詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)3.1客戶端連接模塊設(shè)計(jì):客戶端計(jì)算機(jī)獲取本機(jī)開(kāi)放的socket端口23,再發(fā)送目標(biāo)主機(jī)的IP,通過(guò)connection()函數(shù)與效勞端建立連接,如果connection()作用結(jié)果出現(xiàn)錯(cuò)誤的socket,那么連接失敗,否那么通過(guò)recv()函數(shù)接收效勞器發(fā)送的字符串,即為效勞器發(fā)送的歡送信息。模塊程序如下:……intconnection(){WSAreturn=WSAStartup(0x101,&WSAData);//始化一個(gè)WSADATA結(jié)構(gòu)if(WSAreturn){printf("發(fā)生一個(gè)未知錯(cuò)誤!\n");return0;}//創(chuàng)立一個(gè)套接口。//第一個(gè)參數(shù):一個(gè)地址描述。目前僅支持AF_INET格式,也就是說(shuō)ARPAInternet地址格式。//第二個(gè)參數(shù):新套接口的類型描述?!睸OCK_STREAM可用send()和recv()傳送數(shù)據(jù)〕//第3個(gè)參數(shù):套接口所用的協(xié)議。如調(diào)用者不想指定,可用0client=socket(AF_INET,SOCK_STREAM,0);to.sin_family=AF_INET;//sin_port存儲(chǔ)端口號(hào)〔使用網(wǎng)絡(luò)字節(jié)順序〕to.sin_port=htons(23);while(TRUE){printf("請(qǐng)輸入要登陸的IP:");scanf("%s",&servername);//sin_addr存儲(chǔ)IP地址,使用in_addr這個(gè)數(shù)據(jù)結(jié)構(gòu)to.sin_addr.s_addr=inet_addr(servername);printf("正在連接...\n");result=connect(client,(structsockaddr*)&to,sizeof(to));if(SOCKET_ERROR==result){//連接失敗printf("對(duì)不起,無(wú)法連接到目標(biāo)主機(jī)!\n");WSACleanup();return0;}else{cansend=FALSE;recv(client,receive,sizeof(receive),0);printf("*******歡送消息消息*******\n");printf("%s\n",receive);printf("***********結(jié)束*********\n");……信息發(fā)送與接收模塊設(shè)計(jì):分別利用send()函數(shù)和recv()函數(shù)發(fā)送和接收信息。模塊程序如下:……scanf("%s\0",&chatto);send(client,chatto,strlen(chatto),0);……recv(client,chatfrom,sizeof(chatfrom),0);printf("%s\n",chatfrom);3.2效勞端連接用戶模塊設(shè)計(jì):通過(guò)GetIp()函數(shù)獲得客戶端IP,然后開(kāi)放一個(gè)端口,綁定并監(jiān)聽(tīng)端口。接受來(lái)自客戶端的連接,并向客戶端發(fā)送歡送信息。與客戶端建立連接。模塊程序如下:……intGetIp(){WSAreturn=WSAStartup(0x101,&WSAData);if(WSAreturn){printf("發(fā)生一個(gè)未知錯(cuò)誤!\n");return0;}local.sin_family=AF_INET;local.sin_addr.s_addr=INADDR_ANY;local.sin_port=htons((u_short)23);server=socket(AF_INET,SOCK_STREAM,0);if(server==INVALID_SOCKET){printf("無(wú)法創(chuàng)立套接字!\n");return0;}if(bind(server,(structsockaddr*)&local,sizeof(local))!=0){printf("無(wú)法綁定套接字!\n");return0;}if(listen(server,5)!=0){printf("無(wú)法監(jiān)聽(tīng)端口!\n");return0;}while(TRUE){printf("正在等待用戶連接...\n");client=accept(server,(structsockaddr*)&from,&fromlen);strcpy(information,inet_ntoa(from.sin_addr));strcat(welcome,information);printf("接受來(lái)自%s的連接...\n",inet_ntoa(from.sin_addr));printf("正在發(fā)送歡送消息...\n");send(client,welcome,strlen(welcome),0);//send(client,ip,strlen(ip),0);//send(client,information,strlen(information),0);printf("歡送消息信息已經(jīng)成功發(fā)送至客戶端!\n");……信息發(fā)送與接收模塊設(shè)計(jì):分別利用send()函數(shù)和recv()函數(shù)發(fā)送和接收信息。模塊程序如下:……recv(client,receive,sizeof(receive),0);printf("%s\n",receive);……scanf("%s\0",&chat);send(client,chat,strlen(chat),0);……4運(yùn)行結(jié)果在局域網(wǎng)內(nèi)的一臺(tái)PC機(jī)的VC++6.0平臺(tái)上運(yùn)行效勞端程序,并與客戶端PC機(jī)之間通信。程序運(yùn)行窗口如下列圖所示:圖4.1效勞端程序運(yùn)行后的聊天窗口在同一局域網(wǎng)內(nèi)的另一臺(tái)PC機(jī)的VC++6.0平臺(tái)上運(yùn)行效勞端程序,并與客戶端PC機(jī)之間進(jìn)行通信。程序運(yùn)行窗口如下列圖所示:圖4.2客戶端程序運(yùn)行后的聊天窗口5出現(xiàn)問(wèn)題及解決方法在編寫(xiě)效勞端和客戶端程序時(shí),始終出現(xiàn)鏈接錯(cuò)誤。錯(cuò)誤提示如:errorLNK2001:unresolvedexternalsymbol__imp__closesocket@4。…Debug/00.exe:fatalerrorLNK1120:9unresolvedexternalsErrorexecutinglink.exe.其問(wèn)題在于缺少一句連接到庫(kù)的語(yǔ)句。因此,其解決方法是在程序開(kāi)頭添加一條連接到庫(kù)的語(yǔ)句即可。6結(jié)束語(yǔ)兩個(gè)星期的時(shí)間很快就過(guò)去了,計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)也即將結(jié)束.在這兩個(gè)星期里,有過(guò)不少的艱辛和疑惑,我從剛開(kāi)始的無(wú)從下手到最后的順利完成,我又一次體驗(yàn)了自我設(shè)計(jì)的滿足感.課程設(shè)計(jì)剛開(kāi)始
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024商業(yè)貸款續(xù)期協(xié)議模板
- 常年法律顧問(wèn)服務(wù)協(xié)議模板2024
- 定制化健身私教服務(wù)協(xié)議:2024年
- 2024年貨物買賣轉(zhuǎn)讓協(xié)議模板
- 安裝工程勞務(wù)分包空調(diào)項(xiàng)目協(xié)議
- 2024年度醫(yī)療器械購(gòu)銷協(xié)議
- 2024年款飛機(jī)租賃協(xié)議范本
- 名詞講解課件教學(xué)課件
- 公正課件演講教學(xué)課件
- 浙教版四年級(jí)勞動(dòng)技術(shù)下冊(cè)教學(xué)設(shè)計(jì)
- 課堂教學(xué)質(zhì)量評(píng)價(jià)表
- 第二章 中國(guó)的自然環(huán)境 綜合檢測(cè)
- 2024秋期國(guó)家開(kāi)放大學(xué)??啤陡叩葦?shù)學(xué)基礎(chǔ)》一平臺(tái)在線形考(形考任務(wù)一至四)試題及答案
- 2024年新人教版七年級(jí)數(shù)學(xué)上冊(cè)教學(xué)課件 第六章 幾何圖形初步 6.1.2 點(diǎn)、線、面、體
- 月考(試卷)-2024-2025學(xué)年人教PEP版英語(yǔ)三年級(jí)上冊(cè)(Unit 1-Unit 2)
- 西藏印象朝圣圣地旅游攻略
- 四上第1課 身邊的數(shù)據(jù) 教案 浙教版(2023)信息科技
- 2024國(guó)機(jī)資本控股限公司招聘高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- DB11-T854-2023占道作業(yè)交通安全設(shè)施設(shè)置技術(shù)要求
- 2024年廣東省高中學(xué)業(yè)水平合格考語(yǔ)文試卷真題(含答案詳解)
- (初級(jí))航空油料計(jì)量統(tǒng)計(jì)員技能鑒定理論考試題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論