S100-計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)-實(shí)驗(yàn)七:WindowsSocket編程_第1頁(yè)
S100-計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)-實(shí)驗(yàn)七:WindowsSocket編程_第2頁(yè)
S100-計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)-實(shí)驗(yàn)七:WindowsSocket編程_第3頁(yè)
S100-計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)-實(shí)驗(yàn)七:WindowsSocket編程_第4頁(yè)
S100-計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)-實(shí)驗(yàn)七:WindowsSocket編程_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論