基于socket的聊天程序設計與實現(xiàn)_第1頁
基于socket的聊天程序設計與實現(xiàn)_第2頁
基于socket的聊天程序設計與實現(xiàn)_第3頁
基于socket的聊天程序設計與實現(xiàn)_第4頁
基于socket的聊天程序設計與實現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論