《網(wǎng)絡(luò)及其計(jì)算》實(shí)驗(yàn)指導(dǎo)書(shū)精選_第1頁(yè)
《網(wǎng)絡(luò)及其計(jì)算》實(shí)驗(yàn)指導(dǎo)書(shū)精選_第2頁(yè)
《網(wǎng)絡(luò)及其計(jì)算》實(shí)驗(yàn)指導(dǎo)書(shū)精選_第3頁(yè)
《網(wǎng)絡(luò)及其計(jì)算》實(shí)驗(yàn)指導(dǎo)書(shū)精選_第4頁(yè)
《網(wǎng)絡(luò)及其計(jì)算》實(shí)驗(yàn)指導(dǎo)書(shū)精選_第5頁(yè)
已閱讀5頁(yè),還剩40頁(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)指導(dǎo)書(shū)網(wǎng)絡(luò)技術(shù)基礎(chǔ)實(shí)驗(yàn)中心編著

實(shí)驗(yàn)一網(wǎng)絡(luò)命令使用1實(shí)驗(yàn)二FTP站點(diǎn)構(gòu)建及操作5實(shí)驗(yàn)三交換機(jī)配置實(shí)驗(yàn)7實(shí)驗(yàn)四路由器配置實(shí)驗(yàn)(靜態(tài)路由)13實(shí)驗(yàn)五路由器配置實(shí)驗(yàn)(動(dòng)態(tài)路由)16實(shí)驗(yàn)六NAT配置27實(shí)驗(yàn)七協(xié)議數(shù)據(jù)分析31實(shí)驗(yàn)八SOCKET編程實(shí)現(xiàn)Client/Server通信程序32圖4圖SEQ圖\*ARABIC4BosonNetsim實(shí)驗(yàn)主窗口過(guò)以下命令集配置各設(shè)備(各設(shè)備的IP設(shè)置要求如REF_Ref122358127\h圖5)圖SEQ圖\*ARABIC5實(shí)驗(yàn)中各設(shè)備的IP設(shè)置要求以下一行即為一個(gè)命令,”//”后為注釋?zhuān)灰鳛槊钶斎隦1的配置命令集:enable//進(jìn)入特權(quán)模式configt//進(jìn)入配置狀態(tài)hostnameR1//改名為R1interfacee0//選擇以太網(wǎng)接口0進(jìn)行配置ipaddress//配置IP地址及子網(wǎng)掩碼ipnatinside//啟動(dòng)NAT轉(zhuǎn)換功能,作為內(nèi)側(cè)noshut//啟動(dòng)該接口interfaces0ipaddressclockrate64000//設(shè)置波特率為64000ipnatoutsidenoshutipnatinsidesourcestatic00//將//映射為00routerRIP//啟動(dòng)該路由器的RIP協(xié)議network//設(shè)置R1的初始路由表,即直連著這個(gè)網(wǎng)段network//設(shè)置R1的初始路由表,即直連著這個(gè)網(wǎng)段R2的配置命令集:enable//進(jìn)入特權(quán)模式config//進(jìn)入配置狀態(tài)hostnameR2//改名為R1interfacee0//選擇以太網(wǎng)接口0進(jìn)行配置ipaddress//配置IP地址及子網(wǎng)掩碼noshut//啟動(dòng)該接口interfaces0ipaddressclockrate64000//設(shè)置波特率為64000noshutrouterRIP//啟動(dòng)該路由器的RIP協(xié)議network//設(shè)置R1的初始路由表,即直連著這個(gè)網(wǎng)段network//設(shè)置R1的初始路由表,即直連著這個(gè)網(wǎng)段//在向下配置之前請(qǐng)想一想RIP協(xié)議的工作原理是什么,這樣配置有什么意義HostA的配置命令集:ipconfig/ip//設(shè)置主機(jī)的IP地址與子網(wǎng)掩碼ipconfig/dg//設(shè)置默認(rèn)網(wǎng)關(guān)為R1HostB的配置命令集:ipconfig/ip//設(shè)置主機(jī)的IP地址與子網(wǎng)掩碼ipconfig/dg//設(shè)置默認(rèn)網(wǎng)關(guān)為R1測(cè)試A、B、R1、R2相互之間的連通性切換到主機(jī)Aping//ping主機(jī)B的IP切換到主機(jī)Bping00//ping主機(jī)A的NAT轉(zhuǎn)換后的地址

實(shí)驗(yàn)七協(xié)議數(shù)據(jù)分析實(shí)驗(yàn)?zāi)康牧私鈪f(xié)議分析儀的使用方法和基本特點(diǎn)。增強(qiáng)對(duì)網(wǎng)絡(luò)協(xié)議的理解。實(shí)驗(yàn)要求要求在進(jìn)行協(xié)議數(shù)據(jù)分析后,能夠?qū)⒕W(wǎng)絡(luò)數(shù)據(jù)與具體的網(wǎng)絡(luò)操作相互映證,如實(shí)的記錄實(shí)驗(yàn)結(jié)果,完成實(shí)驗(yàn)實(shí)驗(yàn)環(huán)境1.一臺(tái)運(yùn)行Windows2000的計(jì)算機(jī)2.各計(jì)算機(jī)已通過(guò)網(wǎng)卡、雙絞線、集線器實(shí)現(xiàn)網(wǎng)絡(luò)硬件連接。預(yù)備知識(shí)在通常狀態(tài)下,計(jì)算機(jī)的網(wǎng)卡只會(huì)接收目的地址與網(wǎng)卡的MAC地址相同的幀、廣播幀或組播幀,但將網(wǎng)卡的工作模式設(shè)置為混雜模式時(shí),網(wǎng)卡會(huì)接收所有到達(dá)的幀,Ethereal軟件就是將網(wǎng)卡的工作模式設(shè)置為混雜模式,盡可能多的捕獲網(wǎng)絡(luò)數(shù)據(jù),并能對(duì)每一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行分析的工具軟件。實(shí)驗(yàn)步驟1.從現(xiàn)有的網(wǎng)絡(luò)數(shù)據(jù)中捕獲網(wǎng)絡(luò)數(shù)據(jù),針對(duì)一個(gè)數(shù)據(jù)包并從不同的網(wǎng)絡(luò)層次(幀、IP數(shù)據(jù)報(bào)、TCP段、HTTP協(xié)議數(shù)據(jù)等)來(lái)分析網(wǎng)絡(luò)數(shù)據(jù),記錄每個(gè)層次協(xié)議數(shù)據(jù)的每個(gè)字段的值;2.使用ping命令產(chǎn)生網(wǎng)絡(luò)數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行分析,記錄一個(gè)ARP請(qǐng)求消息分析結(jié)果及對(duì)應(yīng)響應(yīng)消息分析結(jié)果,記錄一個(gè)回聲請(qǐng)求數(shù)據(jù)的分析結(jié)果和一個(gè)響應(yīng)數(shù)據(jù)的分析結(jié)果。3.使用tracert命令產(chǎn)生網(wǎng)絡(luò)數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行分析,記錄關(guān)鍵的數(shù)據(jù)特征,并做出解釋。4.用瀏覽器瀏覽某個(gè)網(wǎng)站(比如:,),查看捕獲的數(shù)據(jù),記錄這次訪問(wèn)產(chǎn)生的網(wǎng)絡(luò)數(shù)據(jù)(只記錄每個(gè)數(shù)據(jù)包是什么數(shù)據(jù)包),注意它們的次序,給出簡(jiǎn)單的解釋。參考文獻(xiàn)KennethD.Reed著,孫坦等譯.協(xié)議分析[M].北京:電子工業(yè)出版社,2002.謝鯤,張大方.共享網(wǎng)段網(wǎng)絡(luò)協(xié)議分析系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與科學(xué),2002.24(2).福祿克公司關(guān)于協(xié)議分析(測(cè)試)儀的網(wǎng)站./Ethereal分析儀網(wǎng)站.

實(shí)驗(yàn)八SOCKET編程實(shí)現(xiàn)Client/Server程序?qū)嶒?yàn)?zāi)康?.掌握網(wǎng)絡(luò)應(yīng)用程序的開(kāi)發(fā)方法;2.掌握Client/Server結(jié)構(gòu)軟件的設(shè)計(jì)與開(kāi)發(fā)方法3.掌握Socket機(jī)制的工作原理實(shí)驗(yàn)要求1.使用VC++,利用套接字技術(shù)編寫(xiě)一個(gè)簡(jiǎn)單的通信程序。2.分析調(diào)試程序,了解VC++的特點(diǎn),套接字的特性3.記錄調(diào)試分析的全過(guò)程,加深對(duì)套接字的理解實(shí)驗(yàn)預(yù)備知識(shí)1、客戶(hù)機(jī)/服務(wù)器模式在網(wǎng)絡(luò)中最常用的通信模式是客戶(hù)機(jī)/服務(wù)器模式(Client/Server模式或C/S模式)。服務(wù)器方要先啟動(dòng),并監(jiān)聽(tīng)指定端口,等待客戶(hù)端的請(qǐng)求,根據(jù)客戶(hù)端的請(qǐng)求提供相應(yīng)服務(wù)。2、基本套接字一般來(lái)說(shuō),要進(jìn)行網(wǎng)絡(luò)通信,必須要在網(wǎng)絡(luò)的每一端都要建立一個(gè)套接字,兩個(gè)套接字之間是可以建立連接的,也是可以無(wú)連接的,并通過(guò)對(duì)套接字的“讀”、“寫(xiě)”操作實(shí)現(xiàn)網(wǎng)絡(luò)通信功能。類(lèi)似于文件的打開(kāi)、讀、寫(xiě)、關(guān)閉的方式。套接字有三種類(lèi)型:數(shù)據(jù)流套接字(SOCK_STREAM):對(duì)應(yīng)TCP協(xié)議。數(shù)據(jù)報(bào)套接字(SOCK_DGRAM):對(duì)應(yīng)UDP協(xié)議。原始套接字(SOCK_RAW)。通過(guò)使用原始套接字,可以將網(wǎng)卡設(shè)為混雜模式。并且可以捕獲到的數(shù)據(jù)包不僅僅是單純的數(shù)據(jù)信息,而是包含有IP頭、TCP頭等信息頭的最原始的數(shù)據(jù)信息,這些信息保留了它在網(wǎng)絡(luò)傳輸時(shí)的原貌,通過(guò)對(duì)這些在低層傳輸?shù)脑夹畔⒌姆治隹梢缘玫礁嗑W(wǎng)絡(luò)的信息。一個(gè)完整的網(wǎng)間通信需要一個(gè)五元組來(lái)標(biāo)識(shí):(協(xié)議,本地地址,本地端口號(hào),遠(yuǎn)地地址,遠(yuǎn)地端口號(hào))3、基本套接字系統(tǒng)調(diào)用為了更好地說(shuō)明套接字編程原理,下面給出幾個(gè)基本套接字系統(tǒng)調(diào)用說(shuō)明。a.創(chuàng)建套接字──socket()應(yīng)用程序在使用套接字前,首先必須擁有一個(gè)套接字,系統(tǒng)調(diào)用socket()向應(yīng)用程序提供創(chuàng)建套接字的手段,其調(diào)用格式如下:SOCKETPASCALFARsocket(intaf,inttype,intprotocol);參數(shù)af:指定通信發(fā)生的區(qū)域,UNIX系統(tǒng)支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中僅支持AF_INET,它是互連網(wǎng)區(qū)域。參數(shù)type:描述要建立的套接字的類(lèi)型。參數(shù)protocol:說(shuō)明該套接字使用的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為0,使用默認(rèn)的協(xié)議。根據(jù)這三個(gè)參數(shù)建立一個(gè)套接字,并將相應(yīng)的資源分配給它,同時(shí)返回一個(gè)整型套接字號(hào)。socket()系統(tǒng)調(diào)用實(shí)際上指定了相關(guān)五元組中的“協(xié)議”這一元。b.指定本地地址──bind()將本地主機(jī)地址和本地端口與所創(chuàng)建的套接字號(hào)聯(lián)系起來(lái),其調(diào)用格式如下:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);參數(shù)s:是由socket()調(diào)用返回的套接字描述符(套接字號(hào))。參數(shù)name:是賦給套接字s的本地地址,其長(zhǎng)度可變,結(jié)構(gòu)隨通信域的不同而不同,TCP/IP協(xié)議使用的地址結(jié)構(gòu)如下:structsockaddr_in{shortsin_family;/*AF_INET*/u_shortsin_port;/*16位端口號(hào),網(wǎng)絡(luò)字節(jié)順序*/structin_addrsin_addr;/*32位IP地址,網(wǎng)絡(luò)字節(jié)順序*/charsin_zero[8];/*保留*/}網(wǎng)絡(luò)字節(jié)順序:不同的計(jì)算機(jī)存放多字節(jié)值的順序不同,有的機(jī)器在起始地址先存放低位字節(jié),有的先存高位字節(jié)。為保證數(shù)據(jù)的正確性,在網(wǎng)絡(luò)協(xié)議中須指定網(wǎng)絡(luò)字節(jié)順序。TCP/IP協(xié)議使用16位整數(shù)和32位整數(shù)的高價(jià)先存格式,它們均含在協(xié)議頭文件中。參數(shù)namelen:表明了name的長(zhǎng)度。如果沒(méi)有錯(cuò)誤發(fā)生,bind()返回0。否則返回值SOCKET_ERROR。c.建立套接字連接──connect()與accept()connect()用于建立連接。無(wú)連接的套接字進(jìn)程也可以調(diào)用connect(),這樣就不必每次都指定目的地址。而accept()用于使服務(wù)器等待來(lái)自某客戶(hù)進(jìn)程的實(shí)際連接。intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);參數(shù)s:是欲建立連接的本地套接字描述符。參數(shù)name:為指向?qū)Ψ教捉幼值刂方Y(jié)構(gòu)的指針。參數(shù)namelen:對(duì)方套接字地址結(jié)構(gòu)長(zhǎng)度。如果沒(méi)有錯(cuò)誤發(fā)生,connect()返回0。否則返回值SOCKET_ERROR。SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);參數(shù)s:為本地套接字描述符,在用做accept()調(diào)用的參數(shù)前應(yīng)該先調(diào)用過(guò)listen()。addr:指向客戶(hù)方套接字地址結(jié)構(gòu)的指針,用來(lái)接收連接實(shí)體的地址。Addrlen:為客戶(hù)方套接字地址結(jié)構(gòu)的長(zhǎng)度。如果沒(méi)有錯(cuò)誤發(fā)生,accept()返回一個(gè)SOCKET類(lèi)型的值,表示接收到的套接字的描述符。否則返回值INVALID_SOCKET。accept()用于面向連接服務(wù)器。參數(shù)addr和addrlen存放客戶(hù)方的地址信息。調(diào)用前,參數(shù)addr指向一個(gè)初始值為空的地址結(jié)構(gòu),而addrlen的初始值為0;調(diào)用accept()后,服務(wù)器等待從編號(hào)為s的套接字上接受客戶(hù)連接請(qǐng)求,而連接請(qǐng)求是由客戶(hù)方的connect()調(diào)用發(fā)出的。當(dāng)有連接請(qǐng)求到達(dá)時(shí),accept()調(diào)用將請(qǐng)求連接隊(duì)列上的第一個(gè)客戶(hù)方套接字地址及長(zhǎng)度放入addr和addrlen,并創(chuàng)建一個(gè)與s有相同特性的新套接字號(hào)。新的套接字可用于處理服務(wù)器并發(fā)請(qǐng)求。四個(gè)套接字系統(tǒng)調(diào)用,socket()、bind()、connect()、accept(),可以完成一個(gè)完全五元相關(guān)的建立。socket()指定五元組中的協(xié)議元。bind()指定五元組中的本地二元,即本地主機(jī)地址和端口號(hào),其用法與是否面向連接有關(guān):在服務(wù)器方,無(wú)論是否面向連接,均要調(diào)用bind();在客戶(hù)方,若采用面向連接,則可以不調(diào)用bind(),而通過(guò)connect()自動(dòng)完成。若采用無(wú)連接,客戶(hù)方必須使用bind()以獲得一個(gè)唯一的地址。d.監(jiān)聽(tīng)連接──listen()此調(diào)用用于面向連接服務(wù)器,表明它愿意接收連接。listen()需在accept()之前調(diào)用,其調(diào)用格式如下:intPASCALFARlisten(SOCKETs,intbacklog);參數(shù)s:標(biāo)識(shí)一個(gè)本地已建立、尚未連接的套接字號(hào),服務(wù)器愿意從它上面接收請(qǐng)求。Backlog:表示請(qǐng)求連接隊(duì)列的最大長(zhǎng)度,用于限制排隊(duì)請(qǐng)求的個(gè)數(shù),目前允許的最大值為5。如果沒(méi)有錯(cuò)誤發(fā)生,listen()返回0。否則它返回SOCKET_ERROR。e.?dāng)?shù)據(jù)傳輸──send()與recv()當(dāng)一個(gè)連接建立以后,就可以傳輸數(shù)據(jù)了。常用的系統(tǒng)調(diào)用有send()和recv()。intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);參數(shù)s:為已連接的本地套接字描述符。buf:指向存有發(fā)送數(shù)據(jù)的緩沖區(qū)的指針,其長(zhǎng)度由len指定。Flags:指定傳輸控制方式,如是否發(fā)送帶外數(shù)據(jù)等。如果沒(méi)有錯(cuò)誤發(fā)生,send()返回總共發(fā)送的字節(jié)數(shù)。否則它返回SOCKET_ERROR。intPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);參數(shù)s:為已連接的套接字描述符。Buf:指向接收輸入數(shù)據(jù)緩沖區(qū)的指針,其長(zhǎng)度由len指定。Flags:指定傳輸控制方式,如是否接收帶外數(shù)據(jù)等。如果沒(méi)有錯(cuò)誤發(fā)生,recv()返回總共接收的字節(jié)數(shù)。如果連接被關(guān)閉,返回0。否則它返回SOCKET_ERROR。**Flags參數(shù)可以是0或者是以下的組合:MSG_DONTROUTE:不查找路由表。是send函數(shù)使用的標(biāo)志,這個(gè)標(biāo)志告訴IP協(xié)議,目的主機(jī)在本地網(wǎng)絡(luò)上面,沒(méi)有必要查找路由表。MSG_OOB:表示可以接收和發(fā)送帶外的數(shù)據(jù)。MSG_PEEK:是recv函數(shù)的使用標(biāo)志,表示只是從系統(tǒng)緩沖區(qū)中讀取內(nèi)容,而不清除系統(tǒng)緩沖區(qū)的內(nèi)容。這樣下次讀的時(shí)候,仍然是一樣的內(nèi)容。一般在有多個(gè)進(jìn)程讀寫(xiě)數(shù)據(jù)時(shí)可以使用這個(gè)標(biāo)志。MSG_WAITAL:是recv函數(shù)的使用標(biāo)志,表示等到所有的信息到達(dá)時(shí)才返回。使用這個(gè)標(biāo)志的時(shí)候recv會(huì)一直阻塞,直到指定的條件滿(mǎn)足,或者是發(fā)生了錯(cuò)誤。1)當(dāng)讀到了指定的字節(jié)時(shí),函數(shù)正常返回,返回值等于len。2)當(dāng)讀到了文件的結(jié)尾時(shí),函數(shù)正常返回,返回值小于len。3)當(dāng)操作發(fā)生錯(cuò)誤時(shí),返回-1,且設(shè)置錯(cuò)誤為相應(yīng)的錯(cuò)誤號(hào)(errno)。f.?dāng)?shù)據(jù)傳輸——sendto()與recvfrom()Sendto()用于在無(wú)連接套接字上發(fā)送消息。Recvfrom()可以記錄發(fā)送者的地址,該地址與sendto所指定的地址結(jié)構(gòu)完全相同。intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,structsockaddr*to,inttolen)intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen)sockfd:表示套接字描述符。buf:發(fā)送或接收的緩沖區(qū)。len:緩沖區(qū)及大小。recvfrom負(fù)責(zé)從sockfd接收數(shù)據(jù),如果from不是NULL,那么在from里面存儲(chǔ)了信息來(lái)源的情況,如果對(duì)信息的來(lái)源不感興趣,可以將from和fromlen設(shè)置為NULL。sendto負(fù)責(zé)向to發(fā)送信息,此時(shí)在to里面存儲(chǔ)了接收信息方的詳細(xì)信息。g.?dāng)?shù)據(jù)傳輸——recvmsg()和sendmsg()recvmsg和sendmsg的功能類(lèi)似于recvfrom和sendto,只不過(guò)將一些信息放入了一個(gè)結(jié)構(gòu)中。intrecvmsg(intsockfd,structmsghdr*msg,intflags)intsendmsg(intsockfd,structmsghdr*msg,intflags)structmsghdr{void*msg_name;intmsg_namelen;structiovec*msg_iov;intmsg_iovlen;void*msg_control;intmsg_controllen;intmsg_flags;}structiovec{void*iov_base;/*緩沖區(qū)開(kāi)始的地址*/size_tiov_len;/*緩沖區(qū)的長(zhǎng)度*/}msg_name和msg_namelen當(dāng)套接字是非面向連接時(shí)(UDP),它們存儲(chǔ)接收和發(fā)送方的地址信息。msg_name實(shí)際上是一個(gè)指向structsockaddr的指針,msg_name是結(jié)構(gòu)的長(zhǎng)度。當(dāng)套接字是面向連接時(shí),這兩個(gè)值應(yīng)設(shè)為NULL.msg_iov和msg_iovlen指出接受和發(fā)送的緩沖區(qū)內(nèi)容。msg_iov是一個(gè)結(jié)構(gòu)指針,msg_iovlen指出這個(gè)結(jié)構(gòu)數(shù)組的大小。msg_control和msg_controllen這兩個(gè)變量是用來(lái)接收和發(fā)送控制數(shù)據(jù)時(shí)的msg_flags指定接受和發(fā)送的操作選項(xiàng),和recv,send的選項(xiàng)一樣。h.關(guān)閉套接字──closesocket()與Shutdown()closesocket()關(guān)閉套接字s,并釋放分配給該套接字的資源;如果s涉及一個(gè)打開(kāi)的TCP連接,則該連接被釋放。closesocket()的調(diào)用格式如下:BOOLPASCALFARclosesocket(SOCKETs);參數(shù)s:待關(guān)閉的套接字描述符。如果沒(méi)有錯(cuò)誤發(fā)生,closesocket()返回0。否則返回值SOCKET_ERROR。intshutdown(intsockfd,inthowto)TCP連接是雙向的(是可讀寫(xiě)的),當(dāng)我們使用close時(shí),會(huì)把讀寫(xiě)通道都關(guān)閉,有時(shí)侯我們希望只關(guān)閉一個(gè)方向,這個(gè)時(shí)候我們可以使用shutdown。針對(duì)不同的howto,系統(tǒng)回采取不同的關(guān)閉方式.howto=0這個(gè)時(shí)候系統(tǒng)會(huì)關(guān)閉讀通道,但是可以繼續(xù)寫(xiě)。howto=1關(guān)閉寫(xiě)通道,但是可以繼續(xù)讀。howto=2關(guān)閉讀寫(xiě)通道。i.輸入/輸出多路復(fù)用──select()select()調(diào)用用來(lái)檢測(cè)一個(gè)或多個(gè)套接字的狀態(tài)。對(duì)每一個(gè)套接字來(lái)說(shuō),這個(gè)調(diào)用可以請(qǐng)求讀、寫(xiě)或錯(cuò)誤狀態(tài)方面的信息。請(qǐng)求給定狀態(tài)的套接字集合由一個(gè)fd_set結(jié)構(gòu)指示。在返回時(shí),此結(jié)構(gòu)被更新,以反映那些滿(mǎn)足特定條件的套接字的子集,同時(shí),select()調(diào)用返回滿(mǎn)足條件的套接字的數(shù)目,其調(diào)用格式如下:intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);參數(shù)nfds:指明被檢查的套接字描述符的值域,此變量一般被忽略。參數(shù)readfds:指向要做讀檢測(cè)的套接字描述符集合的指針,調(diào)用者希望從中讀取數(shù)據(jù)。參數(shù)writefds:指向要做寫(xiě)檢測(cè)的套接字描述符集合的指針。Exceptfds:指向要檢測(cè)是否出錯(cuò)的套接字描述符集合的指針。Timeout:指向select()函數(shù)等待的最大時(shí)間,如果設(shè)為NULL則為阻塞操作。select()返回包含在fd_set結(jié)構(gòu)中已準(zhǔn)備好的套接字描述符的總數(shù)目,或者是發(fā)生錯(cuò)誤則返回SOCKET_ERROR。4、數(shù)據(jù)轉(zhuǎn)換和網(wǎng)絡(luò)信息函數(shù)a、字節(jié)順序轉(zhuǎn)換函數(shù)在網(wǎng)絡(luò)上面有著許多類(lèi)型的機(jī)器,這些機(jī)器在表示數(shù)據(jù)的字節(jié)順序是不同的,比如i386芯片是低字節(jié)在內(nèi)存地址的低端,高字節(jié)在高端,而alpha芯片卻相反。為了統(tǒng)一起來(lái),有專(zhuān)門(mén)的字節(jié)順序轉(zhuǎn)換函數(shù)。unsignedlonginthtonl(unsignedlonginthostlong)unsignedshortinthtons(unisgnedshortinthostshort)unsignedlongintntohl(unsignedlongintnetlong)unsignedshortintntohs(unsignedshortintnetshort)在這四個(gè)轉(zhuǎn)換函數(shù)中,h代表host,n代表network。s代表short,l代表long,第一個(gè)函數(shù)的意義是將本機(jī)器上的long數(shù)據(jù)轉(zhuǎn)化為網(wǎng)絡(luò)上的long,其它幾個(gè)函數(shù)的意義類(lèi)似。b、IP和域名的轉(zhuǎn)換在網(wǎng)絡(luò)上標(biāo)志一臺(tái)機(jī)器可以用IP或者是用域名,那么怎么進(jìn)行轉(zhuǎn)換呢?structhostent*gethostbyname(constchar*hostname)structhostent*gethostbyaddr(constchar*addr,intlen,inttype)在中有structhostent的定義structhostent{char*h_name;/*主機(jī)的正式名稱(chēng)*/char*h_aliases;/*主機(jī)的別名*/inth_addrtype;/*主機(jī)的地址類(lèi)型AF_INET*/inth_length;/*主機(jī)的地址長(zhǎng)度對(duì)于IP4是4字節(jié)32位*/char**h_addr_list;/*主機(jī)的IP地址列表*/}#defineh_addrh_addr_list[0]/*主機(jī)的第一個(gè)IP地址*/gethostbyname可以將機(jī)器名(如)轉(zhuǎn)換為一個(gè)結(jié)構(gòu)指針.在這個(gè)結(jié)構(gòu)里面儲(chǔ)存了域名的信息gethostbyaddr可以將一個(gè)32位的IP地址(C0A80001)轉(zhuǎn)換為結(jié)構(gòu)指針.這兩個(gè)函數(shù)失敗時(shí)返回NULL且設(shè)置h_errno錯(cuò)誤變量,調(diào)用h_strerror()可以得到詳細(xì)的出錯(cuò)信息c、字符串的IP和32位的IP轉(zhuǎn)換.在網(wǎng)絡(luò)上面IP地址都用點(diǎn)分十進(jìn)制數(shù)字表示(如:),而在structin_addr結(jié)構(gòu)中用的是32位的IP,為了轉(zhuǎn)換我們可以使用下面兩個(gè)函數(shù):intinet_aton(constchar*cp,structin_addr*inp)char*inet_ntoa(structin_addrin)函數(shù)里面a代表ascii,n代表network。第一個(gè)函數(shù)表示將a.b.c.d的IP轉(zhuǎn)換為32位的IP,,存儲(chǔ)在inp指針里面。第二個(gè)是將32位IP轉(zhuǎn)換為a.b.c.d的格式。d、服務(wù)信息函數(shù)在網(wǎng)絡(luò)程序里面我們有時(shí)候需要知道端口、IP和服務(wù)信息,這個(gè)時(shí)候可以使用以下幾個(gè)函數(shù)intgetsockname(intsockfd,structsockaddr*localaddr,int*addrlen)intgetpeername(intsockfd,structsockaddr*peeraddr,int*addrlen)structservent*getservbyname(constchar*servname,constchar*protoname)structservent*getservbyport(intport,constchar*protoname)structservent{char*s_name;/*正式服務(wù)名*/char**s_aliases;/*別名列表*/ints_port;/*端口號(hào)*/char*s_proto;/*使用的協(xié)議*/}5、典型調(diào)用時(shí)序圖a.面向連接的套接字的系統(tǒng)調(diào)用時(shí)序圖

無(wú)連接協(xié)議的套接字調(diào)用時(shí)序圖6、面向連接示例程序a.VC++Socket編程簡(jiǎn)單的Tcp/ip服務(wù)器#include<windows.h>#include<iostream.h>#include<winsock.h>#defineNO_FLAGS_SET0#definePORT(u_short)44965#defineMAXBUFLEN256INTmain(VOID){WSADATAData;SOCKADDR_INserverSockAddr;SOCKADDR_INclientSockAddr;SOCKETserverSocket;SOCKETclientSocket;intaddrLen=sizeof(SOCKADDR_IN);intstatus;intnumrcv;charbuffer[MAXBUFLEN];/*initializetheWindowsSocketDLL*/status=WSAStartup(MAKEWORD(1,1),&Data);/*初始化WinsockDLLif(status!=0)cerr<<"ERROR:WSAStartupunsuccessful"<<endl;/*zerothesockaddr_instructure*/memset(&serverSockAddr,0,sizeof(serverSockAddr));/*specifytheportportionoftheaddress*/serverSockAddr.sin_port=htons(PORT);/*specifytheaddressfamilyasInternet*/serverSockAddr.sin_family=AF_INET;/*specifythattheaddressdoesnotmatter*//*INADDR_ANY的具體含義是,綁定到。此時(shí),對(duì)所有的地址都將是有效的serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);/*createasocket*/serverSocket=socket(AF_INET,SOCK_STREAM,0);if(serverSocket==INVALID_SOCKET)cerr<<"ERROR:socketunsuccessful"<<endl;/*associatethesocketwiththeaddress*/status=bind(serverSocket,(LPSOCKADDR)&serverSockAddr,sizeof(serverSockAddr));if(status==SOCKET_ERROR)cerr<<"ERROR:bindunsuccessful"<<endl;/*allowthesockettotakeconnections*/status=listen(serverSocket,1);if(status==SOCKET_ERROR)cerr<<"ERROR:listenunsuccessful"<<endl;/*accepttheconnectionrequestwhenoneisreceived*/clientSocket=accept(serverSocket,(LPSOCKADDR)&clientSockAddr,&addrLen);cout<<"Gottheconnection..."<<endl;while(1){numrcv=recv(clientSocket,buffer,MAXBUFLEN,NO_FLAGS_SET);if((numrcv==0)||(numrcv==SOCKET_ERROR)){cout<<"Connectionterminated."<<endl;status=closesocket(clientSocket);if(status==SOCKET_ERROR)cerr<<"ERROR:closesocketunsuccessful"<<endl;status=WSACleanup();if(status==SOCKET_ERROR)cerr<<"ERROR:WSACleanupunsuccessful"<<endl;return(1);}cout<<buffer<<endl;}/*while*/b.VC++Socket編程簡(jiǎn)單的Tcp/ip客戶(hù)端#include<windows.h>#include<iostream.h>#include<winsock.h>#defineNO_FLAGS_SET0#definePORT(u_short)44965#defineDEST_IP_ADDR"58"http://ServeraddressINTmain(VOID){WSADATAData;SOCKADDR_INdestSockAddr;SOCKETdestSocket;unsignedlongdestAddr;intstatus;intnumsnt;char*toSendtxt="TestString";/*initializetheWindowsSocketDLL*/status=WSAStartup(MAKEWORD(1,1),&Data);if(status!=0)cerr<<"ERROR:WSAStartupunsuccessful"<<endl;/*convertIPaddressintoin_addrform*/destAddr=inet_addr(DEST_IP_ADDR);/*copydestAddrintosockaddr_instructure*/memcpy(&destSockAddr.sin_addr,&destAddr,sizeof(destAddr));/*specifytheportportionoftheaddress*/destSockAddr.sin_port=htons(PORT);/*specifytheaddressfamilyasInternet*/destSockAddr.sin_family=AF_INET;/*createasocket*/destSocket=socket(AF_INET,SOCK_STREAM,0

溫馨提示

  • 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)論