北科大小學期軟件課程設計報告_第1頁
北科大小學期軟件課程設計報告_第2頁
北科大小學期軟件課程設計報告_第3頁
北科大小學期軟件課程設計報告_第4頁
北科大小學期軟件課程設計報告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、北京科技大學軟件課程設計報告C語言 班級: 姓名: 學號: 指導教師: 日期: 目 錄1設計內(nèi)容32應用程序總體分析與設計43應用程序各功能模塊分析與設計43.1功能模塊43.1.1服務器端43.1.2客戶端43.2模塊流程圖43.2.1服務器端流程圖43.2.2客戶端流程圖53.3程序結(jié)構(gòu)圖74程序測試84.1測試過程84.1.1VS2010截圖84.2測試結(jié)果84.2.1服務器端截圖94.2.2客戶器端截圖95程序文檔95.1使用說明105.2程序說明106程序源代碼116.1客戶端:116.2服務器端151設計內(nèi)容 通過c語言編程實現(xiàn)一個局域網(wǎng)聊天的程序,包括服務器端程序和客戶端的程序,

2、該程序能夠?qū)崿F(xiàn)兩臺主機之間或多臺主機之間的基本通信。2應用程序總體分析與設計該程序包括兩個部分,一個是服務器端,另一個是客戶端。由于程序要實現(xiàn)兩臺或多臺主機之間的相互通信,這就涉及到了利用c語言進行網(wǎng)絡編程。還有兩臺或者多臺主機之間的網(wǎng)絡通信需要用到通信協(xié)議,而TCP/IP有兩種不同的通信協(xié)議,即面向有連接的TCP 通信協(xié)議和面向無連接的UDP通信協(xié)議。教學要求掌握TCP通信的原理。所以選擇TCP通信協(xié)議進行多臺主機之間的連接。服務器端的實現(xiàn)過程:1、初始化Windows Socket 2、創(chuàng)建一個監(jiān)聽的Socket 3、設置服務器地址信息,并將監(jiān)聽端口綁定到這個地址上 4、開始監(jiān)聽 5、接受

3、客戶端連接 6、和客戶端通信 7、結(jié)束服務并清理Windows Socket和相關數(shù)據(jù),或者返回第4步客戶端實現(xiàn)的過程:1、 加載套接字庫2、 創(chuàng)建套接字3、 請求連接服務器4、 發(fā)送數(shù)據(jù)/接收數(shù)據(jù)5、 關閉套接字6、 卸載所加載的套接字庫。3應用程序各功能模塊分析與設計3.1功能模塊 本程序由兩大部分組成,包括服務器端和客戶端。服務器端包含的模塊有初始模塊、循環(huán)控制模塊和服務模塊;客戶端包含的模塊有初始化模塊、功能控制模塊和數(shù)據(jù)傳輸控制模塊。3.1.1服務器端(1)初始化模塊用于初始化各個全局變量賦初始值。初始化Winsock,加載Winsock庫。(2)功能模塊控制。該模塊為其他模塊提供調(diào)

4、用的函數(shù),包括參數(shù)獲取功能和錯誤輸出功能 。(3)服務模塊。該模塊為客戶端提供服務功能,包括接收來自客戶端的數(shù)據(jù),并發(fā)送數(shù)據(jù)到客戶端。 3.1.2客戶端(1)初始化模塊。該模塊用于初始化客戶端的Winsock,加載Winsock庫。(2)功能模塊控制。與服務器端一樣,該模塊提供了參數(shù)獲取和錯誤輸出功能。(3)數(shù)據(jù)傳輸控制模塊。該模塊控制著整個客戶端的數(shù)據(jù)傳輸,包括數(shù)據(jù)發(fā)送和接收等。3.2模塊流程圖 3.2.1服務器端流程圖服務器端系統(tǒng)流程圖所示。程序首先調(diào)用為庫文件wsock32.lib使用所需資源。程序首先調(diào)用函數(shù)獲取用戶提供的先項,如果沒有提供選項,則直接使用默認值,如果有選項提供并成功獲

5、?。ㄟx項錯誤則顯示用戶幫助并終止程序),則初始化變量和Winsock,并創(chuàng)建TCP流套接字;然后解析主機名(如果選項提供的是IP地址 ,或者使用是默認值)或者IP地址(如果選項提供的是主機名),解析成功后則設置服務器地址的各個參數(shù),包括地址、IP地址和端口號;接下來將創(chuàng)建的TCP流套接字和設定的服務器地址綁定(調(diào)用bind()函數(shù));綁定成功后,則開始用listen()函數(shù)偵聽客戶的連接。接收客戶端請求成功后,進行接收數(shù)據(jù)、發(fā)送數(shù)據(jù)等操作。接收數(shù)據(jù)完畢后,關閉窗口完成通信。否開始獲取參數(shù)獲取成功初始化變量和Winsock 創(chuàng)建套接字是否偵聽成功綁定成功解析成功創(chuàng)建成功解析主機名或者IP地址釋放

6、資源關閉服務綁定地址與接字 偵聽連接 循環(huán)控制設置服務器地址參數(shù)輸出相應錯誤信息結(jié)束是是是是否否否 結(jié)束3.2.2客戶端流程圖 客戶端系統(tǒng)流程如圖所示??蛻舳顺绦驁?zhí)行時調(diào)用庫函數(shù)獲取用戶選項,如果獲取的選項錯誤,則終止程序,如果選項正確則開始創(chuàng)建TCP流套接字,成功創(chuàng)建TCP流套接字后則作和服務器類似的操作,即解析主機名或IP地址、設置服務器端地址;然后進行連接服務器操作,若能成功連接則輸出連接信息,并發(fā)送消息到服務器端;然后接收來自服務器端的響應,(消息),并將接收到的消息輸出。最后關閉套接字和釋放占用的資源。和服務器一樣,在操作過程中,任何一步操作失敗都將退出程序,并提示錯誤信息。否結(jié)束輸

7、出相應錯誤信息連接成功釋 放 資 源 關閉 套 接 字連 接服務器輸出連接信息發(fā)送 信息 到服 務 器 端接收服務器端的響應開 始調(diào)用參數(shù)創(chuàng)建成功獲取成功解析成功解析主機名或者IP地址創(chuàng) 建 套 接 字獲 取 參 數(shù)設置服務器地址參數(shù)調(diào)用 錯誤 是否是是否是否是否3.3程序結(jié)構(gòu)圖TCP程序設計 服務器端 客戶端初始化模塊功能控制模塊服務模塊初始化模塊功能控制模塊數(shù)據(jù)傳輸控制模塊4程序測試4.1測試過程4.1.1VS2010截圖 4.2測試結(jié)果4.2.1服務器端截圖4.2.2客戶器端截圖5程序文檔5.1使用說明程序能實現(xiàn)兩臺主機或多臺主機間的基本通信。運行環(huán)境Windows 7/XP,運行客戶端

8、.exe程序,與服務器端連接上后,即可進行相關數(shù)據(jù)傳輸。但是必須客戶端首先發(fā)送數(shù)據(jù),按Enter結(jié)束,數(shù)據(jù)即發(fā)送到服務器端,服務器端即可收到客戶端發(fā)送的信息。然后服務器端輸入需要發(fā)送的數(shù)據(jù),按Enter鍵發(fā)送,客戶端也可收到相應信息。5.2程序說明本程序由兩大部分組成,包括服務器端和客戶端。服務器端包含的模塊有初始模塊、循環(huán)控制模塊和服務模塊;客戶端包含的模塊有初始化模塊、功能控制模塊和數(shù)據(jù)傳輸控制模塊。 服務器端: (1)初始化模塊用于初始化各個全局變量賦初始值。初始化Winsock,加載Winsock庫。 (2)功能模塊控制。該模塊為其他模塊提供調(diào)用的函數(shù),包括參數(shù)獲取功能和錯誤輸出功能

9、。 (3)服務模塊。該模塊為客戶端提供服務功能,包括接收來自客戶端的數(shù)據(jù),并發(fā)送數(shù)據(jù)到客戶端。 客戶端: (1)初始化模塊。該模塊用于初始化客戶端的Winsock,加載Winsock庫。 (2)功能模塊控制。與服務器端一樣,該模塊提供了參數(shù)獲取和錯誤輸出功能。(3)數(shù)據(jù)傳輸控制模塊。該模塊控制著整個客戶端的數(shù)據(jù)傳輸,包括數(shù)據(jù)發(fā)送和接收等。程序中主要變量含義:err:錯誤,lenfrom:接收的字符長度,addSrv.sin_addr.s_addr: IP地址,ddrSrv.sin_family:使用的IP地址族,addrSrv_port:端口號。數(shù)據(jù)結(jié)構(gòu):運用結(jié)構(gòu)體,用于保存IP地址和端口信息

10、,存儲Winsock的最新版本號。運用數(shù)組,用于存儲輸入的字符數(shù)。 下面是關于頭文件的說明。 #include <stdio.h>:在使用標準函數(shù)庫中的輸入輸出函數(shù)時,編譯系統(tǒng)要求程序提供有關的信息(例如對這些輸入輸出函數(shù)的聲明),#include<stdio.h>的作用就是用來提供這些信息的,stdio.h是C編譯系統(tǒng)提供的一個文件名,stdio是“standard input & output”的縮寫,即有關標準輸入輸出的信息。在程序中用到系統(tǒng)提供的標準函數(shù)庫中的輸入輸出函數(shù)時,應在程序的開頭寫上一行:#include"stdio.h"或

11、者是#include<stdio.h>,這樣才能調(diào)用庫函數(shù)。 #include <Winsock2.h>:Winsock是開放的Windows網(wǎng)絡編程基礎,應用程序通過Winsock的API實現(xiàn)相互之間的通信,而Winsock利用下層的網(wǎng)絡通信協(xié)議和操作系統(tǒng)調(diào)用實現(xiàn)實際的通信工作。 #pragma comment(lib,"ws2_32.lib"):這句話的前面意思是靜態(tài)加入一個lib庫文件,ws2_32.lib文件,提供了對以下網(wǎng)絡相關API的支持,若使用其中的API,則應該將ws2_32.lib加入工程(否則需要動態(tài)載入ws2_32.dll)。這

12、句話一般出現(xiàn)在網(wǎng)絡編程中,需要使用網(wǎng)絡API函數(shù)的時候,就必須使用這條語句加載ws2_32.lib庫或者動態(tài)載入ws2_32.dll。6程序源代碼6.1服務器端:#include <Winsock2.h>#include<stdio.h>#pragma comment(lib,"Ws2_32.lib")void main() WORD wVersionRequested; WSADATA wsaData;SOCKET sockS;SOCKET sockU;struct sockaddr_in addrS;int i;int bytesRecv;int

13、 bytesSent;char sendBuf100;char recvBuf100; wVersionRequested = MAKEWORD(2, 2); if (WSAStartup(wVersionRequested, &wsaData)!= 0) printf("Winsock初始化錯誤: %dn"); return ; if (LOBYTE(wsaData.wVersion) != 2 | HIBYTE(wsaData.wVersion) !=2) printf("Winsock版本號不匹配n"); WSACleanup(); /卸載

14、調(diào)用函數(shù)所加載的庫 return ; sockS=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);addrS.sin_addr.s_addr=inet_addr("127.0.0.1");addrS.sin_family=AF_INET;addrS.sin_port=htons(5000);if(bind(sockS,(LPSOCKADDR)&addrS, sizeof(addrS)=SOCKET_ERROR)printf("指定本地地址發(fā)生錯誤%d",WSAGetLastError();closesocket(s

15、ockS);return;if(listen(sockS,1)=SOCKET_ERROR)/使服務器進入監(jiān)聽狀態(tài)printf("進入監(jiān)聽狀態(tài)發(fā)生錯誤%s",WSAGetLastError(); /如果發(fā)生錯誤則打印錯誤狀態(tài)closesocket(sockS);return;printf("等待客戶端的連接.n");while(1)/等待客戶端的連接 sockU=SOCKET_ERROR;while(sockU=SOCKET_ERROR)sockU=accept(sockS,NULL,NULL);sockS=sockU;break;while(1)for(

16、i=0;i<100;i+)recvBufi=NULL;do bytesRecv=recv(sockS,recvBuf,100,0);if(bytesRecv=0|bytesRecv=WSAENETRESET)continue;if(bytesRecv<0) return;while(bytesRecv=SOCKET_ERROR);printf("客戶端:n");printf("%sn",recvBuf);printf("服務器:n");gets(sendBuf);bytesSent=send(sockS,sendBuf,s

17、trlen(sendBuf),0);/發(fā)送數(shù)據(jù)return;6.2客戶端:#include <stdio.h>#include <Winsock2.h>#pragma comment(lib,"ws2_32.lib")void main()SOCKET sockU;int port=5000;int bytesSent;int i;int bytesRecv;char sendbuf100;char recvbuf100;struct sockaddr_in sockU_tcpaddr; WORD wVersionRequested;WSADATA

18、wsaData;wVersionRequested=MAKEWORD(2,2); if(WSAStartup(wVersionRequested,&wsaData)!=0)printf("%s","套接口錯誤");return ;if(wsaData.wVersion!=wVersionRequested)/wsaData.wVersion用于儲存返回的版本號/Winsock版本號不匹配WSACleanup();printf("%s","Winsock版本號不匹配");return;sockU=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sockU=INVALID_SOCKET) printf("錯誤的代碼是:%d",WSAGetLastError();WSACleanup();return;sockU_tcpaddr.sin_family=AF_INET;sockU_tcpaddr.sin_port=htons(port);sockU_tcpaddr.sin_addr.s_a

溫馨提示

  • 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

提交評論