




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
計算機網(wǎng)絡(luò)課程設(shè)計要求一、實驗內(nèi)容利用實驗室提供的網(wǎng)絡(luò)環(huán)境,完成以下兩個實驗:1)實驗一(必做)2)從實驗二和實驗三中選擇一個完成。 具體實驗要求見后。二、實驗要求實驗分組進行,每組3-4人,自愿組織,每組選擇一名組長,共同完成實驗內(nèi)容。實驗要求如下:以上實驗按照要求完成,具有演示效果,并由指導(dǎo)教師驗收;按要求撰寫實驗報告,每人提交一份;三、實驗報告格式見附錄C。實驗一數(shù)據(jù)包的捕獲與分析1.1課程設(shè)計目的數(shù)據(jù)包捕獲技術(shù)是網(wǎng)絡(luò)管理系統(tǒng)的關(guān)鍵技術(shù)。本實驗通過Wireshark軟件的安裝使用,監(jiān)控局域網(wǎng)的狀態(tài),捕獲在局域網(wǎng)中傳輸?shù)臄?shù)據(jù)包,并結(jié)合在計算機網(wǎng)絡(luò)課程中學(xué)習(xí)到的理論知識,對常用網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包做出分析,加深網(wǎng)絡(luò)課程知識的理解和掌握。1.2課程設(shè)計內(nèi)容Wireshark是一種開源的網(wǎng)絡(luò)數(shù)據(jù)包的捕獲和分析軟件,本實驗通過Wireshark軟件的安裝使用,監(jiān)控局域網(wǎng)的狀態(tài),捕獲在局域網(wǎng)中傳輸?shù)臄?shù)據(jù)包,并結(jié)合在計算機網(wǎng)絡(luò)課程中學(xué)習(xí)到的理論知識,對常用網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包做出分析,加深網(wǎng)絡(luò)課程知識的理解和掌握。具體內(nèi)容及要求如下:Wireshark軟件的安裝;Wireshark軟件的啟動,并設(shè)置網(wǎng)卡的狀態(tài)為混雜狀態(tài),使得Wireshark可以監(jiān)控局域網(wǎng)的狀態(tài);啟動數(shù)據(jù)包的捕獲,跟蹤PC之間的報文,并存入文件以備重新查;設(shè)置過濾器過濾網(wǎng)絡(luò)報文以檢測特定數(shù)據(jù)流;對常用協(xié)議的數(shù)據(jù)包的報文格式進行分析,利用協(xié)議分析軟件的統(tǒng)計工具顯示網(wǎng)絡(luò)報文的各種統(tǒng)計信息。1.3相關(guān)知識數(shù)據(jù)包捕獲技術(shù)是網(wǎng)絡(luò)管理系統(tǒng)的關(guān)鍵技術(shù)。以太網(wǎng)(Ethernet)具有共享介質(zhì)的特征,信息是以明文的形式在網(wǎng)絡(luò)上傳輸,當網(wǎng)絡(luò)適配器設(shè)置為監(jiān)聽模式(混雜模式,Promiscuous)時,由于采用以太網(wǎng)廣播信道爭用的方式,使得監(jiān)聽系統(tǒng)與正常通信的網(wǎng)絡(luò)能夠并聯(lián)連接,并可以捕獲任何一個在同一沖突域上傳輸?shù)臄?shù)據(jù)包。IEEE802.3標準的以太網(wǎng)采用的是持續(xù)CSMA的方式,正是由于以太網(wǎng)采用這種廣播信道爭用的方式,使得各個站點可以獲得其他站點發(fā)送的數(shù)據(jù)。運用這一原理使信息捕獲系統(tǒng)能夠攔截的我們所要的信息,這是捕獲數(shù)據(jù)包的物理基礎(chǔ)。以太網(wǎng)是一種總線型的網(wǎng)絡(luò),從邏輯上來看是由一條總線和多個連接在總線上的站點所組成。各個站點采用上面提到的CSMA/CD協(xié)議進行信道的爭用和共享,每個站點(這里特指計算機通過的接口卡)網(wǎng)卡來實現(xiàn)這種功能。網(wǎng)卡主要的工作是完成對于總線當前狀態(tài)的探測,確定是否進行數(shù)據(jù)的傳送,判斷每個物理數(shù)據(jù)幀目的地是否為本站地址,如果不匹配,則說明不是發(fā)送到本站的而將它丟棄。如果是的話,接收該數(shù)據(jù)幀,進行物理數(shù)據(jù)幀的CRC校驗,然后將數(shù)據(jù)幀提交給LLC子層。網(wǎng)卡具有如下的幾種工作模式:1)廣播模式(BroadCastModel):它的物理地址(MAC)地址是0Xffffff的幀為廣播幀,工作在廣播模式的網(wǎng)卡接收廣播幀。2)多播傳送(MultiCastModel):多播傳送地址作為目的物理地址的幀可以被組內(nèi)的其它主機同時接收,而組外主機卻接收不到。但是,如果將網(wǎng)卡設(shè)置為多播傳送模式,它可以接收所有的多播傳送幀,而不論它是不是組內(nèi)成員。3)直接模式(DirectModel):工作在直接模式下的網(wǎng)卡只接收目地址是自己MAC地址的幀。4)混雜模式(PromiscuousModel):工作在混雜模式下的網(wǎng)卡接收所有的流過網(wǎng)卡的幀,信包捕獲程序就是在這種模式下運行的。網(wǎng)卡的缺省工作模式包含廣播模式和直接模式,即它只接收廣播幀和發(fā)給自己的幀。如果采用混雜模式,一個站點的網(wǎng)卡將接受同一網(wǎng)絡(luò)內(nèi)所有站點所發(fā)送的數(shù)據(jù)包這樣就可以到達對于網(wǎng)絡(luò)信息監(jiān)視捕獲的目的。1.4課程設(shè)計分析1、在PC中安裝協(xié)議分析軟件(如:Wireshark)。具體安裝過程詳見Wireshark用戶指南。2、啟動Wireshark協(xié)議分析軟件,選擇抓包菜單項啟動實時監(jiān)視器,開始實時跟蹤顯示網(wǎng)絡(luò)數(shù)據(jù)報文??筛鶕?jù)系統(tǒng)提示修改顯示方式,詳見Wireshark用戶指南。3、調(diào)出跟蹤存儲的歷史報文,選擇有代表性的ETHERNETⅡ,IEEE802.3,IP,ICMP,TCP,UDP報文,對照有關(guān)協(xié)議逐個分析報文各字段的含義及內(nèi)容。ETHERNET報文格式DSTADDRSRCADDRTYPEINFO6字節(jié)6字節(jié)2字節(jié)最大長度1518字節(jié)IEEE802.3報文格式DSTADDRSRCADDRLENDSAPSSAPCONTROLINFO6字節(jié)6字節(jié)2字節(jié)1字節(jié)1字節(jié)1/2字節(jié)信息最大長度1518字節(jié)IP報文格式VERSIONIHLTOSTOTALLENGTNIDENTIFICATIONFLAGSFRAGMENTOFFSETTTLPROTOWTHEADERCHECLCSUMSOWRCEADDRESSDRSTINWTIONADDRESSOPTIONSPADDINGINFO4、設(shè)置過濾器屬性,如目的地址,源地址,協(xié)議類型等。如過濾不需要的網(wǎng)絡(luò)報文,過濾器允許設(shè)置第二層,第三層或第四層的協(xié)議字段。過濾器有兩種工作方式:1)捕獲前過濾:協(xié)議分析軟件用過濾器匹配網(wǎng)絡(luò)上的數(shù)據(jù)報文,僅當匹配通過時才捕獲報文。2)捕獲后過濾:協(xié)議分析軟件捕獲所有報文,但僅顯示匹配符合過濾條件的報文。選擇統(tǒng)計菜單項可以顯示網(wǎng)絡(luò)中各種流量的統(tǒng)計信息,如:關(guān)于字節(jié)數(shù),廣播中報文數(shù),出錯數(shù)等。詳見:Wireshark用戶指南。
實驗二網(wǎng)絡(luò)層實驗—Ping程序的設(shè)計與實現(xiàn)2.1課程設(shè)計目的本實驗?zāi)康氖鞘箤W(xué)生掌握網(wǎng)絡(luò)層協(xié)議的原理及實現(xiàn)方法。2.2課程設(shè)計內(nèi)容本實驗為ICMP實驗。實驗內(nèi)容:Ping命令實現(xiàn)的擴充,在給定的Ping程序的基礎(chǔ)上做如下功能擴充:-h 顯示幫助信息-b 允許ping一個廣播地址,只用于IPv4-t設(shè)置ttl值,只用于IPv4-q 安靜模式。不顯示每個收到的包的分析結(jié)果,只在結(jié)束時,顯示匯總結(jié)果Ping命令的基本描述Ping的操作是向某些IP地址發(fā)送一個ICMPEcho消息,接著該節(jié)點返回一個ICMPEchoreply消息。ICMP消息使用IP頭作為基本控制。IP頭的格式如下012301234567890123456789012345678901+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|Version|IHL|TypeofService|TotalLength|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|Identification|Flags|FragmentOffset|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|TimetoLive|Protocol|HeaderChecksum|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|SourceAddress|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|DestinationAddress|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Version=4IHLInternet頭長TypeofService=0TotalLengthIP包的總長度Identification,Flags,FragmentOffset用于IP包分段TimetoLiveIP包的存活時長ProtocolICMP=1Addresses發(fā)送Echo消息的源地址是發(fā)送Echoreply消息的目的地址,相反,發(fā)送Echo消息的目的地址是發(fā)送Echoreply消息的源地址。Ping實際上是使用ICMP中的ECHO報文來實現(xiàn)的。Echo或EchoReply消息格式如下:012301234567890123456789012345678901+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|Type|Code|Checksum|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|Identifier|SequenceNumber|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|Data...+-+-+-+-+-Typeecho消息的類型為8echoreply的消息類型為0。Code=0Checksum為從TYPE開始到IP包結(jié)束的校驗和Identifier如果code=0,identifier用來匹配echo和echoreply消息SequenceNumber如果code=0,identifier用來匹配echo和echoreply消息功能描述:收到echo消息必須回應(yīng)echoreply消息。identifier和sequencenumber可能被發(fā)送echo的主機用來匹配返回的echoreply消息。例如:identifier可能用于類似于TCP或UDP的port用來標示一個會話,而sequencenumber會在每次發(fā)送echo請求后遞增。收到echo的主機或路由器返回同一個值與之匹配數(shù)據(jù)結(jié)構(gòu)的描述1)IP包格式structip{ BYTEVer_ihl;//版本號與包頭長度 BYTETOS;//服務(wù)類型 WORDLeng;//IP包長度 WORDId;//IP包標示,用于輔助IP包的拆裝,本實驗不用,置零 WORDFlg_offset;//偏移量,也是用于IP包的拆裝,本實驗不用,置零 BYTETTL;//IP包的存活時間 BYTEProtocol;//上一層協(xié)議,本實驗置ICMP WORDChecksum;//包頭校驗和,最初置零,等所有包頭都填寫正確后,計算并替換。 BYTESaddr[4];//源端IP地址 BYTEDaddr[4];//目的端IP地址 BYTEData[1];//IP包數(shù)據(jù)};2)ICMP包格式structicmp{ BYTEType; //ICMP類型,本實驗用8:ECHO0:ECHOREPLY BYTECode;//本實驗置零 WORDChecksum;//ICMP包校驗和,從TYPE開始,直到最后一位用戶數(shù)據(jù),如果為字節(jié)數(shù)為奇數(shù)則補充一位 WORDID;//用于匹配ECHO和ECHOREPLY包 WORDSeq;//用于標記ECHO報文順序 BYTEData[1];//用戶數(shù)據(jù)};2.3課程設(shè)計分析總體設(shè)計程序分為兩大部分:一部分讀取收到的所有消息,并輸出ICMPEchoreplay消息,另一部分每隔一秒鐘發(fā)送一個Echo消息。另一部分由SIGALARM信號每秒驅(qū)動一次。詳細設(shè)計ping程序函數(shù)概貌1)main函數(shù)2)readloop函數(shù)3)proc函數(shù)4)send函數(shù)
實驗三應(yīng)用層實驗—簡單聊天程序的設(shè)計與實現(xiàn)3.1課程設(shè)計目的聊天程序是上網(wǎng)時經(jīng)常使用的網(wǎng)絡(luò)程序,通過它大家彼此之間可以交流信息。本實驗要求完成一個聊天程序的簡單設(shè)計與實現(xiàn)。通過聊天程序的設(shè)計與實現(xiàn),可以達到如下目的:掌握網(wǎng)絡(luò)編程的知識和技能;熟悉網(wǎng)絡(luò)軟件的開發(fā)過程,鍛煉解決實際問題的能力。3.2課程設(shè)計內(nèi)容本實驗要求設(shè)計并實現(xiàn)一個簡單的聊天程序,包括服務(wù)器實現(xiàn)和客戶端實現(xiàn),具體內(nèi)容和要求如下:使用MSN或者QQ,分析聊天程序的功能需求;在給定的參考程序的基礎(chǔ)上,參考MSN或者QQ,對功能做出擴充,不局限于以下的范圍:在客戶端界面上顯示所有聯(lián)入聊天服務(wù)器的用戶;支持兩個用戶之間的聊天;支持增加好友的功能,好友上線時如果該用戶在線,則做出提醒;增加用戶的個人信息修改、保存和查詢;在聊天內(nèi)容中支持中文;在聊天內(nèi)容中支持圖片等多媒體信息;支持在用戶之間傳輸文件等附件;其他擴展。3.3相關(guān)知識套接字編程的基本知識參見附錄B.3.4課程設(shè)計分析聊天程序主要利用Java網(wǎng)絡(luò)包中的服務(wù)器套接字和客戶端套接字實現(xiàn),其核心部分的實現(xiàn)思路如下:服務(wù)器根據(jù)指定的端口創(chuàng)建服務(wù)器套接字,并在該端口偵聽連接請求;每一個新加入的客戶端創(chuàng)建客戶端套接字,與服務(wù)器進行連接;每一個連接在服務(wù)器有一個連接池保持連接;當其中的一個客戶端發(fā)出聊天信息后,對應(yīng)的連接的服務(wù)器程序在接收到該消息后,向其所維持的所有的客戶連接廣播該消息。附錄ALinux的安裝與編程1安裝Linux將RedHatLinux9的第一張光盤放到光驅(qū)中,重啟計算機,出現(xiàn)以下界面后按“回車鍵”選“簡體中文”,并按“Next(N)”按鈕按“下一步(N)”按鈕選“服務(wù)器”,并按“下一步(N)”按鈕選“自動分區(qū)(A)”,并按“下一步(N)”按鈕選“是”按鈕選“刪除系統(tǒng)內(nèi)所有的Linux分區(qū)”,并按“下一步(N)”按鈕選“是”按鈕按“下一步(N)”按鈕選“下一步(N)”按鈕按“編輯(E)”,在“編輯接口eth0”窗口中,選“引導(dǎo)式激活(A)”,并輸入機器的“IP地址”和“子網(wǎng)掩碼”,然后按“確定”在“主機名”中選“手工配置”,并在文本框中輸入服務(wù)器名,在“其它設(shè)置”中輸入該機器的網(wǎng)關(guān)和DNS信息,然后按“下一步(N)”按鈕選“無防火墻(o)”,并按“下一步(N)”按鈕在“選擇系統(tǒng)默認語言”選“Chinese(P.R.ofChina)”,在“選擇您想在該系統(tǒng)上安裝的其它語言(A)”選“English(GreatBritain)”,并按“下一步(N)”按鈕在“位置”中選“亞洲/上?!?,并按“下一步(N)”按鈕輸入root用戶的口令,并按“下一步(N)”按鈕在“選擇軟件包組”中,選“全部”,并按“下一步(N)”按鈕按“下一步(N)”按鈕選“否,我不想創(chuàng)建引導(dǎo)盤(D)”,并按“下一步(N)”按鈕按“下一步(N)”按鈕按“下一步(N)”按鈕按“下一步(N)”按鈕按“退出(E)”按鈕,安裝完成。2配置服務(wù)器網(wǎng)絡(luò)部分安裝時沒配置網(wǎng)絡(luò),或網(wǎng)絡(luò)參數(shù)需要修改假設(shè)機器IP地址為,網(wǎng)關(guān)為,DNS為2.1配置服務(wù)器的IP修改/etc/sysconfig/network-scripts/ifcfg-eth0文件,內(nèi)容大致如下DEVICE=eth0BOOTPROTO=staticBROADCAST=IPADDR=NETMASK=NETWORK=ONBOOT=yes2.2配置服務(wù)器的網(wǎng)關(guān)修改/etc/sysconfig/network文件,內(nèi)容大致如下NETWORKING=yesHOSTNAME=localhostGATEWAY=2.3配置服務(wù)器的DNS修改/etc/resolv.conf文件,內(nèi)容大致如下nameserver2.4讓新的配置起作用重啟機器或運行以下命令#servicenetworkrestart3安裝與配置SecureCRT軟件(Windows下)該客戶軟件允許計算機登錄到遠程的服務(wù)器并運行該服務(wù)器上的應(yīng)用程序。假設(shè)遠程的服務(wù)器的地址為,用戶名為abc,密碼為abc1233.1安裝SecureCRT軟件(略)3.2首次登錄按“QuickConnect”按鈕在“hostname”中輸入遠程服務(wù)器的地址,并按“Connect”按鈕選“AcceptOnce”輸入用戶“abc”的密碼“abc123”,并按“OK”按鈕在以下界面可以在遠程服務(wù)器上運行該普通用戶可以運行所有命令3.3再次登錄按“Connect”按鈕選擇要登錄的服務(wù)器,并按“Connect”3~5同“首次登陸”的3~54編輯源程序4.1用Linux下的Vi或其他編輯器編輯源程序,或4.2先在Windows下編輯源程序,然后通過Ftp傳到Linux下Linux下重啟Ftp服務(wù)命令:#servicevsftpdrestart注:需要root用戶權(quán)限。#提示符表示在root用戶下或設(shè)置vsftpd自動啟動chkconfigvsftpdon或運行ntsysv將vsftpd選上(用空格鍵選中或取消服務(wù))或echo"/usr/local/sbin/vsftpd&">>/etc/rc.local5編譯連接源程序命令格式:$gcc–o要生成的可執(zhí)行文件名源文件名注:普通用戶權(quán)限即可,$提示符表示在普通用戶下5.1編譯連接服務(wù)器程序$gcc-otcpserv01tcpserv01.c注:-o后是要輸出的可執(zhí)行文件,tcpserv01.c是服務(wù)器端的程序5.2編譯連接客戶端程序$gcc-otcpcli01tcpcli01.c注:-o后是要輸出的可執(zhí)行文件,tcpcli01.c是客戶端的程序6運行源程序格式:$./生成的可執(zhí)行文件[參數(shù)表]6.1運行服務(wù)器程序$./tcpserv01&注:&表示以后臺程序啟動6.2運行客戶端程序$./tcpcli01注:是服務(wù)器的地址7停止程序7.1查看進程命令$psaux7.2殺死后臺進程命令$kill進程號8基本TCP客戶-服務(wù)器程序的套接口函數(shù)9啟動/停止服務(wù)器daytime服務(wù)9.1啟動服務(wù)器daytime服務(wù)1.修改/etc/xinetd.d/daytime文件將其中的“disable=yes”改為“disable=no”2.啟動xinetd#/etc/rc.d/init.d/xinetdrestart9.2停止服務(wù)器daytime服務(wù)將/etc/xinetd.d/daytime文件中的“disable=no”改為“disable=yes”,并重啟xinetd即可10附:源程序清單10.1取服務(wù)器日期時間客戶端程序:daytimecli.c#include<netinet/in.h>#include<errno.h>#include<stdio.h>#defineMAXLINE4096intmain(intargc,char**argv){intsockfd,n;charrecvline[MAXLINE+1];structsockaddr_inservaddr;if(argc!=2){printf("usage:daytimecli<IPaddress>\n");exit(1);}if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){printf("socketerror.\n");exit(1);}bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(13);/*daytimeserver*/if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0){printf("inet_ptonerrorfor%s\n",argv[1]);exit(1);}if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){printf("connecterror.\n");exit(1);}while((n=read(sockfd,recvline,MAXLINE))>0){recvline[n]=0;if(fputs(recvline,stdout)==EOF){printf("fputserror.\n");exit(1);}}if(n<0){printf("readerror.\n");exit(1);}exit(0);}10.2字符回顯的服務(wù)器程序:tcpserv01.c#include<netinet/in.h>#include<errno.h>#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#defineMAXLINE4096#defineLISTENQ1024/*2ndargumenttolisten()*/#defineSERV_PORT9877#defineSAstructsockaddrvoidstr_echo(int);ssize_treadline(int,void*,size_t);staticssize_tmy_read(int,char*);intmain(intargc,char**argv){intlistenfd,connfd;pid_tchildpid;socklen_tclilen;structsockaddr_incliaddr,servaddr;if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0){printf("socketerror.\n");exit(1);}bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(SERV_PORT);if(bind(listenfd,(SA*)&servaddr,sizeof(servaddr))<0){printf("binderror.\n");exit(1);}if(listen(listenfd,LISTENQ)<0){printf("listenerror.\n");exit(1);}for(;;){clilen=sizeof(cliaddr);if((connfd=accept(listenfd,(SA*)&cliaddr,&clilen))<0){printf("accepterror.\n");exit(1);}if((childpid=fork())==0){ close(listenfd);str_echo(connfd);exit(0);}close(connfd);}} voidstr_echo(intsockfd){ssize_tn;charline[MAXLINE];for(;;){if((n=readline(sockfd,line,MAXLINE))==0)return;/*connectionclosedbyotherend*/write(sockfd,line,n);}}/*endstr_echo*/ssize_treadline(intfd,void*vptr,size_tmaxlen){intn,rc;charc,*ptr;ptr=vptr;for(n=1;n<maxlen;n++){if((rc=my_read(fd,&c))==1){*ptr++=c;if(c=='\n')break;/*newlineisstored,likefgets()*/}elseif(rc==0){if(n==1)return(0);/*EOF,nodataread*/elsebreak;/*EOF,somedatawasread*/}elsereturn(-1);/*error,errnosetbyread()*/}*ptr=0;/*nullterminatelikefgets()*/return(n);}/*endreadline*/staticssize_tmy_read(intfd,char*ptr){staticintread_cnt=0;staticchar*read_ptr;staticcharread_buf[MAXLINE];if(read_cnt<=0){again:if((read_cnt=read(fd,read_buf,sizeof(read_buf)))<0){if(errno==EINTR)gotoagain;return(-1);}elseif(read_cnt==0)return(0);read_ptr=read_buf;}read_cnt--;*ptr=*read_ptr++;return(1);}/*endssize_t*/10.3字符回顯的客戶端程序:tcpcli01.c#include<netinet/in.h>#include<errno.h>#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#defineMAXLINE4096#defineLISTENQ1024/*2ndargumenttolisten()*/#defineSERV_PORT9877#defineSAstructsockaddrvoidstr_cli(FILE*,int);ssize_treadline(int,void*,size_t);staticssize_tmy_read(int,char*);intmain(intargc,char**argv){intsockfd;structsockaddr_inservaddr;if(argc!=2){ printf("usage:tcpcli01<IPaddress>");exit(1);}if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){printf("socketerror.\n");exit(1);}bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(SERV_PORT);inet_pton(AF_INET,argv[1],&servaddr.sin_addr);if(connect(sockfd,(SA*)&servaddr,sizeof(servaddr))<0){printf("connecterror.\n");exit(1);}str_cli(stdin,sockfd);exit(0);}voidstr_cli(FILE*fp,intsockfd){charsendline[MAXLINE],recvline[MAXLINE];while(fgets(sendline,MAXLINE,fp)!=NULL){write(sockfd,sendline,strlen(sendline)); if(readline(sockfd,recvline,MAXLINE)==0){ printf("str_cli:serverterminatedprematurely.\n");exit(1);} fputs(recvline,stdout);}}/*endstr_cli*/ssize_treadline(intfd,void*vptr,size_tmaxlen){intn,rc;charc,*ptr;ptr=vptr;for(n=1;n<maxlen;n++){if((rc=my_read(fd,&c))==1){*ptr++=c;if(c=='\n')break;/*newlineisstored,likefgets()*/}elseif(rc==0){if(n==1)return(0);/*EOF,nodataread*/elsebreak;/*EOF,somedatawasread*/}elsereturn(-1);/*error,errnosetbyread()*/}*ptr=0;/*nullterminatelikefgets()*/return(n);}/*endreadline*/staticssize_tmy_read(intfd,char*ptr){staticintread_cnt=0;staticchar*read_ptr;staticcharread_buf[MAXLINE];if(read_cnt<=0){again:if((read_cnt=read(fd,read_buf,sizeof(read_buf)))<0){if(errno==EINTR)gotoagain;return(-1);}elseif(read_cnt==0)return(0);read_ptr=read_buf;}read_cnt--;*ptr=*read_ptr++;return(1);}/*endssize_t*/附錄BJava網(wǎng)絡(luò)編程基礎(chǔ)知識1Internet地址操作網(wǎng)絡(luò)中的每一臺計算機都有一個IP地址來唯一的標識。這些IP地址有4個字節(jié)長的IPv4地址,也有16個地址長的IPv6地址。為了方便記憶這些IP地址,人們使用了域名,域名服務(wù)使得域名和IP地址關(guān)聯(lián)起來。J.InetAddress類是對IP地址(包括IPv4和IPv6)的抽象和封裝,它是后續(xù)網(wǎng)絡(luò)類學(xué)習(xí)和網(wǎng)絡(luò)編程的基礎(chǔ)。1.類的聲明publicclassInetAddressimplementsSerializable該類繼承自O(shè)bject對象,并實現(xiàn)了Serializable接口。2.對象的創(chuàng)建InetAddress類提供了四個靜態(tài)的構(gòu)造方法,這三個方法如下:publicstaticInetAddressgetByAddress(Stringhost,byte[]addr)throwsUnknownHostException根據(jù)給出的IP地址和主機名創(chuàng)建一個InetAddress對象,不需要訪問域名服務(wù)獲得信息。publicstaticInetAddressgetByName(Stringhost) throwsUnknownHostException給出主機的名稱,決定主機的IP地址。publicstaticInetAddressgetByAddress(byte[]addr) throwsUnknownHostException給出原始的IP地址,返回一個InetAddress對象。這三個方法在執(zhí)行的過程中,其中后面的兩個需要連接域名服務(wù)器獲得相關(guān)的信息,并給類中的屬性進行賦值操作(如類中的屬性StringhostName,intaddress等),訪問域名服務(wù)器的操作封裝在類中的一個私有方法(privatestaticObjectgetAddressFromNameService(Stringhost))中。InetAddress.getByName(StringhostName)這個靜態(tài)構(gòu)造方法以主機名為參數(shù),使用域名服務(wù)查找該主機的IP地址。調(diào)用的代碼如下:在調(diào)用該方法的時候,如果在域名服務(wù)中沒有找到主機,會拋出UnknownHostException的異常,需要進行捕獲處理:InetAddress.getByAddress(Stringhost,byte[]addr)方法在程序員知道IP地址和域名的準確信息時使用,在該方法的執(zhí)行過程中不需要訪問域名服務(wù)獲得信息,所以在性能上會有一定的提高。有的時候一個域名會對應(yīng)多個IP地址,InetAddress.getAllByName(StringhostName)會返回一個InetAddress的數(shù)組。用法與InetAddress.getByName(StringhostName)類似,同樣在調(diào)用的時候需要捕獲UnknownHostException異常。此外,InetAddress類還提供了一個查找本機IP地址的構(gòu)造函數(shù),publicstaticInetAddressgetLocalHost()throwsUnknownHostException,該函數(shù)返回一個包含本機IP地址信息的InetAddress對象。3.屬性讀取方法InetAddress包含了主機名(StringhostName)和IP地址(intaddress)兩個關(guān)鍵屬性,這兩個屬性在類創(chuàng)建的過程中完成賦值,并提供了四個屬性讀取的方法來獲得這些屬性。publicbyte[]getAddress()方法會以網(wǎng)絡(luò)字節(jié)順序的字節(jié)數(shù)組的方式獲得IP地址,使用該方法的原因就是用來進行IP地址的屬性判斷,如判斷一個IP地址是IPv4地址還是一個IPv6地址,這可以通過字節(jié)數(shù)組的長度來進行判斷,如果長度為4則是IPv4的地址,如果長度為16則為IPv6的地址。通常的用法如下:publicStringgetCanonicalHostName()方法用來返回規(guī)范化的域名。通常的用法如下:publicStringgetHostAddress()方法返回文本格式的IP地址,如,用法與上面的方法類似,不再詳細介紹。publicStringgetHostName()方法返回字符串類型的主機名,如果該主機沒有主機名,則返回文本格式的IP地址,用法與上面的方法類似,不再詳細介紹。4.地址類型判斷方法不同的地址具有不同的特征,有的是本地地址,有的是組播地址。Java提供了大量的方法進行地址類型的判斷,方便用戶針對不同的地址類型進行后續(xù)處理工作,如表1-1所示:表1-1IP地址類型判斷方法方法聲明說明publicbooleanisMulticastAddress()判斷InetAddress是不是組播地址publicbooleanisAnyLocalAddress()判斷InetAddress是不是通配地址publicbooleanisLoopbackAddress()判斷InetAddress是不是回路地址publicbooleanisLinkLocalAddress()判斷InetAddress是不是本地鏈接地址publicbooleanisSiteLocalAddress()判斷InetAddress是不是本地網(wǎng)站地址publicbooleanisMCGlobal()判斷InetAddress是不是全球組播地址publicbooleanisMCNodeLocal()判斷InetAddress是不是本地接口組播地址publicbooleanisMCLinkLocal()判斷InetAddress是不是子網(wǎng)范圍組播地址publicbooleanisMCSiteLocal()判斷InetAddress是不是網(wǎng)站范圍組播地址publicbooleanisMCOrgLocal()判斷InetAddress是不是組織范圍組播地址publicbooleanisReachable(inttimeout)throwsIOException判斷InetAddress是不是在規(guī)定時間內(nèi)可達上面的地址類型判斷和測試IP地址的可達性主要是針對一些比較專業(yè)的應(yīng)用,開發(fā)普通網(wǎng)絡(luò)應(yīng)用的程序員不必深究。2URL和URLConnectionURL(UniformResourceLocator:統(tǒng)一資源定位符)用來標識Internet上資源的位置,典型的URL如URL類URL類是對URL的抽象,URL類根據(jù)URL的各個組成部分設(shè)置了不同的屬性,如協(xié)議、主機名、端口、路徑、文件名等等,這些屬性的設(shè)置方法只對包內(nèi)成員可見,但是具有公共的屬性讀取方法來獲得它們的值。(1)類的聲明publicfinalclassURLimplementsjava.io.Serializable該類繼承子java.lang.Object對象,并實現(xiàn)了java.io.Serializable接口。它是一個final類型的類,也就是不能基于URL類派生新的子類。(2)對象的創(chuàng)建URL類提供了六個普通的構(gòu)造函數(shù),用于創(chuàng)建一個URL對象。這六個構(gòu)造函數(shù)的區(qū)別在于輸入的參數(shù)不同,也就是創(chuàng)建URL對象時擁有的信息不同。在創(chuàng)建對象時如果創(chuàng)建沒有提供支持的協(xié)議的時候,會拋出不良URL的異常(MalformedURLException)。這六個構(gòu)造函數(shù)的列表和說明如表2-1所示。表2-1URL對象的構(gòu)造方法方法聲明說明publicURL(Stringprotocol,Stringhost,intport,Stringfile,URLStreamHandlerhandler)throwsMalformedURLException根據(jù)給定的協(xié)議、主機、端口、文件和流處理器創(chuàng)建URL對象。host可以是主機名或者文本類型的IP地址。如果port傳入的數(shù)值是-1,則表示采用該支持協(xié)議的默認端口。每一個URL對象在工作時都有一個URL的流處理器,這里可以制定一個定制的流處理器,而不是采用默認值。給出的參數(shù)不合法會拋出MalformedURLException。publicURL(Stringspec)throwsMalformedURLException給定一個字符串表示的URL構(gòu)造一個URL對象,這是創(chuàng)建URL對象的最簡單的方式。給出的參數(shù)不合法會拋出MalformedURLException。publicURL(URLcontext,Stringspec)throwsMalformedURLException在上下文URL和相對URL的基礎(chǔ)上構(gòu)造一個新的URL對象。給出的參數(shù)不合法會拋出MalformedURLException。publicURL(URLcontext,Stringspec,URLStreamHandlerhandler)throwsMalformedURLException在上下文URL和相對URL的基礎(chǔ)上構(gòu)造一個新的URL對象,并給定定制的流處理器。給出的參數(shù)不合法會拋出MalformedURLExceptionpublicURL(Stringprotocol,Stringhost,Stringfile)throwsMalformedURLException根據(jù)給定的協(xié)議、主機和文件來創(chuàng)建URL對象。host可以是主機名或者文本類型的IP地址。給出的參數(shù)不合法會拋出MalformedURLException。publicURL(Stringprotocol,Stringhost,intport,Stringfile)throwsMalformedURLException根據(jù)給定的協(xié)議、主機、端口和文件來創(chuàng)建URL對象。host可以是主機名或者文本類型的IP地址。如果port傳入的數(shù)值是-1,則表示采用該支持協(xié)議的默認端口。給出的參數(shù)不合法會拋出MalformedURLException。通常的用法如下:(3)屬性的讀取方法我們已經(jīng)知道一個典型的URL是由協(xié)議、主機名、路徑、端口等若干個部分組成的。URL類把這些URL的若干部分實現(xiàn)為類的屬性,并提供了讀取這些屬性的方法,如表2-2所示。表2-2URL類的屬性讀取方法方法聲明說明publicStringgetQuery()獲得URL的查詢字符串部分,如果URL不包含一個查詢字符串,則返回null。publicStringgetPath()獲得URL的路徑部分,如果URL中不包含一個路徑,則返回null。與getFile()不同的是,它只包含路徑,不包含查詢字符串。publicStringgetAuthority()獲得URL的授權(quán)部分,通常授權(quán)信息包括用戶名和口令等用戶信息、主機和端口。publicintgetPort()獲得URL的端口部分,如果端口沒有設(shè)置,則返回-1。publicintgetDefaultPort()獲得與URL中協(xié)議相關(guān)的默認端口,如果沒有定義默認端口則返回-1。publicStringgetProtocol()獲得URL中的協(xié)議名稱部分。publicStringgetHost()獲得URL中的主機名部分。publicStringgetFile()獲得URL中的文件名部分,如果URL中沒有包含查詢字符串,則該方法與getPath()的返回值是一樣的;如果URL中包含了查詢字符串,則該方法除了getPath()的內(nèi)容以外,還包含查詢字符串。publicStringgetRef()獲得URL中的片斷標識符部分,如果URL中沒有片斷標識符,則返回null。通常的用法如下:(4)判斷方法publicbooleansameFile(URLother)用來比較兩個URL指向的是不是同一個文件,通常用法如下:(5)從指定的URL中獲得數(shù)據(jù)的方法僅僅封裝URL并不是URL類的目的,建立URL類的目的是從URL指向的位置獲得數(shù)據(jù)。URL提供了5個從URL指向的位置獲取數(shù)據(jù)的方法。publicURLConnectionopenConnection()throwsIOExceptionpublicURLConnectionopenConnection(Proxyproxy)throwsIOException前面的這兩個方法都是返回一個.URLConnection對象,關(guān)于URLConnection對象的使用在后文中會有詳細介紹。publicfinalInputStreamopenStream()throwsIOException獲得該URL的一個連接,并返回一個InputStream對象從該連接中獲得數(shù)據(jù)。該方法就是openConnection().getInputStream()的縮寫。它的使用方法在URLConnection對象時有詳細介紹。publicfinalObjectgetContent()throwsIOException該方法獲得URL指向資源的內(nèi)容,并嘗試把它轉(zhuǎn)換一個對象,是openConnnection().getContent()的縮寫。該方法的通常用法如下:publicfinalObjectgetContent(Class[]classes)throwsIOException在getContent()方法的使用過程中,我們會發(fā)現(xiàn)因為不知道獲得的對象的類別,所以在實際的應(yīng)用過程中很難進行有針對性的處理。該方法嘗試以類數(shù)組中的類對象來完成內(nèi)容的轉(zhuǎn)換,這樣就比較有針對性?!镎堊⒁狻镌贘ava中,網(wǎng)絡(luò)數(shù)據(jù)的傳輸都是建立在流(Stream)的基礎(chǔ)上,所以發(fā)送、接受數(shù)據(jù)和讀、寫文件沒有分別,使用的都是Java的I/O機制,這也就是在URL對象獲得數(shù)據(jù)的時候拋出都是IOException的原因。2.URLConnection類URLConnection是一個抽象類,它是表示應(yīng)用程序和一個URL之間的通信連接的所有類的基類。該類的實例既可以向URL所指向的資源寫入數(shù)據(jù),也可以從資源讀取數(shù)據(jù)。對于與服務(wù)器的交互,URLConnection提供了更多的控制。URLConnection提供了更加易于使用、更加高級的網(wǎng)絡(luò)連接,但是它更加貼近于HTTP協(xié)議,非常適用于連接HTTP服務(wù)器??偟恼f來,創(chuàng)建一個URLConnection可以分為以下幾個步驟:通過訪問URL對象的openConnection()方法創(chuàng)建connection對象;配置啟動參數(shù)和總的請求屬性;使用connect()方法創(chuàng)建與遠程對象的實際連接;創(chuàng)建完連接以后,遠程對象就可以訪問了,訪問的內(nèi)容包括首部字段和內(nèi)容。(1)對象的創(chuàng)建protectedURLConnection(URLurl)URLConnection類只有一個受保護的構(gòu)造函數(shù),不能基于該構(gòu)造函數(shù)創(chuàng)建對象,只能通過別的類的openConnection()方法來創(chuàng)建,本書重點介紹基于前文介紹的URL類創(chuàng)建URLConnection的方法。創(chuàng)建URLConnection對象的通常用法如下:URLConnection作為一個抽象類,它具有一個抽象方法publicabstractvoidconnect()throwsIOException,該方法在派生子類的時候必須得到實現(xiàn),它負責建立與服務(wù)器的連接。(2)獲得頭部信息一個客戶與服務(wù)器的交互協(xié)議可能設(shè)置一個頭部,頭部一般包括一些控制信息。例如HTTP的頭部包括所請求文檔的內(nèi)容類型、文檔長度、編碼字符集、時間等信息。URLConnection提供了讀取頭部信息的大量的函數(shù),如表2-3所示。表2-3頭部信息讀取方法方法聲明說明publicintgetContentLength()獲得content-length頭部信息,也就是URL所指向的資源的內(nèi)容的長度,如果長度不可知,則返回-1。publicStringgetContentType()獲得content-type頭部信息,也就是URL所指向的資源的內(nèi)容類型,如果未知,則返回null。publicStringgetContentEncoding()獲得content-encoding頭部信息,也就是URL所指向的資源的內(nèi)容編碼,如果未知,則返回null。publiclonggetExpiration()獲得expire頭部信息,也就是URL指向的資源的過期日期,如果未知則返回0。publiclonggetDate()獲得date頭部信息,也就是URL指向的資源的發(fā)送日期,如果未知則返回0。publiclonggetLastModified()獲得last-modified頭部信息,也就是URL指向的資源的最后修改日期,如果未知則返回0。publicStringgetHeaderField(Stringname)獲得指定名稱的頭部字段,publicintgetHeaderFieldInt(Stringname,intDefault)獲得指定名稱的頭部信息,并嘗試把它轉(zhuǎn)換成為一個整數(shù)。publiclonggetHeaderFieldDate(Stringname,longDefault)獲得指定名稱的頭部信息,并嘗試把它轉(zhuǎn)換成為一個日期。publicStringgetHeaderFieldKey(intn)獲得第n個頭部字段的鍵值。publicStringgetHeaderField(intn)獲得第n個頭部字段的值。(3)配置啟動參數(shù)和請求屬性URLConnection提供了七個屬性進行數(shù)據(jù)傳輸過程的控制:protectedURLurl;protectedbooleandoInput=true;protectedbooleandoOutput=false;protectedbooleanallowUserInteraction=defaultAllowUserInteraction;protectedbooleanuseCaches=defaultUseCaches;protectedlongifModifiedSince=0;protectedbooleanconnected=false;并提供了設(shè)置這些屬性和讀取這些屬性的方法,如publicvoidsetDoInput(booleandoInput)和publicbooleangetDoInput(),這些方法一般在連接之前完成設(shè)置。(4)發(fā)送和接受數(shù)據(jù)讀取數(shù)據(jù)的流程如下:調(diào)用URL對象的openConnection()方法,獲得URLConnection對象;調(diào)用URLConnection對象的getInputStream()方法獲得一個輸入流;使用輸入流操作數(shù)據(jù)通常的用法如下:發(fā)送數(shù)據(jù)的流程與寫入數(shù)據(jù)的流程基本類似,不同的是,調(diào)用的是URLConnection對象的獲得輸出流的方法3套接字編程套接字(Socket)是一種軟件形式的抽象,用于表達兩臺機器間一個連接的兩端。針對一個連接,每臺機器上都有一個套接字。在Java中,我們創(chuàng)建一個套接字,用它建立與其他機器的連接,得到的結(jié)果是一個InputStream以及OutputStream,從而將連接作為一個IO流對象對待。有兩個基于流的套接字類:.ServerSocket和.Socket,分別用于服務(wù)器端和客戶端建立套接字連接。1.客戶端套接字使用客戶端套接字進行編程的步驟一般包括:構(gòu)造一個新的套接字對象;使用新創(chuàng)建的套接字對象連接遠程服務(wù)器;連接成功,從套接字獲得輸入流和輸出流,進而開始發(fā)送和接受數(shù)據(jù);數(shù)據(jù)傳輸完畢,關(guān)閉連接。下面我們開始針對上面的每一個步驟進行說明。(1)新建一個套接字對象客戶端套接字總共提供了9個構(gòu)造函數(shù),其中一個是受保護類型(protected),只能用于派生類提供自己的套接字實現(xiàn)時使用;兩個用于構(gòu)造UDP傳輸?shù)臉?gòu)造函數(shù)已經(jīng)廢棄,采用新的數(shù)據(jù)報套接字(DatagramSocket)替代;還有兩個用于創(chuàng)建未連接的客戶端套接字對象的構(gòu)造函數(shù),在基于客戶端套接字類派生新的子類實現(xiàn)一種特殊的套接字類的時候使用;剩余的4個構(gòu)造函數(shù)經(jīng)常用于創(chuàng)建套接字對象,這里給予詳細介紹。publicSocket(Stringhost,intport) throwsUnknownHostException,IOException這個構(gòu)造函數(shù)用于創(chuàng)建一個指定主機上的指定端口的套接字,并且嘗試連接遠程主機。host是用字符串表示的主機名,port是0~65535之間的整數(shù)值,表示端口。因為在該構(gòu)造函數(shù)不僅僅是創(chuàng)建套接字對象,還嘗試連接遠程的主機,所以當給定的主機名無法解析時會拋出UnknownHostException異常;其他原因?qū)е聼o法連接時會拋出IOException異常。通常的用法如下:publicSocket(InetAddressaddress,intport)throwsIOException這個構(gòu)造函數(shù)與上一個構(gòu)造函數(shù)類似,同樣是構(gòu)造一個指定主機上的指定端口的套接字,并且嘗試連接遠程主機,不同的是傳入的參數(shù)不同,它使用InetAddress對象指定主機,而不是使用字符串形式的主機名。如果在連接主機的過程中出現(xiàn)無
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年老年人護理專業(yè)資格考試試題及答案
- 2025年軍事理論課程考核試卷及答案
- 2025年歷史學(xué)教師資格考試試題及答案
- 2018年全國高聯(lián)B卷二試答案
- 品牌酒店合同協(xié)議
- 戀愛終止協(xié)議合同書范本
- 櫥柜供應(yīng)商合同協(xié)議
- 商家聯(lián)盟合作合同協(xié)議
- 正規(guī)臨時用工協(xié)議書范本
- 民俗園生意轉(zhuǎn)讓合同協(xié)議
- 2025年wset二級試題及答案
- 《ITIL學(xué)習(xí)分享》課件
- 2024-2025學(xué)年人教版(2024)七年級英語下冊Unit 6 rain or shine Section A 2a-2e 教案
- 《東巴常用字典》東巴文-字典
- 2025年廣東順德控股集團招聘筆試參考題庫含答案解析
- 2025年陜西延長石油集團招聘筆試參考題庫含答案解析
- 《凝結(jié)水精處理》課件
- 噢易教育桌面云解決方案
- 執(zhí)行立案申請書模版
- 大學(xué)答題紙模板
- 福建省寧德福鼎市2024-2025學(xué)年七年級上學(xué)期期中考試語文試題
評論
0/150
提交評論