




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
《計算機網(wǎng)絡(luò)原理》實驗指導(dǎo)書課程代碼:0660086天津理工大學(xué)計算機計算機科學(xué)與工程學(xué)院2023年9月
目錄一、實驗指導(dǎo)書的選用范圍 1二、計算機網(wǎng)絡(luò)技術(shù)課程簡介 1三、實驗的地位、作用和目的及學(xué)生能力標(biāo)準(zhǔn) 1四、實驗方式與基本規(guī)定 1五、考核方式與實驗報告規(guī)定 2六、實驗項目 2實驗一:驗證常用網(wǎng)絡(luò)命令 2實驗1.1驗證常用的網(wǎng)絡(luò)命令 2實驗1.2用telnet方式收發(fā)郵件 11實驗二:基于TCP/UDP的Socket編程 14實驗2.1:基于TCPandUDP的socket編程 14實驗2.2:基于TCP的WebServer 14實驗2.3:基于TCP/UDP的Daytime的客戶端和服務(wù)器端 14實驗2.4:基于TCP/UDP的Echo的客戶端和服務(wù)器端 15實驗2.5SOCKET編程實現(xiàn)聊天程序 15實驗2.6SOCKET編程實現(xiàn)miniFTPClient/Server程序 15附錄1參考程序 16附錄2網(wǎng)絡(luò)編程接口WinSockAPI 19實驗三:模擬環(huán)境下的路由器配置 263.1[BosonRouterSimulator4.3安裝及注冊] 263.2[BosonRouterSimulator啟動及使用] 323.3實驗習(xí)題 36七、實驗重要儀器名稱 42八、課程設(shè)計交付成果說明 42
一、實驗指導(dǎo)書的選用范圍課程名稱:計算機網(wǎng)絡(luò)原理所屬專業(yè):計算機科學(xué)與技術(shù)、信息與計算科學(xué)領(lǐng)域方向:網(wǎng)絡(luò)編程,網(wǎng)絡(luò)管理,網(wǎng)絡(luò)安全等相關(guān)方向參考學(xué)時:課內(nèi)12學(xué)時,課外12學(xué)時以上合用學(xué)生:計算機及相關(guān)專業(yè)的本科生先修課規(guī)定:《通信原理基礎(chǔ)》、《數(shù)據(jù)結(jié)構(gòu)》、《面向?qū)ο蟪绦蛟O(shè)計C++》、《計算機組成原理》等實驗成績占總成績:20% 大綱依據(jù):課程指導(dǎo)委員會指導(dǎo)意見二、計算機網(wǎng)絡(luò)技術(shù)課程簡介本課程是計算機科學(xué)與技術(shù)專業(yè)必修課。課程教學(xué)目的是立足于介紹本方向的基本概念、技術(shù)和方法,為使學(xué)生能追蹤網(wǎng)絡(luò)技術(shù)最新發(fā)展而奠定基礎(chǔ)。通過網(wǎng)絡(luò)實驗,規(guī)定學(xué)生掌握網(wǎng)絡(luò)技術(shù)的發(fā)展規(guī)律,掌握網(wǎng)絡(luò)技術(shù)的基本概念、基本原理和基本技術(shù)等知識,可以編寫網(wǎng)絡(luò)軟件、設(shè)計一般的網(wǎng)絡(luò)并能分析網(wǎng)絡(luò)的性能及解決網(wǎng)絡(luò)中的問題。本實驗課分為驗證性實驗和綜合性實驗。三、實驗的地位、作用和目的及學(xué)生能力標(biāo)準(zhǔn)計算機網(wǎng)絡(luò)技術(shù)實驗是計算機專業(yè)的必修課程《計算機網(wǎng)絡(luò)技術(shù)》的重要組成部分。通過實驗,可以填補課堂理論教學(xué)中的局限性,增強學(xué)生對所學(xué)知識的感性結(jié)識;掌握網(wǎng)絡(luò)操作的一般知識;深化理論知識,使理論與實踐結(jié)合起來;培養(yǎng)學(xué)生設(shè)計實驗方案的能力和運用所學(xué)知識解決實際問題的能力。規(guī)定學(xué)生掌握網(wǎng)絡(luò)技術(shù)的發(fā)展規(guī)律,掌握網(wǎng)絡(luò)技術(shù)的基本概念、基本原理和基本技術(shù)等知識,可以編寫網(wǎng)絡(luò)軟件、設(shè)計一般的網(wǎng)絡(luò)并能分析網(wǎng)絡(luò)的性能及解決網(wǎng)絡(luò)中的問題。四、實驗方式與基本規(guī)定1、實驗開始前,指導(dǎo)教師要講解實驗過程和注意事項。2、實驗分為學(xué)生獨立完畢實驗以及小組完畢實驗兩種。3、實驗過程中要具體記錄實驗過程和結(jié)果。4、在實驗結(jié)束后一周之內(nèi)完畢實驗報告。小組實驗的,要注明每個人的分工。實驗報告按照統(tǒng)一規(guī)定填寫。五、考核方式與實驗報告規(guī)定實驗考核從兩方面評估每次的實驗成績:實驗操作完畢情況和實驗報告書寫質(zhì)量。實驗操作情況:指導(dǎo)教師根據(jù)學(xué)生的實驗準(zhǔn)備情況、實驗情況、源程序質(zhì)量、回答問題情況、實驗紀(jì)律等方面給分。實驗報告書寫:學(xué)生在實驗后的一周內(nèi)提交打印好的實驗報告。教師根據(jù)實驗報告質(zhì)量評估成績。3實驗總成績=1/3(∑第i次實驗成績)i=1六、實驗項目實驗一:驗證常用網(wǎng)絡(luò)命令[實驗?zāi)康腯:熟悉windows下的一些網(wǎng)絡(luò)命令的功能和使用方法。進而能用這些命令察看網(wǎng)絡(luò)的狀況并解決網(wǎng)絡(luò)中的一些問題。掌握收發(fā)郵件的命令。[實驗規(guī)定]:1、請嘗試以下一些windows下的網(wǎng)絡(luò)命令,記錄實驗的過程、結(jié)果以及碰到的問題及解決方法。2、telnet收發(fā)電子郵件。[實驗過程]:實驗1.1驗證常用的網(wǎng)絡(luò)命令實驗內(nèi)容⑴ARP:顯示和修改IP地址與物理地址之間的轉(zhuǎn)換表ARP-sinet_addreth_addr[if_addr]ARP-dinet_addr[if_addr]ARP-a[inet_addr][-Nif_addr]-a顯示當(dāng)前的ARP信息,可以指定網(wǎng)絡(luò)地址-g跟-a同樣.-d刪除由inet_addr指定的主機.可以使用*來刪除所有主機.-s添加主機,并將網(wǎng)絡(luò)地址跟物理地址相相應(yīng),這一項是永久生效的。eth_addr物理地址.if_addrIfpresent,thisspecifiestheInternetaddressoftheinterfacewhoseaddresstranslationtableshouldbemodified.Ifnotpresent,thefirstapplicableinterfacewillbeused.例子:C:\>arp–a(顯示當(dāng)前所有的表項)Interface:1onInterface0x1000003InternetAddressPhysicalAddressType00-01-f4-0c-8e-3bdynamic//物理地址一般為48位即6個字節(jié)1252-54-ab-21-6a-0edynamic5352-54-ab-1b-6b-0adynamicC:\>arp-a1(只顯示其中一項)NoARPEntriesFoundC:\>arp-a(只顯示其中一項)Interface:1onInterface0x1000003InternetAddressPhysicalAddressType00-01-f4-0c-8e-3bdynamicC:\>arp-s1200-aa-00-62-c6-09添加,可以再打入arp–a驗證是否已經(jīng)加入.⑵ftp文獻傳輸命令該命令只有在安裝了TCP/IP協(xié)議之后才可用。Ftp是一種服務(wù),一旦啟動,將創(chuàng)建在其中可以使用ftp命令的子環(huán)境,通過鍵入quit子命令可以從子環(huán)境返回到Windows2023命令提醒符。當(dāng)ftp子環(huán)境運營時,它由ftp命令提醒符代表。ftp[-v][-n][-i][-d][-g][-s:filename][-a][-w:windowsize][computer]參數(shù)-v嚴(yán)禁顯示遠(yuǎn)程服務(wù)器響應(yīng)。-n嚴(yán)禁自動登錄到初始連接。-I多個文獻傳送時關(guān)閉交互提醒。-d啟用調(diào)試、顯示在客戶端和服務(wù)器之間傳遞的所有ftp命令。-g禁用文獻名組,它允許在本地文獻和途徑名中使用通配符字符(*和?)。(請參閱聯(lián)機“命令參考”中的glob命令。)-s:filename指定包含ftp命令的文本文獻;當(dāng)ftp啟動后,這些命令將自動運營。該參數(shù)中不允許有空格。使用該開關(guān)而不是重定向(>)。-a在捆綁數(shù)據(jù)連接時使用任何本地接口。-w:windowsize替代默認(rèn)大小為4096的傳送緩沖區(qū)。Computer指定要連接到遠(yuǎn)程計算機的計算機名或IP地址。假如指定,計算機必須是行的最后一個參數(shù)。下面是一些常用命令:?。簭膄tp子系統(tǒng)退出到系統(tǒng)外殼?:顯示ftp說明,跟help同樣append:添加文獻,格式為:append本地文獻遠(yuǎn)程文獻cd:更換遠(yuǎn)程目錄lcd:更換本地目錄,若無參數(shù),將顯示當(dāng)前目錄open:與指定的ftp服務(wù)器連接opencomputer[port]close:結(jié)束與遠(yuǎn)程服務(wù)器的FTP會話并返回命令解釋程序bye:結(jié)束與遠(yuǎn)程計算機的FTP會話并退出ftpdir:結(jié)束與遠(yuǎn)程計算機的FTP會話并退出ftpget和recv:使用當(dāng)前文獻轉(zhuǎn)換類型將遠(yuǎn)程文獻復(fù)制到本地計算機getremote-file[local-file]send和put:上傳文獻:sendlocal-file[remote-file]其它命令請參考幫助文獻。例子:C:\>ftpftp>openConnectedto.220ProFTPD1.2.0pre9Server(浙江大學(xué)自由軟件服務(wù)器)[]User(:(none)):anonymous331Anonymousloginok,sendyourcompletee-mailaddressaspassword.Password:230Anonymousaccessgranted,restrictionsapply.ftp>dir//查看本目錄下的內(nèi)容:…ftp>cdpub//切換目錄250CWDcommandsuccessful.ftp>dir200PORTcommandsuccessful.150OpeningASCIImodedataconnectionforfilelist.…ftp>cdmicrosoft250CWDcommandsuccessful.ftp>dir200PORTcommandsuccessful.150OpeningASCIImodedataconnectionforfilelist.-rw-r--r--1ftpftp288632Dec81999chargeni.exe226Transfercomplete.ftp:69bytesreceivedin0.01Seconds6.90Kbytes/sec.ftp>lcde:\//本地目錄切換LocaldirectorynowE:\.ftp>getchargeni.exe//下載文獻200PORTcommandsuccessful.150OpeningASCIImodedataconnectionforchargeni.exe(288632bytes).226Transfercomplete.ftp:289739bytesreceivedin0.36Seconds802.60Kbytes/sec.ftp>bye//離開221Goodbye.⑶Ipconfig該診斷命令顯示所有當(dāng)前的TCP/IP網(wǎng)絡(luò)配置值。該命令在運營DHCP系統(tǒng)上的特殊用途,允許用戶決定DHCP配置的TCP/IP配置值。ipconfig[/?|/all|/release[adapter]|/renew[adapter]|/flushdns|/registerdns|/showclassidadapter|/setclassidadapter[classidtoset]]/all產(chǎn)生完整顯示。在沒有該開關(guān)的情況下ipconfig只顯示IP地址、子網(wǎng)掩碼和每個網(wǎng)卡的默認(rèn)網(wǎng)關(guān)值。例如:C:\>ipconfigWindows2023IPConfigurationEthernetadapter本地連接:Connection-specificDNSSuffix.:IPAddress............:1//IP地址SubnetMask...........://子網(wǎng)掩碼DefaultGateway.........://缺省網(wǎng)關(guān)C:\>ipconfig/displaydns//顯示本機上的DNS域名解析列表C:\>ipconfig/flushdns//刪除本機上的DNS域名解析列表⑷Nbtstat該診斷命令使用NBT(TCP/IP上的NetBIOS)顯示協(xié)議記錄和當(dāng)前TCP/IP連接。該命令只有在安裝了TCP/IP協(xié)議之后才可用。nbtstat[-aremotename][-AIPaddress][-c][-n][-R][-r][-S][-s][interval]參數(shù)-aremotename使用遠(yuǎn)程計算機的名稱列出其名稱表。-AIPaddress使用遠(yuǎn)程計算機的IP地址并列出名稱表。-c給定每個名稱的IP地址并列出NetBIOS名稱緩存的內(nèi)容。-n列出本地NetBIOS名稱?!耙炎浴北戆自撁Q已被廣播(Bnode)或者WINS(其他節(jié)點類型)注冊。-R清除NetBIOS名稱緩存中的所有名稱后,重新裝入Lmhosts文獻。-r列出Windows網(wǎng)絡(luò)名稱解析的名稱解析記錄。在配置使用WINS的Windows2023計算機上,此選項返回要通過廣播或WINS來解析和注冊的名稱數(shù)。-S顯示客戶端和服務(wù)器會話,只通過IP地址列出遠(yuǎn)程計算機。-s顯示客戶端和服務(wù)器會話。嘗試將遠(yuǎn)程計算機IP地址轉(zhuǎn)換成使用主機文獻的名稱。interval重新顯示選中的記錄,在每個顯示之間暫停interval秒。按CTRL+C停止重新顯示記錄信息。假如省略該參數(shù),nbtstat打印一次當(dāng)前的配置信息。例子:C:\>nbtstat–A周邊主機的ip地址C:\>nbtstat–cC:\>nbtstat–nC:\>nbtstat-S本地連接:NodeIpAddress:[1]ScopeId:[]NetBIOSConnectionTableLocalNameStateIn/OutRemoteHostInputOutputJJY<03>Listening此外可以加上間隔時間,以秒為單位⑸net:許多Windows2023網(wǎng)絡(luò)命令都以詞net開頭。這些net命令有一些公用屬性:鍵入net/?可以看到所有可用的net命令的列表。鍵入nethelpcommand,可以在命令行獲得net命令的語法幫助。例如,關(guān)于netaccounts命令的幫助信息,請鍵入nethelpaccounts。所有net命令都接受/yes和/no選項(可以縮寫為/y和/n)。/y選項向命令產(chǎn)生的任何交互式提醒自動回答“是”,而/n回答“否”。例如,netstopserver通常提醒您確認(rèn)要停止基于“服務(wù)器”服務(wù)的所有服務(wù);而netstopserver/y對該提醒自動回答“是”,然后“服務(wù)器”服務(wù)關(guān)閉。例如:Netsend:(也許許多人已經(jīng)用過,或者感到厭煩,索性把服務(wù)給關(guān)了)將消息發(fā)送到網(wǎng)絡(luò)上的其他用戶、計算機或消息名。必須運營信使服務(wù)以接受郵件。netsend{name|*|/domain[:name]|/usersmessage}Netstop:停止Windows2023網(wǎng)絡(luò)服務(wù)。netstopservice例如:C:\>netstopmessengerMessenger服務(wù)正在停止.Messenger服務(wù)已成功停止。此時再打入netsend本機名消息,就沒用了;相應(yīng)的,要打開這個服務(wù),只需把stop改為start,就可以了。NetstartFTPPublishingService啟動FTP發(fā)布服務(wù)。該命令只有在安裝了Internet信息服務(wù)后才可用。netstart"ftppublishingservice"類似的命令有很多,請參考幫助文獻。⑹Netstat顯示協(xié)議記錄和當(dāng)前的TCP/IP網(wǎng)絡(luò)連接。該命令只有在安裝了TCP/IP協(xié)議后才可以使用。netstat[-a][-e][-n][-s][-pprotocol][-r][interval]參數(shù)-a顯示所有連接和偵聽端口。服務(wù)器連接通常不顯示。-e顯示以太網(wǎng)記錄。該參數(shù)可以與-s選項結(jié)合使用。-n以數(shù)字格式顯示地址和端標(biāo)語(而不是嘗試查找名稱)。-s顯示每個協(xié)議的記錄。默認(rèn)情況下,顯示TCP、UDP、ICMP和IP的記錄。-p選項可以用來指定默認(rèn)的子集。-pprotocol顯示由protocol指定的協(xié)議的連接;protocol可以是tcp或udp。假如與-s選項一同使用顯示每個協(xié)議的記錄,protocol可以是tcp、udp、icmp或ip。-r顯示路由表的內(nèi)容。Interval重新顯示所選的記錄,在每次顯示之間暫停interval秒。按CTRL+B停止重新顯示記錄。假如省略該參數(shù),netstat將打印一次當(dāng)前的配置信息。例如:C:\>netstat-asIPStatisticsPacketsReceived=256325…ICMPStatisticsReceivedSentMessages1668…TCPStatistics…SegmentsReceived=41828UDPStatisticsDatagramsReceived=82401…⑺Ping驗證與遠(yuǎn)程計算機的連接。該命令只有在安裝了TCP/IP協(xié)議后才可以使用。ping[-t][-a][-ncount][-llength][-f][-ittl][-vtos][-rcount][-scount][[-jcomputer-list]|[-kcomputer-list]][-wtimeout]destination-list參數(shù)-tPing指定的計算機直到中斷。-a將地址解析為計算機名。-ncount發(fā)送count指定的ECHO數(shù)據(jù)包數(shù)。默認(rèn)值為4。-llength發(fā)送包含由length指定的數(shù)據(jù)量的ECHO數(shù)據(jù)包。默認(rèn)為32字節(jié);最大值是65,527。-f在數(shù)據(jù)包中發(fā)送“不要分段”標(biāo)志。數(shù)據(jù)包就不會被路由上的網(wǎng)關(guān)分段。-ittl將“生存時間”字段設(shè)立為ttl指定的值。-vtos將“服務(wù)類型”字段設(shè)立為tos指定的值。-rcount在“記錄路由”字段中記錄傳出和返回數(shù)據(jù)包的路由。count可以指定最少1臺,最多9臺計算機。-scount指定count指定的躍點數(shù)的時間戳。-jcomputer-list運用computer-list指定的計算機列表路由數(shù)據(jù)包。連續(xù)計算機可以被中間網(wǎng)關(guān)分隔(路由稀疏源)IP允許的最大數(shù)量為9。-kcomputer-list運用computer-list指定的計算機列表路由數(shù)據(jù)包。連續(xù)計算機不能被中間網(wǎng)關(guān)分隔(路由嚴(yán)格源)IP允許的最大數(shù)量為9。-wtimeout指定超時間隔,單位為毫秒。destination-list指定要ping的遠(yuǎn)程計算機。較一般的用法是ping–t.例如:C:\>ping.Pinging[1]with32bytesofdata:Replyfrom1:bytes=32time=10msTTL=253Replyfrom1:bytes=32time<10msTTL=253Replyfrom1:bytes=32time<10msTTL=253Replyfrom1:bytes=32time<10msTTL=253Pingstatisticsfor1:Packets:Sent=4,Received=4,Lost=0(0%loss),Approximateroundtriptimesinmilli-seconds:Minimum=0ms,Maximum=10ms,Average=2ms⑻Route控制網(wǎng)絡(luò)路由表。該命令只有在安裝了TCP/IP協(xié)議后才可以使用。route[-f][-p][command[destination][masksubnetmask][gateway][metriccostmetric]]參數(shù)-f清除所有網(wǎng)關(guān)入口的路由表。假如該參數(shù)與某個命令組合使用,路由表將在運營命令前清除。-p該參數(shù)與add命令一起使用時,將使路由在系統(tǒng)引導(dǎo)程序之間持久存在。默認(rèn)情況下,系統(tǒng)重新啟動時不保存路由。與print命令一起使用時,顯示已注冊的持久路由列表。忽略其他所有總是影響相應(yīng)持久路由的命令。Command指定下列的一個命令。命令目的print打印路由add添加路由delete刪除路由change更改現(xiàn)存路由destination指定發(fā)送command的計算機。masksubnetmask指定與該路由條目關(guān)聯(lián)的子網(wǎng)掩碼。假如沒有指定,將使用55。gateway指定網(wǎng)關(guān)。metriccostmetric指派整數(shù)躍點數(shù)(從1到9999)在計算最快速、最可靠和(或)最便宜的路由時使用。例如:本機ip為1,缺省網(wǎng)關(guān)是,假設(shè)此網(wǎng)段上另有一網(wǎng)關(guān)54,現(xiàn)在想添加一項路由,使得當(dāng)訪問子網(wǎng)絡(luò)時通過這一個網(wǎng)關(guān),那么可以加入如下命令:C:\>routeaddmaskC:\>routeprint(鍵入此命令查看路由表,看是否已經(jīng)添加了)C:\>routedeleteC:\>routeprint(此時可以看見已經(jīng)沒了添加的項)⑼Telnet虛擬終端命令在命令行鍵入telnet,將進入telnet模式。鍵入help,可以看到一些常用命令。MicrosoftTelnet>help指令也許縮寫了。支持的指令為:close關(guān)閉當(dāng)前連接display顯示操作參數(shù)open連接到一個站點quit退出telnetset設(shè)立選項(要列表,請鍵入'set?')status打印狀態(tài)信息unset解除設(shè)立選項(要列表,請鍵入'unset?')?/help打印幫助信息可以鍵入display命令來查看當(dāng)前配置:C:\telnetMicrosoftTelnet>displayEscape字符為'CTRL+]'WILLAUTH(NTLM身份驗證)關(guān)閉LOCAL_ECHO發(fā)送CR和LFWILLTERMTYPE優(yōu)選的類型為ANSI協(xié)商的規(guī)則類型為ANSI可以使用set命令來設(shè)立環(huán)境變量,如:MicrosoftTelnet>setlocal_echoonNTLM打開NTLM身份驗證。LOCAL_ECHO打開LOCAL_ECHO。TERMx(x表達ANSI,VT100,VT52或VTNT)CODESETx(x表達ShiftJIS,JapaneseEUC,JISKanji,JISKanji(78),DECKanji或NECKanji)CRLF發(fā)送CR和LF例如:假設(shè)主機1打開了telnet服務(wù)MicrosoftTelnet>open1正在連接到1...您將要發(fā)送密碼信息到Internet區(qū)域中的遠(yuǎn)程計算機。這也許不安全。是否還要發(fā)送(y/n):y(不同系統(tǒng)會有區(qū)別)上面曾說明了Escape字符為'CTRL+]',所以鍵入這個字符就可以切換到外面,再按下單獨的Enter鍵又可以回去。MicrosoftTelnet>status已連接到1協(xié)商的規(guī)則類型為ANSI⑽Tracert該診斷實用程序?qū)煌鏁r間(TTL)值的Internet控制消息協(xié)議(ICMP)回顯數(shù)據(jù)包發(fā)送到目的,以決定到達目的采用的路由。要在轉(zhuǎn)發(fā)數(shù)據(jù)包上的TTL之前至少遞減1,必需途徑上的每個路由器,所以TTL是有效的躍點計數(shù)。數(shù)據(jù)包上的TTL到達0時,路由器應(yīng)當(dāng)將“ICMP已超時”的消息發(fā)送回源系統(tǒng)。Tracert先發(fā)送TTL為1的回顯數(shù)據(jù)包,并在隨后的每次發(fā)送過程將TTL遞增1,直到目的響應(yīng)或TTL達成最大值,從而擬定路由。路由通過檢查中級路由器發(fā)送回的“ICMP已超時”的消息來擬定路由。但是,有些路由器悄悄地下傳包含過期TTL值的數(shù)據(jù)包,而tracert看不到。tracert[-d][-hmaximum_hops][-jcomputer-list][-wtimeout]target_name參數(shù)/d指定不將地址解析為計算機名。-hmaximum_hops指定搜索目的的最大躍點數(shù)。-jcomputer-list指定沿computer-list的稀疏源路由。-wtimeout每次應(yīng)答等待timeout指定的微秒數(shù)。target_name目的計算機的名稱。最簡樸的一種用法如下:C:\>tracert.Tracingrouteto[1]overamaximumof30hops:1<10ms<10ms<10ms2<10ms<10ms<10ms03<10ms<10ms<10ms1Tracecomplete.實驗1.2用telnet方式收發(fā)郵件{舉例}:telnet25 //連接smtp服務(wù)器.端口是25
22021SMTPServerofAIMC;Mon,25Jun2023
12:41:51+0800//服務(wù)器返回的信息
HELO
25021,unknown.host<24>okay.
MAILFROM://告訴服務(wù)器發(fā)件人的Email地址
250<>,senderok.
RCPTTO://告訴服務(wù)器收件人的地址.
250Usernotlocal,willforwardto<>.//OK!下面開始寫信了~~
DATA//告訴服務(wù)器我們要開始寫信了SUBJECT:HELLO//subject后面填寫的是郵件的主題.假如不需要主題可以直接輸入內(nèi)容.
Hi:
Howareyou?
.//換行后輸入.(dot)后按回車,表達信件內(nèi)容書寫完畢.
250Requestedmailactionokay,completed.
QUIT//發(fā)送信件,結(jié)束對話,退出SMTP服務(wù)器.假如想取消發(fā)送可以用RSET命令.
22121closingconnection.下面用POP服務(wù)器收剛才發(fā)送的Email.
telnet110//還是要先連接.端口110
+OKincoresystemmailPOP3Serverready
userstonegong//告訴服務(wù)器你的用戶名
+OKcoremail
pass*********//這里的****代表你的密碼.你輸入的時候會明文顯示.+OK1message(s)[457byte(s)]//看到信了嗎?
list//查看信件列表.
+OK1457
1457
.//第一個475是所有郵件的總字節(jié)數(shù),1后面的那個是第一封郵件的字節(jié)數(shù).由于只有一封,所以相等了.
retr1//返回第一封信的所有內(nèi)容.
+OK457octets
Received:from21(unknown[48])
by(Postfix)withSMTPidE578D1CED4CAC
for<>;Mon,25Jun202312:49:17+0800
(CST)
Received:fromunknown.host([24])by21(AIMC
)
withSMTPidjma3b36f1fc;Mon,25Jun202312:43:27+0800
subject:HELLO
hi:
Howareyou?
Message-Id:<>
Date:Mon,25Jun202312:49:17+0800(CST)
From:
.//剛才發(fā)的那封~
dele1//刪除郵件.
+OKcoremail
list
+OK00
.//這時郵件并沒有完全刪除,要等到退出后在完全刪除//假如現(xiàn)在想恢復(fù)可以用RESTn命令,n表達Email的編號.
Quit//退出.
+OKcoremail
假如上面有哪些命令你沒有理解也可以看看下面這份命令詳解.先看SMTP服務(wù)器的.
HELO:<地址>
運用HELO命令可以告訴SMTP服務(wù)器你的地址,<地址>一般為你的E-mail地址@后面的部分。若你的電
子郵件地址為:
,則<地址>就為21(我就什么也沒輸入.也可以的)
MAILFROM:<發(fā)件人Email地址>
運用MAILFROM命令輸入收信者回復(fù)你時可用的電子郵件地址,一般為你的電子信箱地址,但也可以是符合郵件地址格式的任意字符。
RCPTTO:<收信人的E-mail地址>
RCPTTO命令規(guī)定你輸入收信人的電子郵件地址,可以用多個RCPT
TO命令將郵件同時發(fā)送給多個收信
人。
VRFY:<某個Email地址>
VRFY命令將驗證其后的電子郵件地址的對的性。一般可先運用VRFY命令對電子郵件地址進行校驗,再運用RCPTTO命令將郵件發(fā)送到該地址。DATA
鍵入DATA后回車,即可開始輸入郵件內(nèi)容。假如在首行輸入Subject:<主題內(nèi)容><回車>,則收信者可在主題或Subject欄將看到<主題內(nèi)容>。否則,輸入部分將作為郵件主體(Body)部分的內(nèi)容。結(jié)束信件內(nèi)容輸入,可順序按<回車><.(句號)><回車>.
RSET
RSET命令將中止發(fā)信操作,刪除輸入內(nèi)容。
QUIT
QUIT發(fā)送信件,結(jié)束對話,退出SMTP服務(wù)器。
再說說POP的.
USER<用戶名>
用USER命令輸入用戶信箱名,<用戶名>一般為用戶電子郵件地址@前面的部分,如地址為,則<用戶名>為Someone,命令執(zhí)行后將顯示一些信息,并提醒用戶輸入密碼。
PASS<密碼>
用PASS命令輸入用戶信箱密碼。
STAT
輸入STAT命令,服務(wù)器將告訴用戶共有多少封信件在信箱中。
LIST
顯示信件個數(shù)、序號和每個信件的大小。
TOPnm
顯示第n個信件前m行的內(nèi)容。
RETRn
RETR命令可以顯示第n個信件的所有內(nèi)容。
DELEn
DELE命令用來刪除指定的第n個信件。
RESTn
REST命令可以恢復(fù)被刪除的n個信件。
LAST
LAST命令可以顯示下一個信件的編號。
NOOP
NOOP命令不執(zhí)行任何操作,僅用來測試服務(wù)器的響應(yīng)是否正常。
QUIT
QUIT退出POP3服務(wù)器,結(jié)束信件查閱過程。[規(guī)定]:用telnet方式登陸自己的郵箱,進行收發(fā)郵件的實驗,掌握收發(fā)郵件的命令及過程。仿照上述{舉例}中的過程,將自己的實驗過程記錄下來,寫在下面。
實驗二:基于TCP/UDP的Socket編程[實驗?zāi)康腯:熟悉和掌握socket編程的基本理論和方法。掌握基于TCP和UDP的工作原理以及Socket編程的一般方法,可以編寫簡樸的網(wǎng)絡(luò)應(yīng)用程序。[實驗規(guī)定]:請在以下題目中選擇一個,按照規(guī)定完畢實驗,并完畢實驗報告。實驗可以分組進行,每2人一組,在報告中注明每個成員的分工。編程可以使用任何高級語言,建議使用java或C++。實驗2.1:基于TCPandUDP的socket編程實驗內(nèi)容:運用Java或C++語言,分別基于TCP和UDP編寫一個簡樸的Client/Server網(wǎng)絡(luò)應(yīng)用程序。規(guī)定實現(xiàn)客戶向服務(wù)器傳輸任意一個字符串,服務(wù)器將收到的字符串變換成大寫后傳回客戶。修改上述程序,實現(xiàn)服務(wù)器根據(jù)客戶請求,將服務(wù)器端指定的文獻可靠地傳輸給客戶。假如服務(wù)器沒有指定的文獻,服務(wù)器將給客戶返回一個信息,告知客戶其請求文獻不存在。有條件的同學(xué)可以進一步改善b)的程序,使之更實用。比如可以請求服務(wù)器先傳輸目錄,然后客戶根據(jù)目錄請求傳輸文獻等。實驗方式:每位同學(xué)上機編程實驗,實驗指導(dǎo)教師現(xiàn)場指導(dǎo)。程序可參考附錄的程序1、程序2、程序3和程序4(程序中有錯誤需完善)實驗報告:在實驗報告中要說明Socket編程的客戶端和服務(wù)器端重要環(huán)節(jié)、運用Java語言用到的重要類及其重要作用、TCP和UDP編程的重要差異和特點、你所實現(xiàn)的文獻傳輸?shù)某绦虼a、實驗過程和實驗結(jié)果。實驗2.2:基于TCP的WebServer實驗內(nèi)容:運用Java語言,基于TCP編寫一個簡樸的WebServer,規(guī)定可以實現(xiàn)單用戶簡樸頁面瀏覽。修改上述WebServer,實現(xiàn)多用戶同時連接(多線程)請求。實驗方式:每位同學(xué)上機編程實驗,實驗指導(dǎo)教師現(xiàn)場指導(dǎo)。程序可參考附錄的程序5(程序中有錯誤需完善)實驗報告:在實驗報告中要說明實現(xiàn)WebServer的重要環(huán)節(jié)、關(guān)鍵類和作用、實現(xiàn)非連續(xù)方式(HTTP1.0)和連續(xù)方式(HTTP1.1)在代碼上的重要差異和特點、你所實現(xiàn)的最終WebServer程序代碼、實驗過程和實驗結(jié)果。實驗2.3:基于TCP/UDP的Daytime的客戶端和服務(wù)器端實驗報告規(guī)定同實驗一。參考程序請自己在網(wǎng)絡(luò)中查找。實驗2.4:基于TCP/UDP的Echo的客戶端和服務(wù)器端實驗報告規(guī)定同實驗一。參考程序請自己在網(wǎng)絡(luò)中查找。實驗2.5SOCKET編程實現(xiàn)聊天程序1.實驗?zāi)康恼莆站W(wǎng)絡(luò)應(yīng)用程序的開發(fā)方法;掌握Client/Server結(jié)構(gòu)軟件的設(shè)計與開發(fā)方法掌握Socket機制的工作原理2.。實驗前的準(zhǔn)備閱讀教材關(guān)于TCP/IP協(xié)議和Socket的相關(guān)內(nèi)容;閱讀WinSock編程指南;閱讀本實驗所附內(nèi)容;熟悉VC++6.0開發(fā)工具3.實驗內(nèi)容使用Win32Socket函數(shù)實現(xiàn)聊天程序:能互相對發(fā)文本消息。4.實驗規(guī)定按實驗內(nèi)容進行軟件編制和調(diào)試進行功能測試,記錄測試環(huán)節(jié)給出程序重要部分流程圖實驗2.6SOCKET編程實現(xiàn)miniFTPClient/Server程序1.實驗?zāi)康恼莆站W(wǎng)絡(luò)應(yīng)用程序的開發(fā)方法;掌握Client/Server結(jié)構(gòu)軟件的設(shè)計與開發(fā)方法掌握Socket機制的工作原理2.。實驗前的準(zhǔn)備閱讀教材關(guān)于TCP/IP協(xié)議和Socket的相關(guān)內(nèi)容;閱讀WinSock編程指南;閱讀本實驗所附內(nèi)容;熟悉VC++6.0開發(fā)工具3.實驗內(nèi)容使用Win32Socket函數(shù)實現(xiàn)miniFTPclient/Server:在客戶端實現(xiàn)GETfile,PUTfile,CD(changeDirectory),PWD(displaycurrentdirectoryinserver)功能。4.實驗規(guī)定按實驗內(nèi)容進行軟件編制和調(diào)試進行功能測試,記錄測試環(huán)節(jié)給出程序重要部分流程圖附錄1參考程序1、TCPClient.javaimportjava.io.*:import.*:classTCPClient{publicstaticvoidmain(Stringargv[])throwsException{Stringsentence;StringmodifiedSentence;BufferedReaderinfromUser=newBufferedReader(newInputStreamReader(System.in));SocketclientSocket=newSocket(“hostname”,6789);DataOutputStreamoutToServer=NewDataOutputStream(clientSocket.getOutputStream());BufferedReaderinfromServer=newBufferedReader(newInputStreamReader(clientSocket.getInputStream()));sentence=inFromUser.readLine();outToServer.writeBytes(sentence+‘\n’);modifiedSentence=inFromServer.readLine();System.out.println(“FROMSERVER:”+modifiedSentence);clientSocket.close();}}2、TCPServer.javaimportjava.io.*:import.*:classTCPServer{publicstaticvoidmain(Stringargv[])throwsException{StringClientSentence;StringcapitalizedSentence;ServerSocketwelcomeSocket=newServerSocket(6789);While(true){SocketconnectionSocket=welcomeSocket.accept();BufferedReaderinfromClient=newBufferedReader(newInputStreamReader(connectionSocket.getInputStream()));DataOutputStreamoutToClient=newDataOutputStream(connectionSocket.getOutputStream());ClientSentence=infromClient.readLine();capitalizedSentence=clientSentence.toUpperCase()+‘\n’;outToClient.writeBytes(capitalizedSentence);}}}3、UDPClientimportjava.io.*;import.*;classUDPClient{publicstaticvoidmain(Stringargs[])throwsException{BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(System.in));DatagramSocketclientSocket=newDatagramSocket();InetAddressIPAddress=InetAddress.getByName("tangnat");byte[]sendData=newbyte[1024];byte[]receiveData=newbyte[1024];Stringsentence=inFromUser.readLine();sendData=sentence.getBytes();DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);clientSocket.send(sendPacket);DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);clientSocket.receive(receivePacket);StringmodifiedSentence=newString(receivePacket.getData());System.out.println("FROMSERVER:"+modifiedSentence);clientSocket.close();}}4、UDPServerimportjava.io.*;import.*;classUDPServer{publicstaticvoidmain(Stringargs[])throwsException{DatagramSocketserverSocket=newDatagramSocket(9876);byte[]receiveData=newbyte[1024];byte[]sendData=newbyte[1024];while(true){DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);serverSocket.receive(receivePacket);Stringsentence=newString(receivePacket.getData());InetAddressIPAddress=receivePacket.getAddress();intport=receivePacket.getPort();StringcapitalizedSentence=sentence.toUpperCase();sendData=capitalizedSentence.getBytes();DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,port);serverSocket.send(sendPacket);}}}5、WebServer.javaimportjava.io.*;import.*;importjava.util.*;classWebServer{publicstaticvoidmain(Stringargv[])throwsException{StringrequestMessageLine;Stringfilename;ServerSocketListenSocket=newServerSocket(6789);SocketconnectionSocket=ListenSocket.accept();BufferedReaderinfromClient=newBufferedReader(newInputStreamReader(connectionSocket.getInputStream()));DataOutputStreamoutToClient=newDataOutputStream(connectionSocket.getOutputStream());requestMessageLine=infromClient.readLine();StringTokenizertokenizedLine=newStringTokenizer(requestMessageLine);if(tokenizedLine.nextToken().equals(“GET”)){fileName=tokenizedLine.nextToken();if(filename.startsWith(“/”)==true)filename=filename.substring(1);Filefile=newFile(fileName);intnumOfBytes=(int)file.length();FileInputStreaminFile=newFileInputStream(fileName);Byte[]fileInBytes=newbyte[numOfBytes];inFile.read(fileInBytes);“HTTP/1.0200DocumentFollows\r\n”);if(filename.endsWith(“.jpg”))outToClient.writeBytes(“Content-Type:image/jpeg\r\n”);if(filename.endsWith(“.gif”))outToClient.writeBytes(“Content-Type:image/gif\r\n”);outToClient.writeBytes(“Content-Length:”+numOfBytes+“\r\n”);outToClient.writeBytes(“\r\n”);outToClient.write(fileInBytes,0,numOfBytes);connectionSocket.close();}elseSystem.out.println(“BadRequestMessage”);}}附錄2網(wǎng)絡(luò)編程接口WinSockAPI使用WinSockAPI的編程,應(yīng)當(dāng)了解TCP/IP的基礎(chǔ)知識。雖然你可以直接使用WinSockAPI來寫網(wǎng)絡(luò)應(yīng)用程序,但是,要寫出優(yōu)秀的網(wǎng)絡(luò)應(yīng)用程序,還是必須對TCP/IP協(xié)議有一些了解的。1.TCP/IP協(xié)議與WinSock網(wǎng)絡(luò)編程接口的關(guān)系WinSock并不是一種網(wǎng)絡(luò)協(xié)議,它只是一個網(wǎng)絡(luò)編程接口,也就是說,它不是協(xié)議,但是它可以訪問很多種網(wǎng)絡(luò)協(xié)議,你可以把他當(dāng)作一些協(xié)議的封裝?,F(xiàn)在的WinSock已經(jīng)基本上實現(xiàn)了與協(xié)議無關(guān)。你可以使用WinSock來調(diào)用多種協(xié)議的功能。那么,WinSock和TCP/IP協(xié)議到底是什么關(guān)系呢?事實上,WinSock就是TCP/IP協(xié)議的一種封裝,你可以通過調(diào)用WinSock的接口函數(shù)來調(diào)用TCP/IP的各種功能.例如我想用TCP/IP協(xié)議發(fā)送數(shù)據(jù),你就可以使用WinSock的接口函數(shù)Send()來調(diào)用TCP/IP的發(fā)送數(shù)據(jù)功能,至于具體怎么發(fā)送數(shù)據(jù),WinSock已經(jīng)幫你封裝好了這種功能。2、TCP/IP協(xié)議介紹TCP/IP協(xié)議包含的范圍非常的廣,他是一種四層協(xié)議,包含了各種硬件、軟件需求的定義。TCP/IP協(xié)議確切的說法應(yīng)當(dāng)是TCP/UDP/IP協(xié)議。UDP協(xié)議(UserDatagramProtocol用戶數(shù)據(jù)報協(xié)議),是一種保護消息邊界的,不保障可靠數(shù)據(jù)的傳輸。TCP協(xié)議(TransmissionControlProtocol傳輸控制協(xié)議),是一種流傳輸?shù)膮f(xié)議。他提供可靠的、有序的、雙向的、面向連接的傳輸。保護消息邊界,就是指傳輸協(xié)議把數(shù)據(jù)當(dāng)作一條獨立的消息在網(wǎng)上傳輸,接受端只能接受獨立的消息。也就是說存在保護消息邊界,接受端一次只能接受發(fā)送端發(fā)出的一個數(shù)據(jù)包。
而面向流則是指無保護消息保護邊界的,假如發(fā)送端連續(xù)發(fā)送數(shù)據(jù),接受端有也許在一次接受動作中,會接受兩個或者更多的數(shù)據(jù)包。舉例來說,假如,我們連續(xù)發(fā)送三個數(shù)據(jù)包,大小分別是2k、4k、8k,這三個數(shù)據(jù)包都已經(jīng)到達了接受端的網(wǎng)絡(luò)堆棧中,假如使用UDP協(xié)議,不管我們使用多大的接受緩沖區(qū)去接受數(shù)據(jù),我們必須有三次接受動作,才可以把所有的數(shù)據(jù)包接受完。而使用TCP協(xié)議,我們只要把接受的緩沖區(qū)大小設(shè)立在14k以上,我們就可以一次把所有的數(shù)據(jù)包接受下來,只需要有一次接受動作。這就是由于UDP協(xié)議的保護消息邊界使得每一個消息都是獨立的。而流傳輸,卻把數(shù)據(jù)當(dāng)作一串?dāng)?shù)據(jù)流,它不認(rèn)為數(shù)據(jù)是一個一個的消息。所以有很多人在使用TCP協(xié)議通訊的時候,并不清楚TCP是基于流的傳輸,當(dāng)連續(xù)發(fā)送數(shù)據(jù)的時候,他們時常會結(jié)識TCP會丟包。其實不然,由于當(dāng)他們使用的緩沖區(qū)足夠大時,他們有也許會一次接受到兩個甚至更多的數(shù)據(jù)包,而很多人往往會忽視這一點,只解析檢查了第一個數(shù)據(jù)包,而已經(jīng)接受的其他據(jù)包卻被忽略了。3.WinSock編程簡樸流程WinSock編程分為服務(wù)器端和客戶端兩部分,TCP服務(wù)器端的大體流程如下:對于任何基于WinSock的編程一方面必須要初始化WinSockDLL庫。intWSAStarup(WORDwVersionRequested,LPWSADATAlpWsAData)。wVersionRequested是我們規(guī)定使用的WinSock的版本。調(diào)用這個接口函數(shù)可以初始化WinSock。然后必須創(chuàng)建一個套接字(Socket)。SOCKETSocket(intaf,inttype,intprotocol);套接字可以說是WinSock通訊的核心。WinSock通訊的所有數(shù)據(jù)傳輸,都是通過套接字來完畢的,套接字包含了兩個信息,一個是IP地址,一個是Port端標(biāo)語,使用這兩個信息,就可以擬定網(wǎng)絡(luò)中的任何一個通訊節(jié)點。當(dāng)調(diào)用了Socket()接口函數(shù)創(chuàng)建了一個套接字后,必須把套接字與你需要進行通訊的地址建立聯(lián)系,可以通過綁定函數(shù)來實現(xiàn)這種聯(lián)系。intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);structsockaddr_in{shortsin_family; u_shortsin_prot; structin_addrsin_addr; charsin_sero[8]; }就包含了需要建立連接的本地的地址,涉及地址族、IP和端口信息。sin_family字段必須把它設(shè)為AF_INET,這是告訴WinSock使用的是IP地址族。sin_prot就是要用來通訊的端標(biāo)語。sin_addr就是要用來通訊的IP地址信息。在這里,必須還得提一下有關(guān)'大頭(big-endian)'小頭(little-endian)'。由于各種不同的計算機解決數(shù)據(jù)時的方法是不同樣的,IntelX86解決器上是用'小頭'形式來表達多字節(jié)的編號,就是把低字節(jié)放在前面,把高字節(jié)放在后面,而互聯(lián)網(wǎng)標(biāo)準(zhǔn)卻正好相反,所以,必須把主機字節(jié)轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)的順序。WinSockAPI提供了幾個函數(shù)。把主機字節(jié)轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)的函數(shù);u_longhtonl(u_longhostlong);u_shorthtons(u_shorthostshort);把網(wǎng)絡(luò)字節(jié)轉(zhuǎn)化成主機字節(jié)的函數(shù);u_longntohl(u_longnetlong);u_shortntohs(u_shortnetshort);這樣,設(shè)立IP地址和port端口時,就必須把主機字節(jié)轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)后,才干用Bind()函數(shù)來綁定套接字和地址。當(dāng)綁定完畢之后,服務(wù)器端必須建立一個監(jiān)聽的隊列來接受客戶端的連接請求。intlisten(SOCKETs,intbacklog);這個函數(shù)可以把套接字轉(zhuǎn)成監(jiān)聽模式。假如客戶端有了連接請求,我們還必須使用intaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);來接受客戶端的請求?,F(xiàn)在基本上已經(jīng)完畢了一個服務(wù)器的建立,而客戶端的建立的流程則是初始化WinSock,然后創(chuàng)建Socket套接字,再使用intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);來連接服務(wù)端。下面是一個最簡樸的創(chuàng)建服務(wù)器端和客戶端的例子:服務(wù)器端的創(chuàng)建:WSADATAwsd;SOCKETsListen;SOCKETsclient;UINTport=800;intiAddrSize;structsockaddr_inlocal,client;WSAStartup(0x11,&wsd);sListen=Socket(AF_INET,SOCK_STREAM,IPPOTO_IP);local.sin_family=AF_INET;local.sin_addr=htonl(INADDR_ANY);local.sin_port=htons(port);bind(sListen,(structsockaddr*)&local,sizeof(local));listen(sListen,5);sClient=accept(sListen,(structsockaddr*)&client,&iAddrSize);客戶端的創(chuàng)建:WSADATAwsd;SOCKETsClient;UINTport=800;charszIp[]="";intiAddrSize;structsockaddr_inserver;WSAStartup(0x11,&wsd);sClient=Socket(AF_INET,SOCK_STREAM,IPPOTO_IP);server.sin_family=AF_INET;server.sin_addr=inet_addr(szIp);server.sin_port=htons(port);connect(sClient,(structsockaddr*)&server,sizeof(server));當(dāng)服務(wù)器端和客戶端建立連接以后,無論是客戶端,還是服務(wù)器端都可以使用intsend(SOCKETs,constcharFAR*buf,intlen,intflags);intrecv(SOCKETs,charFAR*buf,intlen,intflags);函數(shù)來接受和發(fā)送數(shù)據(jù),由于,TCP連接是雙向的。當(dāng)要關(guān)閉通訊連結(jié)的時候,任何一方都可以調(diào)用intshutdown(SOCKETs,inthow);來關(guān)閉套接字的指定功能,再調(diào)用intcloseSocket(SOCKETs);來關(guān)閉套接字句柄,這樣一個通訊過程就算完畢了。注意:上面的代碼沒有任何檢查函數(shù)返回值,假如你作網(wǎng)絡(luò)編程就一定要檢查任何一個WinSockAPI函數(shù)的調(diào)用結(jié)果,由于很多時候函數(shù)調(diào)用并不一定成功。上面介紹的函數(shù),返回值類型是int的話,假如函數(shù)調(diào)用失敗的話,返回的都是SOCKET_ERROR。4.WinSock編程的模型上面介紹的僅僅是最簡樸的WinSock通訊的方法,而實際中很多網(wǎng)絡(luò)通訊的卻很多難以解決的意外情況。例如,WinSock提供了兩種套接字模式:鎖定和非鎖定。當(dāng)使用鎖定套接字的時候,使用的很多函數(shù),例如accpet、send、recv等等,假如沒有數(shù)據(jù)需要解決,這些函數(shù)都不會返回,也就是說,你的應(yīng)用程序會阻塞在那些函數(shù)的調(diào)用處。而假如使用非阻塞模式,調(diào)用這些函數(shù),不管你有沒有數(shù)據(jù)到達,他都會返回。所以有也許我們在非阻塞模式里,調(diào)用這些函數(shù)大部分的情況下會返回失敗,所以就需要我們來解決很多的意外犯錯。這顯然不是我們想要看到的情況。我們可以采用WinSock的通訊模型來避免這些情況的發(fā)生。WinSock提供了五種套接字I/O模型來解決這些問題。他們分別是select(選擇),WSAAsyncSelect(異步選擇),WSAEventSelect(事件選擇,overlapped(重疊),completionport(完畢端口)。這里具體介紹一下select,WSAASyncSelect兩種模型。Select模型是最常見的I/O模型。使用intselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);函數(shù)來檢查你要調(diào)用的Socket套接字是否已有了需要解決的數(shù)據(jù)。select包含三個Socket隊列,分別代表:readfds,檢查可讀性,writefds,檢查可寫性,exceptfds,例外數(shù)據(jù)。timeout是select函數(shù)的返回時間。例如,想要檢查一個套接字是否有數(shù)據(jù)需要接受,我們可以把套接字句柄加入可讀性檢查隊列中,然后調(diào)用select,假如,該套接字沒有數(shù)據(jù)需要接受,select函數(shù)會把該套接字從可讀性檢查隊列中刪除掉,所以我們只要檢查該套接字句柄是否還存在于可讀性隊列中,就可以知道到底有沒有數(shù)據(jù)需要接受了。WinSock提供了一些宏用來操作套接字隊列fd_set。FD_CLR(s,*set)從隊列set刪除句柄s。FD_ISSET(s,*set)檢查句柄s是否存在與隊列set中。FD_SET(s,*set)把句柄s添加到隊列set中。FD_ZERO(*set)把set隊列初始化成空隊列。WSAAsyncSelect(異步選擇)模型:WSAASyncSelect模型就是把一個窗口和套接字句柄建立起連接,套接字的網(wǎng)絡(luò)事件發(fā)生時時候,就會把某個消息發(fā)送到窗口,然后可以在窗口的消息響應(yīng)函數(shù)中解決數(shù)據(jù)的接受和發(fā)送。intWSAAsyncSelect(SOCKETs,HWNDhWnd,unsignedintwMsg,longlEvent);這個函數(shù)可以把套接字句柄和窗口建立起連接,wMsg是我們必須自定義的一個消息。lEvent就是制定的網(wǎng)絡(luò)事件。涉及FD_READ,FD_WRITE,FD_ACCEPT,FD_CONNECT,FD_CLOSE。幾個事件。例如,需要接受FD_READ,FD_WRITE,FD_CLOSE的網(wǎng)絡(luò)事件。可以調(diào)用WSAAsyncSelect(s,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);這樣,當(dāng)有FD_READ,F(xiàn)D_WRITE或者FD_CLOSE網(wǎng)絡(luò)事件時,窗口hWnd將會收到WM_SOCKET消息,消息參數(shù)的lParam標(biāo)志了是什么事件發(fā)生,MFC的C
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園幼小銜接教學(xué)計劃
- 多元化班級評價體系建設(shè)計劃
- 輪訓(xùn)模式下的藝術(shù)教師發(fā)展計劃
- 共享服務(wù)模式下的會計管理計劃
- 高效會議管理的總結(jié)與方法計劃
- 打造水務(wù)行業(yè)的智能未來計劃
- 彩鈴呼叫流程
- 《長方體正方體的認(rèn)識》(教學(xué)設(shè)計)-2023-2024學(xué)年五年級上冊數(shù)學(xué)西師大版
- 殘疾人托養(yǎng)服務(wù)投標(biāo)方案(技術(shù)方案)
- 《猴子的煩惱》教學(xué)設(shè)計-2024-2025學(xué)年三年級下冊數(shù)學(xué)北師大版
- 萬達廣場室內(nèi)步行街裝設(shè)計任務(wù)書
- 人音版五年級下冊音樂《巴塘連北京》課件
- GB/T 775.1-2006絕緣子試驗方法第1部分:一般試驗方法
- GB/T 39965-2021節(jié)能量前評估計算方法
- 最新《工會基礎(chǔ)知識》試題庫及答案1000題【完美打印版】
- 化學(xué)核心素養(yǎng)的課堂教學(xué)-基于核心素養(yǎng)的高中化學(xué)教學(xué) 課件
- 體育競賽的組織與編排
- 動靜脈內(nèi)瘺的圍手術(shù)期護理-課件
- 辦公家具項目實施方案、供貨方案
- 初中數(shù)學(xué)人教八年級下冊第十九章一次函數(shù)-一次函數(shù)的圖象與性質(zhì)
評論
0/150
提交評論