版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
課程設(shè)計報告2014—2015學年第一學期課程名稱計算機網(wǎng)絡(luò)設(shè)計題目利用Winsock實現(xiàn)雙機通信TOC\o"1-2"\h\u2555一、摘要 27362二、目的和要求 222665三、開發(fā)環(huán)境簡介 213203(一)、VisualC++6.0簡介 230536(二)、VisualC++6.0主要組成 228129四、TCP/IP簡介 317500(一)、TCP/IP簡介 321453(二)、TCP作用 426563五、WinSock簡介 413361(一)、什么是socket 42147(二)、WinSocket的通信原理 510253(三)、基本套接字 523101六、設(shè)計方案 77764(一)、WinSocket通信的步驟: 722411七、程序代碼 96945(一)、服務(wù)器端代碼 917309(二)、客戶端代碼 1128064八、運行結(jié)果 1319875九、課程設(shè)計的總結(jié)體會 1331275十、參考文獻 14利用socket實現(xiàn)雙機通信摘要Socket通信機制提供了兩種通信方式:有連接(TCP)和無連接方式(UDP),分別面線不同的應(yīng)用需求。使用有連接方式時,通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須必須創(chuàng)建一個聯(lián)接過程并建立一條通信鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一對進程之間進行,通信完畢關(guān)閉此聯(lián)接過程。使用無連接方式時其系統(tǒng)開銷比有連接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報服務(wù),不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達信宿。在該方式下,通信雙方不必創(chuàng)建一個聯(lián)接過程和建立一條通信鏈路,網(wǎng)絡(luò)通信操作在不同的主機和進程之間轉(zhuǎn)發(fā)進行。關(guān)鍵字:Winsock、TCP、VC++、雙機通信目的和要求利用WinSock來實現(xiàn)雙機通信,理解TCP狀態(tài)機圖。要求使用WinSock編程,采用其中的TCP面向連接方式,實現(xiàn)文本數(shù)據(jù)的交換。開發(fā)環(huán)境簡介(一)、VisualC++6.0簡介VisualC++6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將“高級語言”翻譯為“機器語言(低級語言)”的程序。VisualC++是一個功能強大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出VisualC++1.0后,隨著其新版本的不斷問世,VisualC++已成為專業(yè)程序員進行軟件開發(fā)的首選工具。雖然微軟公司推出了VisualC++.NET(VisualC++7.0),但它的應(yīng)用的很大的局限性,只適用于Windows2000、WindowsXP和WindowsNT4.0。所以實際中,更多的是以VisualC++6.0為平臺。VisualC++6.0不僅是一個C++編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrateddevelopmentenvironment,IDE)。VisualC++6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lassWizard等開發(fā)工具。這些組件通過一個名為DeveloperStudio的組件集成為和諧的開發(fā)環(huán)境。(二)、VisualC++6.0主要組成DeveloperStudio,這是一個集成開發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標題赫然寫著“MicrosoftVisualC++”,所以很多人理所當然的認為,那就是VisualC++了。其實不然,雖然DeveloperStudio提供了一個很好的編輯器和很多Wizard,但實際上它沒有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會介紹。我們也知道,DeveloperStudio并不是專門用于VC的,它也同樣用于VB,VJ,VID等VisualStudio家族的其他同胞兄弟。所以不要把DeveloperStudio當成VisualC++,它充其量只是VisualC++的一個殼子而已。這一點請切記!MFC。從理論上來講,MFC也不是專用于VisualC++,BorlandC++,C++Builder和SymantecC++同樣可以處理MFC。同時,用VisualC++編寫代碼也并不意味著一定要用MFC,只要愿意,用VisualC++來編寫SDK程序,或者使用STL,ATL,一樣沒有限制。不過,VisualC++本來就是為MFC打造的,VisualC++中的許多特征和語言擴展也是為MFC而設(shè)計的,所以用VisualC++而不用MFC就等于拋棄了VisualC++中很大的一部分功能。但是,VisualC++也不等于MFC。PlatformSDK。這才是VisualC++和整個VisualStudio的精華和靈魂,雖然我們很少能直接接觸到它。大致說來,PlatformSDK是以MicrosoftC/C++編譯器為核心(不是VisualC++,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說到DeveloperStudio沒有編譯程序的功能,那么這項工作是由誰來完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成VisualStudio的基石。TCP/IP簡介(一)、TCP/IP簡介TCP/IP(TransmissionControlProtocol/InternetProtocol)的簡寫,中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個協(xié)議是Internet最基本的協(xié)議、Internet國際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),簡單地說,就是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。TCP(TransmissionControlProtocol)中文稱為“傳輸控制協(xié)議”。TCP是一種面向連接的、可靠的、基于字節(jié)流的運輸層(Transportlayer)通信協(xié)議。在簡化的計算機網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能(UDP)是同一層內(nèi)另一個重要的傳輸協(xié)議。IP是英文InternetProtocol的縮寫,中文稱為“網(wǎng)際協(xié)議”,是為計算機網(wǎng)絡(luò)相互連接進行通信而設(shè)計的協(xié)議。在因特網(wǎng)中,它是能使連接到網(wǎng)上的所有計算機網(wǎng)絡(luò)實現(xiàn)相互通信的一套規(guī)則,規(guī)定了計算機在因特網(wǎng)上進行通信時應(yīng)當遵守的規(guī)則。任何廠家生產(chǎn)的計算機系統(tǒng),只要遵守,IP協(xié)議就可以與因特網(wǎng)互連互通。、TCP作用在因特網(wǎng)協(xié)議族中,TCP層是位于IP層之上,應(yīng)用層之下的中間層。提供可靠的、像管道一樣的連接。應(yīng)用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)?、?位字節(jié)表示的數(shù)據(jù)流,然后TCP把數(shù)據(jù)流分割成適當長度的報文段,通常受該計算機連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳送單元(MTU)的限制。之后TCP把結(jié)果包傳給IP層,由它來通過網(wǎng)絡(luò)將包傳送給接收端實體的TCP層。TCP為了保證不發(fā)生丟包,就給每個字節(jié)一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的字節(jié)發(fā)回一個相應(yīng)的確認(ACK),如果發(fā)送端實體在合理的往返時延(RTT)內(nèi)未收到確認,那么對應(yīng)的數(shù)據(jù),假設(shè)丟失了,將會被重傳。TCP用一個校驗和函數(shù)來檢驗數(shù)據(jù)是否有錯誤,在發(fā)送和接收時都要計算校驗和。首先,TCP建立連接之后,通信雙方都同時可以進行數(shù)據(jù)的傳輸。其次,TCP通信是全雙工的,在保證可靠性上,采用超時重傳和捎帶確認機制。在流量控制上,采用滑動窗口協(xié)議,協(xié)議中規(guī)定,對于窗口內(nèi)未經(jīng)確認的分組需要重傳。在擁塞控制上,采用慢啟動算法。TCP所提供服務(wù)的主要特點有:1、面向連接的傳輸;2、端到端的通信;3、高可靠性、確保傳輸數(shù)據(jù)的正確性,不出現(xiàn)丟失或亂序;4、全雙工方式傳輸;5、采用字節(jié)流方式,即以字節(jié)為單位傳輸字節(jié)序列;6、緊急數(shù)據(jù)傳送功能。五、WinSock簡介(一)、什么是socket所謂socket通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄。應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。要學Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口。Socket接口設(shè)計者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似于打開文件的函數(shù)調(diào)用Socket(),該函數(shù)返回一個整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實現(xiàn)的。常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報式Socket是一種無連接的Socket,對應(yīng)于無連接的UDP服務(wù)應(yīng)用。最重要的是,socket是面向客戶/服務(wù)器模型而設(shè)計的,針對客戶和服務(wù)器程序提供不同的socket系統(tǒng)調(diào)用。客戶隨機申請一個socket(相當于一個想打電話的人可以在任何一臺入網(wǎng)電話上撥號呼叫),系統(tǒng)為之分配一個socket號;服務(wù)器擁有全局公認的socket,任何客戶都可以向它發(fā)出連接請求和信息請求(相當于一個被呼叫的電話擁有一個呼叫方知道的電話號碼)。socket利用客戶/服務(wù)器模式巧妙地解決了進程之間建立通信連接的問題。服務(wù)器socket半相關(guān)為全局所公認非常重要。不妨考慮一下,兩個完全隨機的用戶進程之間如何建立通信?假如通信雙方?jīng)]有任何一方的socket固定,就好比打電話的雙方彼此不知道對方的電話號碼,要通話是不可能的。(二)、WinSocket的通信原理WinSock是一個基于Socket模型的API。WinSock在Windows98,WindowNT中使用。WinSock一般由兩部分組成:開發(fā)組件和運行組件。開發(fā)組件是供程序員在windows環(huán)境下開發(fā)網(wǎng)絡(luò)應(yīng)用程序使用的,它包括應(yīng)用程序接口庫函數(shù)、頭文件和實現(xiàn)的文檔,其中最主要的是WINSOCK.H運行組件是以動態(tài)鏈接庫(DlL)來實現(xiàn)socket接口的。文件名為WINSOCK.DLL應(yīng)用程序在執(zhí)行時裝入它就能實現(xiàn)網(wǎng)絡(luò)通信功能、基本套接字1、創(chuàng)建套接字——socket()
功能:使用前創(chuàng)建一個新的套接字
格式:SOCKETPASCALFARsocket(intaf,inttype,intprocotol);
參數(shù):af:通信發(fā)生的區(qū)域
type:要建立的套接字類型
procotol:使用的特定協(xié)議
2、指定本地地址——bind()
功能:將套接字地址與所創(chuàng)建的套接字號聯(lián)系起來。
格式:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);
參數(shù):s:是由socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號)。
其它:沒有錯誤,bind()返回0,否則SOCKET_ERROR
地址結(jié)構(gòu)說明:
structsockaddr_in
{
shortsin_family;//AF_INET
u_shortsin_port;//16位端口號,網(wǎng)絡(luò)字節(jié)順序
structin_addrsin_addr;//32位IP地址,網(wǎng)絡(luò)字節(jié)順序
charsin_zero[8];//保留
}
3、建立套接字連接——connect()和accept()
功能:共同完成連接工作
格式:intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);
SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*name,intFAR*addrlen);
參數(shù):同上
4、監(jiān)聽連接——listen()
功能:用于面向連接服務(wù)器,表明它愿意接收連接。
格式:intPASCALFARlisten(SOCKETs,intbacklog);
5、數(shù)據(jù)傳輸——send()與recv()
功能:數(shù)據(jù)的發(fā)送與接收
格式:intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);
intPASCALFARrecv(SOCKETs,constcharFAR*buf,intlen,intflags);
參數(shù):buf:指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。6、多路復(fù)用——select()
功能:用來檢測一個或多個套接字狀態(tài)。
格式:intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);
參數(shù):readfds:指向要做讀檢測的指針
writefds:指向要做寫檢測的指針
exceptfds:指向要檢測是否出錯的指針
timeout:最大等待時間7、關(guān)閉套接字——closesocket()
功能:關(guān)閉套接字s
格式:BOOLPASCALFARclosesocket(SOCKETs);六、設(shè)計方案(一)、WinSocket通信的步驟:1、在服務(wù)器端的應(yīng)用程序中的網(wǎng)絡(luò)通信的步驟如下:(1)建立服務(wù)器端的Socket,開始偵聽整個網(wǎng)絡(luò)中的連接請求。(2)當檢測到來自客戶端的連接請求時,向客戶端發(fā)送收到連接請求的信息,并建立與客戶端之間的連接,再繼續(xù)進入監(jiān)聽狀態(tài)。(3)在監(jiān)聽的過程中,如果有用戶發(fā)出了請求,則服務(wù)器會產(chǎn)生一個新的連接Socket來處理用戶的請求,而原來的Socket仍然會進行監(jiān)聽操作。(4)當完成通信后,服務(wù)器關(guān)閉與客戶端的Socket連接。2、在客戶端應(yīng)用程序中的網(wǎng)絡(luò)通信的步驟如下:(1)建立一個客戶端的Socket。(2)從命令行中得到服務(wù)器的名字,并進行查詢以得到服務(wù)器的IP地址;(3)從命令行中得到服務(wù)器所提供的端口號,以便進行下一步的操作;(4)發(fā)送連接請求到服務(wù)器,并等待服務(wù)器的回饋信息。(5)連接成功后,與服務(wù)器進行數(shù)據(jù)的交互。(6)數(shù)據(jù)處理完畢后,關(guān)閉自身的Socket連接,釋放進行連接所分配的資源,客戶端的程序運行完畢。(二)、系統(tǒng)實現(xiàn)的過程圖七、程序代碼(一)、服務(wù)器端代碼#include<stdio.h>#include<winsock2.h>#pragmacomment(lib,"ws2_32.lib")intmain(){WSADATAwsaData; WSAStartup(MAKEWORD(2,2),&wsaData);//創(chuàng)建套接字SOCKETListen_sk;Listen_sk=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(Listen_sk==INVALID_SOCKET){printf("Failedsocket!\n");return0;}//填充sockaddr_in結(jié)構(gòu)sockaddr_insin;sin.sin_family=AF_INET;sin.sin_port=htons(4567);sin.sin_addr.S_un.S_addr=INADDR_ANY;//綁定這個套接字到一個本地地址if(bind(Listen_sk,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR){printf("Failedbind!\n");return0;}//進入監(jiān)聽模式if(listen(Listen_sk,2)==SOCKET_ERROR){printf("Failedlisten!\n");return0;}//循環(huán)接受客戶的連接請求sockaddr_inremoteAddr;intnAddrLen=sizeof(remoteAddr); SOCKETConnect_sk=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);while(true){//接受新連接Connect_sk=accept(Listen_sk,(sockaddr*)&remoteAddr,&nAddrLen);if(Connect_sk==INVALID_SOCKET){printf("Failedaccept!");continue;}printf("接受到一個連接:%s\r\n",inet_ntoa(remoteAddr.sin_addr)); //接收數(shù)據(jù) charbuff[500]; intnRecv=recv(Connect_sk,buff,strlen(buff),0); if(nRecv>0) { printf("接收到數(shù)據(jù):"); for(inti=0;i<nRecv;i++) { printf("%c",buff[i]); } printf("\n"); }closesocket(Connect_sk);}//關(guān)閉監(jiān)聽套接字closesocket(Listen_sk); WSACleanup();return0;}、客戶端代碼#include<stdio.h>#include<winsock2.h>#pragmacomment(lib,"ws2_32")intmain(void){ SOCKETs; WSADATAwsaData; WSAStartup(MAKEWORD(2,2),&wsaData); //創(chuàng)建套接字 s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(s==INVALID_SOCKET) { printf("創(chuàng)建套接字失??!\n"); return0; } //填寫遠程地址信息 sockaddr_inservAddr; servAddr.sin_family=AF_INET; servAddr.sin_port=htons(4567); servAddr.sin_addr.S_un.S_addr=inet_addr(""); if(connect(s,(sockaddr*)&servAddr,sizeof
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合并同類項解元次方程說課稿
- 電商項目規(guī)劃
- 美術(shù)館黃金屋租賃合同
- 休閑娛樂場所消火栓施工合同
- 會計師事務(wù)所出納人員聘用協(xié)議
- 老年大學教師勞動合同范本
- 羽絨制品維修工聘用合同模板
- 農(nóng)藥采購合同管理
- 電梯工程師招聘協(xié)議
- 房地產(chǎn)開發(fā)招標廉政責任
- JJG 707-2014扭矩扳子行業(yè)標準
- 2024醫(yī)保練兵理論知識考試題庫(濃縮500題)
- 三重一大培訓課件
- 【增加多場景】員工使用公司車輛協(xié)議
- 單孔腹腔鏡手術(shù)
- 2024年度2024行政復(fù)議法培訓
- 車輛托運合同
- 2023土的分散性判別試驗規(guī)程
- 牧原招聘測評試題
- 29.4常見腫瘤標志物講解
- 大學生職業(yè)生涯規(guī)劃環(huán)境設(shè)計 (模板)
評論
0/150
提交評論