socket網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第1頁
socket網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第2頁
socket網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第3頁
socket網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第4頁
socket網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余9頁可下載查看

下載本文檔

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

文檔簡介

1、計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告網(wǎng)絡(luò)連天程序的設(shè)計(jì)與實(shí)現(xiàn)姓名:李堅(jiān)學(xué)號(hào):0855010206班級(jí):計(jì)算機(jī)002指導(dǎo)老師:文宏湖南科技大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院2011年9月一、課程設(shè)計(jì)題目利用WindowsSocket編程實(shí)現(xiàn)局域網(wǎng)的聊天程序,要求能實(shí)現(xiàn)消息的發(fā)送和接收,以及聊天軟件的細(xì)節(jié)問題。二、題目分析拿到題目之后先來了解windowssocket連接的過程與相關(guān)的API函數(shù)。按照題目的要求,我簡單的分析了下并做了初步的設(shè)計(jì):利用tcp協(xié)議建立連接,這樣服務(wù)器和客戶端分離,服務(wù)端先啟動(dòng)并監(jiān)聽端口,客戶端啟動(dòng)之后連接服務(wù)端建立連接,接著收發(fā)聊天信息。當(dāng)任意一方連接斷開的時(shí)候給出適當(dāng)?shù)奶崾静⒔Y(jié)束程序。因?yàn)?/p>

2、功能比較簡單,所以設(shè)計(jì)起來還是比較容易的。實(shí)際的操作中我遇到了很多新奇的問題并通過一些方案修改或者實(shí)現(xiàn)了最終的功能。三、設(shè)計(jì)步驟1、 熟悉網(wǎng)絡(luò)編程概念以及一些基本知識(shí)2、 在windows的編程環(huán)境下熟悉了常用socket函數(shù)3、 先整體再局部順序設(shè)計(jì)程序4、 調(diào)試并修改程序,使之實(shí)現(xiàn)設(shè)計(jì)要求5、 測試程序,從中找出程序缺陷和可改進(jìn)內(nèi)容6、 重復(fù)修改和測試,以達(dá)到自己理想的功能7、 程序評(píng)定測試8、 撰寫設(shè)計(jì)報(bào)告四、設(shè)計(jì)過程第一個(gè)版本并未實(shí)現(xiàn)收發(fā)同步,只是簡單的阻塞式通信。因?yàn)闆]有用到多線程,所以在程序監(jiān)聽網(wǎng)絡(luò)數(shù)據(jù)寫入時(shí)不能監(jiān)聽鍵盤輸入,所以只能發(fā)一條后接一條,其中的問題可想而知。第二個(gè)版本用

3、多線程實(shí)現(xiàn)了同時(shí)收發(fā)問題,在連接建立后新建一個(gè)線程用來等待鍵盤輸入,而主體線程等待網(wǎng)絡(luò)輸入,當(dāng)網(wǎng)絡(luò)輸入錯(cuò)誤時(shí)(連接斷開),結(jié)束線程并作下一步處理。這個(gè)版本就上個(gè)版本改進(jìn)很多,主要可以即時(shí)在屏幕輸出接收到的消息,同時(shí)也出現(xiàn)了另外一個(gè)缺陷:當(dāng)鍵盤輸入到一半時(shí)程序收到了網(wǎng)絡(luò)的信息,這個(gè)時(shí)候程序的做法是直接輸出這條信息,這導(dǎo)致我們鍵盤輸入的信息被切斷,很不人性化。第三個(gè)版本,也就是目前評(píng)測的版本,這個(gè)版本利用臨界值來鎖定屏幕資源,讓程序在同一時(shí)刻只能一個(gè)程序擁有屏幕控制權(quán),這樣保證了不會(huì)交叉顯示。另外我用自己的輸入輸出代替了原有的scanf和printf,這樣使讀寫更安全可靠。同時(shí)改進(jìn)的還有等待機(jī)制,

4、在服務(wù)器啟動(dòng)之后立即監(jiān)聽本機(jī)6000端口,建立連接之后直接開辟線程等待輸入。而客戶端啟動(dòng)時(shí)要輸入目的機(jī)的ip地址,連接完成時(shí)打印歡迎信息并開始進(jìn)入聊天。聊天結(jié)束(斷開)之后可以重新輸入目的機(jī)器ip地址以建立新連接。五、調(diào)用順序圖RecvTClosePrintS-Send_±ZZ_T六、源代碼1、共有文件soc.h(調(diào)試用文件)#include<time.h>voidgetime(char*s_tim)time_trawtime;structtm*timeinfo;time(&rawtime);timeinfo=localtime(&rawtime);spr

5、intf(s_tim,"%02d:%02d:%02d",timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);return;2、服務(wù)端server.cpp#include<stdio.h>#include<Winsock2.h>#include<windows.h>#include<conio.h>#include"socs.h"#pragmacomment(lib,"ws2_32.lib")DWORDWINAPIgo

6、tsListen(LPVOID);DWORDWINAPIsetsListen(LPVOID);voidgeta(char*s);voidputa(char*,int);voidgetime(char*);CRITICAL_SECTIONg_cs;CRITICAL_SECTIONt_cs;charbufer1000;intbuflen;boollinked;voidmain(void)HANDLEgotHandle;HANDLEsetHandle;WORDwVerR;WSADATAwsD;wVerR=MAKEWORD(1,1);if(WSAStartup(wVerR,&wsD)retur

7、n;if(LOBYTE(wsD.wVersion)!=1|HIBYTE(wsD.wVersion)!=1)WSACleanup();return;SOCKETscSr=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_INadrSr;adrSr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);adrSr.sin_family=AF_INET;adrSr.sin_port=htons(6000);bind(scSr,(SOCKADDR*)&adrSr,sizeof(SOCKADDR);listen(scSr,5);SOCKADDR

8、_INadrCl;intlen=sizeof(SOCKADDR);while(true)printf("bind%dsuccess!n",6000);SOCKETscCon=accept(scSr,(SOCKADDR*)&adrCl,&len);chars_adr100;strcpy(s_adr,inet_ntoa(adrCl.sin_addr);linked=true;printf("link%sbecreated!n",s_adr);InitializeCriticalSection(&t_cs);gotHandle=Crea

9、teThread(NULL,0,&gotsListen,&scCon,0,NULL);setHandle=CreateThread(NULL,0,&setsListen,&scCon,0,NULL);while(linked)Sleep(10);TerminateThread(setHandle,NULL);CloseHandle(gotHandle);CloseHandle(setHandle);DeleteCriticalSection(&t_cs);closesocket(scCon);printf("nlink%sclosed!n&qu

10、ot;,s_adr);closesocket(scSr);return;DWORDWINAPIgotsListen(LPVOIDlpParam)chargots1000;while(linked)/EnterCriticalSection(&g_cs);if(recv(*(SOCKET*)lpParam,gots,1000,0)=-1)break;/LeaveCriticalSection(&g_cs);puta(gots,1);linked=false;return0;DWORDWINAPIsetsListen(LPVOIDlpParam)while(linked)geta(

11、bufer);/EnterCriticalSection(&g_cs);send(*(SOCKET*)lpParam,bufer,strlen(bufer)+1,0);/LeaveCriticalSection(&g_cs);puta(bufer,0);ExitThread(NULL);return0;voidputa(char*s,intsta)inti=1;chars_tim16;getime(s_tim);switch(sta)case0:EnterCriticalSection(&t_cs);while(i-)printf("bb");pri

12、ntf("local%sn%sn",s_tim,s);LeaveCriticalSection(&t_cs);break;case1:EnterCriticalSection(&t_cs);i+=buflen;while(i-)printf("bb");printf("NET%sn%sn",s_tim,s);printf(">%s",bufer);LeaveCriticalSection(&t_cs);break;voidgeta(char*s)charc;EnterCriticalS

13、ection(&t_cs);printf(">");buferbuflen=0='0'LeaveCriticalSection(&t_cs);while(c=getch()if(c>31&&c<127)EnterCriticalSection(&t_cs);sbuflen+=c;sbuflen='0'printf("%c",c);LeaveCriticalSection(&t_cs);elseswitch(c)case13:EnterCriticalSect

14、ion(&t_cs);while(buflen-)printf("bb");LeaveCriticalSection(&t_cs);return;case8:EnterCriticalSection(&t_cs);if(buflen)buflen-;printf("bb");sbuflen='0'LeaveCriticalSection(&t_cs);break;3、客戶端client.cpp#include<stdio.h>#include<Winsock2.h>#include&

15、lt;windows.h>#include<conio.h>#include"socs.h"#pragmacomment(lib,"ws2_32.lib")DWORDWINAPIgotsListen(LPVOID);DWORDWINAPIsetsListen(LPVOID);voidgeta(char*);voidputa(char*,int);voidgetime(char*);CRITICAL_SECTIONt_cs;charbufer1000;intbuflen;boollinked;voidmain(void)HANDLEgot

16、Handle;HANDLEsetHandle;chars_adr10;WSADATAwsD;if(WSAStartup(MAKEWORD(1,1),&wsD)return;if(wsD.wVersion!=MAKEWORD(1,1)WSACleanup();return;SOCKETscSr=socket(AF_INET,SOCK_STREAM,0);while(true)printf("ReadytoConnect:");scanf("%s",s_adr);SOCKADDR_INadrSr;adrSr.sin_addr.S_un.S_addr=

17、inet_addr(s_adr);adrSr.sin_family=AF_INET;adrSr.sin_port=htons(6000);linked=!connect(scSr,(SOCKADDR*)&adrSr,sizeof(SOCKADDR);if(linked)printf("link%screatedsuccess!n",s_adr);InitializeCriticalSection(&t_cs);gotHandle=CreateThread(NULL,0,&gotsListen,&scSr,0,NULL);setHandle=C

18、reateThread(NULL,0,&setsListen,&scSr,0,NULL);while(linked)Sleep(10);TerminateThread(setHandle,NULL);TerminateThread(gotHandle,NULL);CloseHandle(gotHandle);CloseHandle(setHandle);DeleteCriticalSection(&t_cs);elseprintf("Failedtoconnect%s,checkitandtryagain!n",s_adr);closesocket(

19、scSr);printf("nlink%sbeclosed!n",s_adr);return;DWORDWINAPIgotsListen(LPVOIDIpParam)chargots10000;while(linked)/puts("running");/EnterCriticalSection(&g_cs);if(recv(*(SOCKET*)lpParam,gots,1000,0)=-1)break;/LeaveCriticalSection(&g_cs);puta(gots,1);linked=false;ExitThread(NU

20、LL);return0;DWORDWINAPIsetsListen(LPVOIDlpParam)while(linked)geta(bufer);/EnterCriticalSection(&g_cs);send(*(SOCKET*)lpParam,bufer,strlen(bufer)+1,0);/LeaveCriticalSection(&g_cs);puta(bufer,0);ExitThread(NULL);return0;voidputa(char*s,intsta)inti=2;chars_tim16;getime(s_tim);switch(sta)case0:E

21、nterCriticalSection(&t_cs);while(i-)printf("bb");printf("local%sn%sn",s_tim,s);LeaveCriticalSection(&t_cs);break;case1:EnterCriticalSection(&t_cs);i+=buflen;while(i-)printf("bb");printf("NET%sn%sn",s_tim,s);printf(">%s",bufer);LeaveCri

22、ticalSection(&t_cs);break;;voidgeta(char*s)charc;EnterCriticalSection(&t_cs);printf(">");buferbuflen=0='0'LeaveCriticalSection(&t_cs);while(c=getch()if(c>31&&c<127)EnterCriticalSection(&t_cs);sbuflen+=c;sbuflen='0'printf("%c",c);Le

23、aveCriticalSection(&t_cs);elseswitch(c)case13:EnterCriticalSection(&t_cs);while(buflen-)printf("bb");LeaveCriticalSection(&t_cs);return;case8:EnterCriticalSection(&t_cs);if(buflen)buflen-;printf("bb");sbuflen='0'LeaveCriticalSection(&t_cs);break;七、調(diào)試運(yùn)行

24、本實(shí)例在同一ip和不同分別做了測試,運(yùn)行狀況達(dá)到了預(yù)期的效果,F面是相關(guān)的幾張運(yùn)行截圖:服務(wù)器以及客戶端啟動(dòng)的畫面建立連接之后提示信息以及命令提示符pi_ntiE&00Blsuccess?llxnkC127.8.8,lbecheated?6D:kDebug:Client_eseReadytoConn&ct0_0_1llnkLI27.0.0.11createdsuccess!客戶端向服務(wù)器發(fā)送信息g'D;DebuffScEver_cxeblndEBBQBsuccess*ltnkC127.R.0.11becreated!NET10:12:10hello*nicetomeet

25、you?ciDzM>ebusClient.oeReadytoConnect:127.0.1linktl27.0.Q.lJereatedsuccess!local305:12:10hello*nicetomeetpou*卜面來做一系列的測試查看程序防交叉輸出的功能:1、連接之后服務(wù)端在寫一些內(nèi)容匚九1>:DebugServer-cxehind60001successFLinkElS?.B.0.11becreatedTNET105;12:10hello?rticetoneetyou!>dopouknouJuck?Heissohad*and2、客戶端發(fā)送了一條消息,服務(wù)端將消息插入,并繼續(xù)等待輸入端輸入c:;D-XDebuEAServer.ezepind6000success!link127»0.n.UfeecreatedfHET05:12:10|liellofnice七口meetHEU95=22=10IloveJuckverynuchldoyouJinvvJic?>doyou

溫馨提示

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

評(píng)論

0/150

提交評(píng)論