




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)
實(shí)驗(yàn)指導(dǎo)書(shū)實(shí)驗(yàn)名稱(chēng) WindowsSocket編程電子信息與通信學(xué)院2018年制、實(shí)驗(yàn)?zāi)康?.掌握網(wǎng)絡(luò)應(yīng)用程序的開(kāi)發(fā)方法.掌握Client/Server結(jié)構(gòu)軟件的設(shè)計(jì)與開(kāi)發(fā)方法.掌握Socket機(jī)制的工作原理.掌握基于Client/Server結(jié)構(gòu)的WindowsSocketTCP/UDP程序設(shè)計(jì)方法實(shí)驗(yàn)背景實(shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用時(shí),要從網(wǎng)絡(luò)提供的接口開(kāi)始。由于大多數(shù)網(wǎng)絡(luò)協(xié)議都是由軟件實(shí)現(xiàn)的(特別是協(xié)議棧中的高層協(xié)議),而且?guī)缀跛械挠?jì)算機(jī)系統(tǒng)都將網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)作為操作系統(tǒng)的一部分,所以當(dāng)我們說(shuō)“網(wǎng)絡(luò)提供的”接口時(shí),一般指的是操作系統(tǒng)為它的網(wǎng)絡(luò)子系統(tǒng)提供的接口。這個(gè)接口通常稱(chēng)為網(wǎng)絡(luò)應(yīng)用程序編程接口(ApplicationProgrammingInterfrace,API)。雖然每個(gè)操作系統(tǒng)都可以自由地定義自己的網(wǎng)絡(luò)API(而且大多數(shù)已經(jīng)定義),但隨著時(shí)間的推移,有些API獲得了廣泛的支持,也就是說(shuō),它們被移植到除原始系統(tǒng)以外的操作系統(tǒng)中。套接字接口(socketinterface)就是這樣,它最初是由加州大學(xué)伯克利分校的Unix小組開(kāi)發(fā)的,而現(xiàn)在幾乎所有流行的操作系統(tǒng)都支持它,并且很多特定語(yǔ)言的接口都是以它為基礎(chǔ)的,如Java套接字庫(kù)。業(yè)界支持單一API的好處是應(yīng)用程序很容易從一個(gè)操作系統(tǒng)移植到另一個(gè)操作系統(tǒng),開(kāi)發(fā)者很容易編寫(xiě)用于多個(gè)操作系統(tǒng)的應(yīng)用。實(shí)驗(yàn)原理(一)Client/Server結(jié)構(gòu)在TCP/IP網(wǎng)絡(luò)環(huán)境下,不同主機(jī)上的兩個(gè)應(yīng)用程序間通信普遍采用客戶(hù)機(jī)-服務(wù)器模型(client/serverarchitecture,C/S).即通信雙方一方作為服務(wù)器等待客戶(hù)提出請(qǐng)求并予以響應(yīng),客戶(hù)則在需要服務(wù)時(shí)向服務(wù)器提出申請(qǐng)。服務(wù)器一般作為守護(hù)進(jìn)程始終運(yùn)行,監(jiān)聽(tīng)網(wǎng)絡(luò)接口,一旦有客戶(hù)請(qǐng)求,就啟動(dòng)一個(gè)服務(wù)進(jìn)程來(lái)響應(yīng)客戶(hù),同時(shí)自己繼續(xù)監(jiān)聽(tīng)服務(wù)端口,使后續(xù)客戶(hù)也能及時(shí)得到服務(wù)。采用這種模型主要是由于網(wǎng)絡(luò)中主機(jī)的軟硬件資源、運(yùn)算能力和信息分布不均勻?qū)е碌?,?dāng)需要信息共享時(shí),運(yùn)算能力強(qiáng)、擁有眾多資源的主機(jī)就作為服務(wù)器對(duì)外提供服務(wù),資源相對(duì)較少的主機(jī)就成為客戶(hù)機(jī)通過(guò)請(qǐng)求獲得所需資源。本編程訓(xùn)練的目的之一是通過(guò)編程了解客戶(hù)機(jī)-服務(wù)器結(jié)構(gòu)的網(wǎng)絡(luò)通信模型。(二)Windowssocket編程WindowsSockets是MicrosoftWindows的網(wǎng)絡(luò)程序設(shè)計(jì)接口,它是在BerkeleySockets的基礎(chǔ)上擴(kuò)展而來(lái)的,目前已成為Windows網(wǎng)絡(luò)編程事實(shí)上的標(biāo)準(zhǔn)。WindowsSockets實(shí)現(xiàn)包括開(kāi)發(fā)組件和運(yùn)行組件。開(kāi)發(fā)組件是供程序員開(kāi)發(fā)WindowsSockets應(yīng)用程序使用的,它包括介紹WindowsSockets實(shí)現(xiàn)的文檔、各種庫(kù)文件和一些頭文件。例如,對(duì)于使用WindowsSockets2.0版本的應(yīng)用程序,頭文件為Winsock2.h,庫(kù)文件為Ws2_32.lib。運(yùn)行組件是指實(shí)現(xiàn)了windowsSockets規(guī)范所描述的全部功能的一套軟件系統(tǒng),在Windows下實(shí)現(xiàn)這些功能是通過(guò)DLL來(lái)完成的。例如,WindowsSockets2.0版本的動(dòng)態(tài)鏈接庫(kù)文件為Ws2_32.dll,應(yīng)用程序在執(zhí)行時(shí)通過(guò)載入該動(dòng)態(tài)庫(kù)來(lái)實(shí)現(xiàn)所需的網(wǎng)絡(luò)通信功能。(三)面向連接的同步模式編程(TCP阻塞編程)服務(wù)器首先啟動(dòng),通過(guò)調(diào)用socket()建立一個(gè)套接口,然后bind()將該套接口和本地地址(IP地址和端口)綁定在一起,再listen()使得套接口做好偵聽(tīng)準(zhǔn)備,并規(guī)定它的請(qǐng)求隊(duì)列的長(zhǎng)度,之后就調(diào)用accept()來(lái)接收連接,并獲得客戶(hù)機(jī)的地址信息;客戶(hù)機(jī)在建立套接口之后就可以調(diào)用connect。和服務(wù)器建立連接;連接一旦建立,客戶(hù)機(jī)和服務(wù)器之間就可以通過(guò)調(diào)用send()和recv()來(lái)發(fā)送和接收數(shù)據(jù);最后,待數(shù)據(jù)傳送結(jié)束后,雙方調(diào)用closesocket()關(guān)閉套接口。繼鰥服務(wù).色臂材嶺,服務(wù)請(qǐng)求服務(wù)器W妾;連至委月鯉:連接請(qǐng)求客戶(hù)機(jī)socket。connect。:處理服務(wù)請(qǐng)求;; send()closesocketOaccept()close(socket)bind()J服務(wù)應(yīng)答「面露等而布t羹;send() 1 4JL 廠(chǎng)友施襄塞…:socket。listen()圖3-1面向連接的同步模式編程時(shí)序圖實(shí)驗(yàn)內(nèi)容(一)運(yùn)行simplex-talk例程,理解代碼并觀察現(xiàn)象Simplex-talk運(yùn)行程序示例:Client端Server端server.exe[simplex-talkserver]serverisreadyinlistening...client.exelocalhost[simplex-talkserver]receivedaconnectionfrom127.0.0.1:[simplex-talkclient]connectiontolocalhostisready[simplex-talkclient]pleaseinputyourmessage(emptyinputtohalt):Adfadf[simplex-talkclient]send7charstoserver[simplex-talkserver]received7charsadfadfa[simplex-talkclient]send2charstoserver[simplex-talkserver]received2charsa[simplex-talkclient]emptymessageissendtoserver[simplex-talkclient]connectionisterminated[simplex-talkserver]emptymessageisreceived[simplex-talkserver]connectionfrom127.0.0.1isterminated(二)修改simplex-talk程序,編制duplex-talk程序,支持client和server的雙向通信Duplex-talk程序運(yùn)行示例:Client端Server端server.exe[duplex-talk]serverisreadyinlistening...client.exelocalhost[duplex-talk]receivedaconnectionfrom127.0.0.1:[duplex-talk]connectiontolocalhostisready[duplex-talk]pleaseinputyourmessage(emptyinputtohalt)[duplex-talk]client:adfadf[duplex-talk]client:adfadf[duplex-talk]server:a[duplex-talk]server:a[duplex-talk]client:[duplex-talk]emptymessageissendtoserver[duplex-talk]connectionisterminated[duplex-talk]emptymessageisreceived[duplex-talk]connectionfrom127.0.0.1isterminated(三)利用windows時(shí)間函數(shù),編制一個(gè)簡(jiǎn)單的定時(shí)器,模擬client和server之間的stop-and-wait的動(dòng)作客戶(hù)端模仿sender,發(fā)送三個(gè)報(bào)文;服務(wù)器模擬receiver,回復(fù)ACK??蛻?hù)端和服務(wù)器分別維持各自的時(shí)鐘(例如5ms),如果超時(shí)就報(bào)錯(cuò)。試模擬下面的四種停止等待協(xié)議可能出現(xiàn)的情況。SenderReceiverSenderReceaverSenderReceiverSenderReceiverWindowssocket常用API介紹(一)Winsock的啟動(dòng)和終止---WSAStartup()和WSACleanup()由于Winsock服務(wù)是以動(dòng)態(tài)鏈接庫(kù)的形式實(shí)現(xiàn)的,所以在使用前必須調(diào)用WSAStartup函數(shù)對(duì)其進(jìn)行初始化,協(xié)商Winsock的版本支持,并分配必要的資源。WSAStartup函數(shù)聲明如下:intWSAStartup(WORDwVersionRequested,LPWSADATAIpWSAData);參數(shù)說(shuō)明:wVersionRequested:指定加載的Winsock版本,通常高位字節(jié)指定Winsock的副版本,低位字節(jié)指定Winsock的主版本,然后用MAKEWORD(X,Y)宏獲取該值。IpWSAData:WSADATA數(shù)據(jù)結(jié)構(gòu)指針,其中WSADATA結(jié)構(gòu)的定義如下:TypedefstructWSAData{WORDwVersion; //期望使用的Winsock版本W(wǎng)ORDwHighVersion; 〃返回現(xiàn)有Winsock最高版本charszDescription[WSADESCRIPTION_LEN+1];//套接字實(shí)現(xiàn)描述、charszSystemStatus[WSASYS_STATUS_LEN+1];//狀態(tài)或配置信息unsignedshortiMaxSockets;//最大套接字?jǐn)?shù)unsignedshortiMaxUdpDg;〃最大數(shù)據(jù)報(bào)長(zhǎng)度charFAR*IpVendorInfo; //保留}WSADATA,FAR*LPWSADATA;在應(yīng)用程序關(guān)閉套接字連接后,還需要調(diào)用WSACleanup函數(shù)終止對(duì)Winsock庫(kù)的使用,并釋放資源,函數(shù)聲明如下:intWSACleanup(void);(二)創(chuàng)建套接字---socket()調(diào)用socket創(chuàng)建一個(gè)流套接字,該函數(shù)聲明如下SOCKETsocket(intaf,inttype,intprotocol);參數(shù)說(shuō)明:af:指定網(wǎng)絡(luò)地址族,一般為AF_INET。type:指定套接字類(lèi)型,可選的取值如下:SOCK_STREAM流套接字。SOCK_DGRAM 數(shù)據(jù)報(bào)套接字。protocol:指定網(wǎng)絡(luò)協(xié)議,一般為0,表示默認(rèn)的TCP/IP協(xié)議。(三)綁定本地地址---bind()成功創(chuàng)建了Socket之后,就應(yīng)該選定通信的對(duì)象。調(diào)用bind()函數(shù)可以將本地地址綁定到套接字上,該函數(shù)聲明如下:intbind(SOCKETs,conststructsockaddtFAR*name,intnamelen);參數(shù)說(shuō)明:s:指定一個(gè)未綁定的套接字句柄,用于等待客戶(hù)進(jìn)程的連接。name:指向sockaddr結(jié)構(gòu)對(duì)象的指針。namelen:指定sockaddr結(jié)構(gòu)的長(zhǎng)度。其中sockddr結(jié)構(gòu)隨選擇的協(xié)議的不同而變化,因此常用的是sockaddr_in結(jié)構(gòu),用來(lái)標(biāo)識(shí)TCP/IP協(xié)議下的地址,該結(jié)構(gòu)定義如下:structsockaddr_in{short sin_family; //指定地址族,一般為AF_INETu_short sin_port; 〃指定端口號(hào)structin_addrsin_addr; 〃指定IP地址char sin_zero[8]; //填充位};其中IP地址結(jié)構(gòu)in_addr的定義如下:structin_addr{union{struct{u_chars_b1,s_b2,s_b3,s_b4;}S_un_b;struct{u_shorts_w1,s_w2;}S_un_w;u_longS_addr;}S_un;};(四)偵聽(tīng)連接---listen()綁定成功后,調(diào)用listen函數(shù)用于設(shè)置套接字的等待連接狀態(tài),該函數(shù)聲明如下:intlisten(SOCKETs,intbacklog);參數(shù)說(shuō)明:s:指定一個(gè)已綁定未連接的套接字句柄。backlog:指定正在等待連接的隊(duì)列的最大長(zhǎng)度,可取1~5。(五)建立套接字連接---accept()和connect()進(jìn)入監(jiān)聽(tīng)狀態(tài)后,通過(guò)調(diào)用accept函數(shù)使套接字做好接受客戶(hù)連接的準(zhǔn)備,該函數(shù)聲明如下:SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);~~參數(shù)說(shuō)明:s:指定處于監(jiān)聽(tīng)狀態(tài)的套接字句柄。addr:指定一個(gè)有效的SOCKADDR_IN結(jié)構(gòu)地址。addrlen:指定SOCKADDR_IN結(jié)構(gòu)的長(zhǎng)度。accept函數(shù)返回后,addr變量中會(huì)包含請(qǐng)求連接的客戶(hù)IP地址,并返回一個(gè)新的套接字句柄,對(duì)應(yīng)于已經(jīng)接受的那個(gè)客戶(hù)端連接。而原來(lái)的監(jiān)聽(tīng)套接字仍處于監(jiān)聽(tīng)狀態(tài)。~~客戶(hù)進(jìn)程調(diào)用connect函數(shù)可以主動(dòng)提出連接請(qǐng)求,該函數(shù)聲明如下:intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);~~參數(shù)說(shuō)明:s:指定一個(gè)未連接的套接字句柄。name:指定服務(wù)進(jìn)程的IP地址信息,針對(duì)TCP協(xié)議。namelen:指定name參數(shù)的長(zhǎng)度。(六)面向連接的數(shù)據(jù)傳輸---send(痔Drecv()不論是客戶(hù)還是服務(wù)器應(yīng)用程序都用send函數(shù)來(lái)向TCP連接的另一端發(fā)送數(shù)據(jù)??蛻?hù)程序一般用send函數(shù)向服務(wù)器發(fā)送請(qǐng)求,而服務(wù)器則通常用send函數(shù)來(lái)向客戶(hù)程序發(fā)送應(yīng)答。函數(shù)聲明如下:intsend(SOCKETs,constcharFAR*buf,intlen,intflags);~~參數(shù)說(shuō)明:s:指定發(fā)送端套接字描述符;*buf:指明一個(gè)存放應(yīng)用程序要發(fā)送數(shù)據(jù)的緩沖區(qū);len:指明實(shí)際要發(fā)送的數(shù)據(jù)的字節(jié)數(shù);flags:一般置0。~~不論是客戶(hù)還是服務(wù)器應(yīng)用程序都用recv函數(shù)從TCP連接的另一端接收數(shù)據(jù)。函數(shù)聲明如下:intrecv(SOCKETs,charFAR*buf,intlen,intflags);~~參數(shù)說(shuō)明:s:指定接收端套接字描述符;*buf:指明一個(gè)緩沖區(qū),該緩沖區(qū)用來(lái)存放recv函數(shù)接收到的數(shù)據(jù);len:指明buf的長(zhǎng)度;flags:一般置0。(七)無(wú)連接的數(shù)據(jù)傳輸sendto(用recvfrom()這兩個(gè)函數(shù)通常用于無(wú)連接通信中數(shù)據(jù)的發(fā)送與接收(也可用于面向連接的通信,但并不常見(jiàn),詳細(xì)用法請(qǐng)參考MSDN)。sendto()函數(shù)用于在參數(shù)s指定的套接字上向指定目的地發(fā)送輸出數(shù)據(jù)。Recvfrom()函數(shù)用于在參數(shù)s指定的套接字上讀取輸入數(shù)據(jù),并將發(fā)送數(shù)據(jù)的對(duì)端socket地址存入源地址緩沖區(qū)中。函數(shù)聲明:intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen);intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR**from,intFAR*fromlen);(八)輸入輸出多路復(fù)用---select()本函數(shù)用于確定一個(gè)或多個(gè)套接口的狀態(tài)。對(duì)每一個(gè)套接口,調(diào)用者可查詢(xún)它的可讀性、可寫(xiě)性及錯(cuò)誤狀態(tài)信息。用fd_set結(jié)構(gòu)來(lái)表示一組等待檢查的套接口。在調(diào)用返回時(shí),這個(gè)結(jié)構(gòu)存有滿(mǎn)足一定條件的套接口組的子集,并且select()返回滿(mǎn)足條件的套接口的數(shù)目。有一組宏可用于對(duì)fd_set的操作,這些宏與BerkeleyUnix軟件中的兼容,但內(nèi)部的表達(dá)是完全不同的。函數(shù)聲明:intselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);~~參數(shù)說(shuō)明:nfds:本參
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度城市托管班品牌授權(quán)與加盟合同
- 文化產(chǎn)品創(chuàng)意開(kāi)發(fā)合同
- 工業(yè)管道清洗與維護(hù)預(yù)案
- 法律咨詢(xún)行業(yè)法律服務(wù)結(jié)果保證書(shū)
- 三農(nóng)行業(yè)三農(nóng)戶(hù)教育培訓(xùn)計(jì)劃
- 農(nóng)業(yè)種植養(yǎng)殖合同
- 智能圖書(shū)館管理系統(tǒng)供應(yīng)合同
- 大學(xué)語(yǔ)文辯論賽故事征文
- 高考語(yǔ)文復(fù)習(xí)-文言文專(zhuān)題訓(xùn)練《史記晉世家》
- 會(huì)議紀(jì)要與重要決策執(zhí)行情況跟蹤表
- 四川省建筑行業(yè)調(diào)研報(bào)告
- 北京市豐臺(tái)區(qū)2024-2025學(xué)年高三上學(xué)期期末英語(yǔ)試題
- 2025上海市嘉定工業(yè)區(qū)農(nóng)村青年干部招聘22人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025采購(gòu)部年度工作計(jì)劃
- 2024年度個(gè)人珠寶首飾分期購(gòu)買(mǎi)合同范本3篇
- 食為天:2024中國(guó)食品飲料行業(yè)白皮書(shū)
- 醫(yī)學(xué)倫理與醫(yī)患溝通技巧
- 2025年牛津譯林版英語(yǔ)七年級(jí)下冊(cè)全冊(cè)單元重點(diǎn)知識(shí)點(diǎn)與語(yǔ)法匯編
- 痔瘡中醫(yī)治療課件
- 污水處理設(shè)備的故障處理指南考核試卷
- 華東師范大學(xué)《社會(huì)研究方法》2023-2024學(xué)年第一學(xué)期期末試卷
評(píng)論
0/150
提交評(píng)論