![]() ![]() |
計算機網(wǎng)絡(luò)實驗教程 ![]()
全書共分12章, 主要內(nèi)容包括: 實驗基礎(chǔ)、雙絞線、交換機技術(shù)、路由技術(shù)、訪問控制列表、IPv6 技術(shù)、NAT地址轉(zhuǎn)換、VPN技術(shù)、網(wǎng)絡(luò)嗅探與協(xié)議分析、網(wǎng)絡(luò)編程、網(wǎng)絡(luò)安全、綜合實驗。
本書重點突出,結(jié)構(gòu)層次清晰,語言通俗易懂。有許多的典型應(yīng)用實例。實例采用引導(dǎo)型模式,主要環(huán)節(jié)均留出思考空間。每個實例針對性很強,敘述和分析透徹,它包括網(wǎng)絡(luò)拓撲結(jié)構(gòu)、實驗環(huán)境說明、實驗?zāi)康暮鸵蟆⑴渲貌襟E、測試結(jié)果等,每章都配有相關(guān)實驗習(xí)題,具有可讀性、可操作性和實用性強的特點,特別適合于課堂教學(xué)。
作者在本書第1版的基礎(chǔ)上,對原內(nèi)容做了一些調(diào)整。原第1章不變,但內(nèi)容有刪減。原第9~11章調(diào)整為第2~4章,原第2~8章調(diào)整為第5~11章,并增加了新的第12章無線網(wǎng)絡(luò),原綜合實驗調(diào)整為第13章。
本書第1版大部分內(nèi)容的操作系統(tǒng)是基于Windows XP的,第2版修改了不適用于Windows 10的部分。交換機與路由器的端口也從百兆升級為千兆端口,以銳捷的S5750、RSR20為參考設(shè)備,但實際上對于網(wǎng)絡(luò)設(shè)備的配置管理命令并沒有太大改變。書中交換機與路由器等網(wǎng)絡(luò)設(shè)備的配置實驗,對于不具備硬件實驗環(huán)境的可以采用第1章實驗基礎(chǔ)所介紹的Cisco仿真軟件模擬實現(xiàn)。針對目前無線網(wǎng)絡(luò)比較流行的情況,本版增加了相關(guān)內(nèi)容,供讀者學(xué)習(xí)參考。本書內(nèi)容覆蓋較為廣泛,將網(wǎng)絡(luò)知識和技術(shù)融于網(wǎng)絡(luò)配置實驗中,每章均配有用于鞏固所講授內(nèi)容的思考與練習(xí)題和上機實驗題,本版還增加了一些有挑戰(zhàn)性的實驗。本書可作為計算機網(wǎng)絡(luò)專業(yè)應(yīng)用本科的實驗教材,也可作為網(wǎng)絡(luò)專業(yè)從業(yè)人員的自學(xué)教材。
全書共有13章,主要內(nèi)容包括實驗基礎(chǔ)(第1章)、網(wǎng)絡(luò)嗅探與協(xié)議分析(第2章)、網(wǎng)絡(luò)編程(第3章)、網(wǎng)絡(luò)安全(第4章)、雙絞線實驗(第5章)、交換機技術(shù)(第6章)、路由技術(shù)(第7章)、訪問控制列表(第8章)、網(wǎng)絡(luò)地址轉(zhuǎn)換(第9章)、VPN技術(shù)(第10章)、IPv6技術(shù)(第11章)、無線技術(shù)(第12章)、綜合實驗(第13章)。
本書重點突出,結(jié)構(gòu)層次清晰,語言通俗易懂,有眾多的網(wǎng)絡(luò)實驗,每個實驗針對性很強,敘述和分析透徹,包括網(wǎng)絡(luò)拓撲結(jié)構(gòu)、實驗環(huán)境說明、實驗?zāi)康暮鸵蟆⑴渲貌襟E、測試結(jié)果等,具有可讀性、可操作性和實用性強的特點。本書十分重視實驗前后的驗證,同時在實驗中插入了許多思考和討論環(huán)節(jié)。
在本書的編寫過程中,參考了大量銳捷網(wǎng)絡(luò)的技術(shù)資料和培訓(xùn)教材,借鑒了許多網(wǎng)絡(luò)工程和網(wǎng)絡(luò)同仁的寶貴經(jīng)驗,在此表示誠摯的謝意。由于作者水平有限,書中的不妥和錯誤在所難免,誠請各位專家和讀者批評指正。
編者
2017年2月
王盛邦, 碩士、高工,主要從事軟件開發(fā)和計算機類課程教學(xué)工作,研究方向是計算機網(wǎng)絡(luò)、信息安全。曾講授的課程有“計算機網(wǎng)絡(luò)及應(yīng)用”、“計算機網(wǎng)絡(luò)實驗”、“計算機網(wǎng)絡(luò)與信息安全基礎(chǔ)”、“網(wǎng)絡(luò)安全原理與技術(shù)實驗”、“信息安全綜合實踐”等。
曾任全國大學(xué)生嵌入式大賽中山大學(xué)參賽小組指導(dǎo)老師、全國大學(xué)生信息安全競賽中大參賽隊的指導(dǎo)老師、中山大學(xué)信息安全競賽校際選拔賽評委、全國大學(xué)生信息安全競賽網(wǎng)評專家。
曾主持校級實驗室開放基金項目“計算機網(wǎng)絡(luò)創(chuàng)新實驗”、“EMC教學(xué)實驗案例的設(shè)計與開發(fā)”、“計算機網(wǎng)絡(luò)實踐課程改革與實驗教材建設(shè)”、“計算機網(wǎng)絡(luò)實踐課程自主創(chuàng)新本科教學(xué)體系建設(shè)”、““計算機網(wǎng)絡(luò)實驗”精品課程建設(shè)”、“信息安全專業(yè)綜合實踐實驗改革與設(shè)計”、“信息安全綜合實踐課程建設(shè)”、“教材建設(shè)-網(wǎng)絡(luò)與信息安全綜合實踐”等。
所編寫廣東省本科高校教學(xué)質(zhì)量與教學(xué)改革工程立項建設(shè)項目《網(wǎng)絡(luò)與信息安全綜合實踐》被全國多所高校采用。
第1章實驗基礎(chǔ)1
1.1常用網(wǎng)絡(luò)命令1
1.1.1ping命令1
1.1.2tracert命令5
1.1.3ipconfig命令7
1.1.4netstat命令8
1.1.5arp命令10
1.1.6net命令11
1.1.7netsh命令13
1.2IPv4地址基礎(chǔ)16
1.2.1IPv4地址表示16
1.2.2IPv4地址結(jié)構(gòu)16
1.2.3IPv4地址分類17
1.2.4網(wǎng)絡(luò)掩碼17
1.2.5子網(wǎng)掩碼與子網(wǎng)劃分18
1.2.6子網(wǎng)劃分實例18
1.3網(wǎng)絡(luò)包分析工具Wireshark20
1.3.1Wireshark20
1.3.2Wireshark常用功能21
1.3.3Wireshark的過濾規(guī)則25
1.3.4Wireshark命令行抓包26
1.3.5Wireshark數(shù)據(jù)包捕獲實例26
1.4網(wǎng)絡(luò)模擬軟件Packet Tracer29
1.4.1Packet Tracer界面29
1.4.2設(shè)備管理33
1.4.3通過Packet Tracer分析協(xié)議35
1.4.4Packet Tracer使用實驗38
1.5繪制網(wǎng)絡(luò)拓撲圖40
1.5.1網(wǎng)絡(luò)設(shè)備圖例40
1.5.2拓撲圖繪制工具41
1.6實驗與實驗測試44
1.6.1實驗前后的對比44
1.6.2對實驗過程進行監(jiān)控44
1.6.3實驗截圖44
1.6.4撰寫實驗報告45
習(xí)題145第2章網(wǎng)絡(luò)嗅探與協(xié)議分析50
2.1網(wǎng)絡(luò)嗅探50
實驗2.1嗅探實驗51
2.2協(xié)議分析51
2.3TCP/IP協(xié)議52
2.3.1IP協(xié)議52
2.3.2TCP協(xié)議54
實驗2.2TCP/IP協(xié)議分析58
2.4HTTP協(xié)議60
實驗2.3HTTP協(xié)議分析實驗62
2.5FTP協(xié)議64
2.5.1FTP客戶/服務(wù)器64
2.5.2數(shù)據(jù)連接主動方式/被動方式65
2.5.3用戶名和口令的明文傳輸65
2.5.4FileZilla66
實驗2.4FTP協(xié)議分析66
2.6Telnet協(xié)議69
2.6.1Telnet的基本服務(wù)69
2.6.2選項協(xié)商70
2.6.3Telnet客戶機和服務(wù)器71
實驗2.5Telnet協(xié)議分析71
2.7DNS協(xié)議73
實驗2.6DNS協(xié)議分析76
2.8ARP協(xié)議78
實驗2.7ARP協(xié)議分析80
2.9QQ協(xié)議82
實驗2.8QQ協(xié)議分析83
2.10迅雷下載協(xié)議85
實驗2.9迅雷協(xié)議分析86
習(xí)題287第3章網(wǎng)絡(luò)編程91
3.1利用套接字建立邏輯信道92
3.2Client/Server工作模式分類93
3.3面向連接的Client/Server模式93
3.3.1面向連接的服務(wù)器工作流程93
3.3.2面向連接的客戶端工作流程95
3.4無連接的Client/Server模式97
3.5編程實驗97
實驗3.1TCP通信程序設(shè)計102
實驗3.2UDP通信程序設(shè)計103
實驗3.3網(wǎng)絡(luò)嗅探器設(shè)計104
實驗3.4停等協(xié)議通信106
實驗3.5GBN協(xié)議編程107
實驗3.6IPv4組播通信108
實驗3.7應(yīng)用層組播113
習(xí)題3115第4章網(wǎng)絡(luò)安全117
4.1Linux防火墻配置117
4.1.1netfilter/iptables118
4.1.2建立規(guī)則和鏈119
4.1.3其他NAT配置123
實驗4.1Linux防火墻設(shè)計123
4.2ARP欺騙126
4.2.1同一網(wǎng)段的ARP欺騙126
4.2.2不同網(wǎng)段的ARP欺騙127
4.2.3ARP欺騙的防御129
實驗4.2ARP測試與防御129
4.3盜鏈與反盜鏈技術(shù)131
4.3.1盜鏈原理131
4.3.2反盜鏈技術(shù)131
實驗4.3分析某下載軟件的盜鏈行為132
4.4蜜罐技術(shù)133
實驗4.4簡單蜜罐陷阱的配置134
4.5入侵檢測技術(shù)136
實驗4.5入侵檢測實驗137
習(xí)題4138第5章雙絞線實驗142
5.1雙絞線142
5.2RJ.45連接器145
5.3雙絞線跳線的制作標(biāo)準(zhǔn)和跳線類型147
5.3.1T568.A標(biāo)準(zhǔn)與T568.B標(biāo)準(zhǔn)147
5.3.2跳線線序148
5.3.3直連線和交叉線148
實驗5.1雙絞線跳線的制作和測試149
5.4信息模塊152
實驗5.2信息模塊的壓制和測試154
習(xí)題5156第6章交換機技術(shù)157
6.1交換機技術(shù)基礎(chǔ)157
6.1.1以太網(wǎng)交換機157
6.1.2交換機的工作原理157
6.1.3交換機的基本功能159
6.1.4交換機的交換方式159
6.1.5交換機的分類160
6.1.6交換機的接口與連接線纜160
6.1.7交換機配置基礎(chǔ)161
6.1.8交換機的命令模式162
6.2VLAN技術(shù)163
6.2.1基本概念163
6.2.2VLAN的分類164
6.2.3VLAN數(shù)據(jù)幀的標(biāo)識165
6.2.4VLAN中的端口165
6.2.5VLAN的基本配置166
實驗6.1單交換機實現(xiàn)VLAN169
實驗6.2跨交換機實現(xiàn)VLAN172
6.2.6三層交換機VLAN間路由174
實驗6.3通過三層交換機實現(xiàn)VLAN間路由177
6.2.7單臂路由實現(xiàn)VLAN間路由179
實驗6.4單臂路由實現(xiàn)VLAN間路由180
6.3端口聚合183
6.3.1基本概念183
6.3.2端口匯聚配置命令184
6.3.3配置Aggregate Port的流量平衡185
實驗6.5端口聚合配置實驗187
6.4端口鏡像190
6.4.1基本概念190
6.4.2本地端口鏡像190
實驗6.6交換機端口鏡像配置192
6.4.3基于VLAN的鏡像194
6.4.4遠程端口鏡像195
實驗6.7交換機端口遠程鏡像197
6.4.5基于流的遠程端口鏡像配置199
6.5生成樹協(xié)議199
6.5.1基本概念199
6.5.2生成樹協(xié)議的定義203
6.5.3快速生成樹協(xié)議204
實驗6.8快速生成樹協(xié)議配置204
6.5.4多生成樹協(xié)議208
實驗6.9多生成樹協(xié)議配置208
6.5.5生成樹協(xié)議小結(jié)215
6.6交換技術(shù)的發(fā)展前景215
習(xí)題6216第7章路由技術(shù)223
7.1路由器技術(shù)基礎(chǔ)223
7.1.1路由的基本概念223
7.1.2路由器的功能225
7.1.3路由器的分類226
7.1.4路由的分類226
7.1.5路由器的接口和線纜227
7.1.6路由器配置228
7.1.7路由器端口配置原則229
7.1.8路由器的常見命令模式230
7.2靜態(tài)路由230
7.2.1靜態(tài)路由230
7.2.2靜態(tài)路由配置步驟232
7.2.3靜態(tài)路由配置主要命令232
實驗7.1靜態(tài)路由233
7.3RIP路由235
7.3.1RIP概述235
7.3.2路由環(huán)路236
7.3.3有類路由與無類路由239
7.3.4RIP的工作過程239
7.3.5路由匯總240
7.3.6RIP配置步驟242
實驗7.2RIP路由協(xié)議243
7.4OSPF路由246
7.4.1OSPF概述246
7.4.2Loopback地址247
7.4.3OSPF數(shù)據(jù)包類型247
7.4.4OSPF協(xié)議工作過程249
7.4.5OSPF區(qū)域250
7.4.6OSPF配置步驟251
實驗7.3OSPF單區(qū)域252
實驗7.4OSPF多區(qū)域255
7.4.7OSPF虛連接258
7.4.8OSPF的認證259
實驗7.5OSPF虛鏈路260
7.4.9路由重發(fā)布263
實驗7.6路由重發(fā)布266
7.5動態(tài)路由協(xié)議小結(jié)269
習(xí)題7269第8章訪問控制列表279
8.1基本概念279
8.2ACL匹配性檢查280
8.2.1ACL的匹配過程280
第3章網(wǎng) 絡(luò) 編 程 本章主要介紹網(wǎng)絡(luò)編程的一些主要方法,并配有編程實驗。一些實驗只提出要求,程序編寫過程需要讀者自行完成。 如果應(yīng)用程序涉及本地與遠程之間的通信,就需要采用網(wǎng)絡(luò)編程。網(wǎng)絡(luò)編程*主要的工作就是在發(fā)送端把信息通過規(guī)定好的協(xié)議進行包的組裝,在接收端按照規(guī)定好的協(xié)議把包進行解析并提取出對應(yīng)的信息,從而達到通信的目的。中間*主要的就是數(shù)據(jù)包的組裝、過濾、捕獲和分析以及其他處理。 通過使用套接字達到進程間通信目的的編程就是網(wǎng)絡(luò)編程。套接字即Socket,應(yīng)用程序通常通過套接字向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求,實際上是網(wǎng)絡(luò)應(yīng)用程序接口(API)。套接字是由傳輸層提供的應(yīng)用程序(進程)和網(wǎng)絡(luò)之間的接入點,如圖3.1所示。應(yīng)用程序(進程)可以通過套接字訪問網(wǎng)絡(luò),套接字利用主機的網(wǎng)絡(luò)層地址和端口號為兩個進程建立邏輯連接。 圖3.1Socket是應(yīng)用層與傳輸層之間的橋梁 套接字可以用于多種協(xié)議,包括TCP/IP協(xié)議。常用的端口號如表3.1所示。表3.1TCP/IP常用端口號協(xié)議NNTPFTP(數(shù)據(jù))FTP(控制)TelnetSTMPHTTPPOP3端口號192021232580110為了方便網(wǎng)絡(luò)編程,20世紀(jì)90年代初,Microsoft聯(lián)合其他幾家公司共同制定了一套Windows下的網(wǎng)絡(luò)編程接口,即Windows Sockets規(guī)范。它不是一種網(wǎng)絡(luò)協(xié)議,而是一套開放的、支持多種協(xié)議的Windows下的網(wǎng)絡(luò)編程接口,F(xiàn)在的Winsock已經(jīng)基本上實現(xiàn)了與協(xié)議無關(guān),可以使用Winsock調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。Socket實際上是在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有Socket接口的計算機通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過這個Socket接口實現(xiàn)。 Socket是TCP/IP網(wǎng)絡(luò)的API,Socket接口提供了很多的函數(shù),可以用于開發(fā)網(wǎng)絡(luò)應(yīng)用程序。Socket數(shù)據(jù)傳輸是一種特殊的I/O,同時Socket也是一種文件描述符。Socket的使用主要有Socket建立、配置、建立連接、數(shù)據(jù)傳輸和結(jié)束傳輸?shù)冗^程。 3。1利用套接字建立邏輯信道 一般發(fā)起通信請求的程序被稱為客戶端,用戶一般是通過客戶端軟件訪問某種服務(wù)?蛻舳藨(yīng)用程序通過與服務(wù)器建立連接和發(fā)送請求,然后接收服務(wù)器返回的內(nèi)容。服務(wù)器則一般是等待并處理客戶端請求的應(yīng)用程序。服務(wù)器通常由系統(tǒng)執(zhí)行,在系統(tǒng)生存期間一直存在和等待客戶端的請求,并且在接收到客戶端的請求后,根據(jù)請求向客戶端返回合適的內(nèi)容。 通信的一方(被動方,稱為服務(wù)器)監(jiān)聽某個端口;通信的另一方(主動方,稱為客戶端)如果知道服務(wù)器的IP地址和它所監(jiān)聽的端口, 便可以試圖發(fā)送請求建立連接。該連接請求包含: 服務(wù)器IP地址、服務(wù)器端口號、客戶IP地址、客戶端口號。由于客戶端口號由客戶端的系統(tǒng)(TCP進程)自動選取一個當(dāng)前未用的端口,該四元組便可以在因特網(wǎng)中*標(biāo)識一個邏輯連接。服務(wù)器收到客戶端發(fā)來的連接請求后,便發(fā)出響應(yīng)建立該連接,這樣就建立了一條邏輯信道。 客戶和服務(wù)器通過請求響應(yīng)方式可以進行雙向數(shù)據(jù)傳輸。當(dāng)結(jié)束數(shù)據(jù)傳輸時,需要關(guān)閉該連接。這種工作模式是有連接的客戶端/服務(wù)器模式(Client/Server)。 根據(jù)連接啟動的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過程可以分為三個步驟: 服務(wù)器監(jiān)聽,客戶端請求,連接確認。 (1) 服務(wù)器監(jiān)聽: 是指服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)。 (2) 客戶端請求: 是指由客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后向服務(wù)器端套接字提出連接請求。 (3) 連接確認: 是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。 這三個步驟類似于三次握手,如圖3.2所示。 圖3.2客戶端與服務(wù)器端的三次握手3。2Client/Server工作模式分類 Client/Server工作模式一般按下列分類: (1) 有狀態(tài)和無狀態(tài): 服務(wù)器是否記錄客戶端的當(dāng)前狀態(tài)。 (2) 有連接(TCP)和無連接(UDP): 客戶端和服務(wù)器之間是否先建立連接再傳輸數(shù)據(jù)。 (3) 循環(huán)和并發(fā): 服務(wù)器對多客戶端請求的服務(wù)是采用循環(huán)方法還是并發(fā)程序方法。 TCP協(xié)議面向連接,使用可靠的字節(jié)流傳送服務(wù);而UDP協(xié)議面向非連接,使用非可靠的數(shù)據(jù)報服務(wù)。TCP協(xié)議提供高可靠性的傳輸,UDP協(xié)議提供高效的傳輸。它們在實際應(yīng)用中有其各自所適應(yīng)的場合。 3。3面向連接的Client/Server模式 在面向連接的Client/Server結(jié)構(gòu)中,操作過程采取的是主動請求方式: 服務(wù)器首先啟動,并根據(jù)請求提供相應(yīng)服務(wù)。 通過調(diào)用socket()建立一個套接口,然后調(diào)用bind()將該套接口和本地網(wǎng)絡(luò)地址聯(lián)系在一起,再調(diào)用listen()使套接口做好偵聽的準(zhǔn)備,并規(guī)定它的請求隊列的長度,之后調(diào)用accept()接收連接?蛻舳嗽诮⑻捉涌诤缶涂烧{(diào)用connect()和服務(wù)器建立連接。連接一旦建立,客戶機和服務(wù)器之間就可以供對方讀取或者讀取對方數(shù)據(jù)。*后在數(shù)據(jù)傳送結(jié)束后,雙方調(diào)用close()關(guān)閉套接口。 3。3。1面向連接的服務(wù)器工作流程 面向連接的服務(wù)器工作流程包括以下幾個環(huán)節(jié)。 1。 創(chuàng)建套接字 Socket建立是通過調(diào)用Socket函數(shù)實現(xiàn)的,該函數(shù)定義如下: SOCKET socket(int domain, int type, int protocol)其中參數(shù): domain: 指明使用的協(xié)議族,如果取值A(chǔ)F_INET,用于網(wǎng)絡(luò)通信;如果取值A(chǔ)F_UNIX,用于單一UNIX系統(tǒng)中進程間通信。 type: 指明socket類型,如果取值SOCK_STREAM,表示是流式,面向連接的比特流,順序、可靠、雙向,用于TCP通信;如果取值SOCK_DGRAM,表示數(shù)據(jù)報式、無連接、定長、不可靠,用于UDP通信。 protocol: 由于指定了type,一般用0。 函數(shù)返回: 一個整型的socket描述符,供后面使用。如果調(diào)用失敗,返回一個INVALID_SOCKET值,錯誤信息可以通過WSAGetLastError函數(shù)返回。 例如,一個socket可如下建立: int sockfd=socket(AF_INET,SOCK_STREAM,0)2。 將本地IP地址和端口號綁定到套接字 Socket的建立實際上是為socket數(shù)據(jù)結(jié)構(gòu)分配了一個名字空間并返回指針,接著要對數(shù)據(jù)結(jié)構(gòu)提供數(shù)據(jù)。bind()將一本地地址與一套接口捆綁,它適用于未連接的數(shù)據(jù)報或流類套接口,在connect()或listen()調(diào)用前使用。bind()函數(shù)通過給一個未命名套接口分配一個本地名字為套接口建立本地捆綁(主機地址/端口號)。 bind()定義如下: int bind(SOCKET socket, struct sockaddr address, int addr_len)其中參數(shù): sockfd: 由socket()調(diào)用返回的套接口文件描述符。 sockaddr: 數(shù)據(jù)結(jié)構(gòu)sockaddr中包括了關(guān)于本地地址、端口和IP地址的信息。 addr_len: 地址長度,可以設(shè)置成sizeof(structsockaddr)。 通常服務(wù)器在啟動時都會綁定一個眾所周知的地址(如IP地址+端口號),用于提供服務(wù),客戶端可以通過它連接服務(wù)器;而客戶端不用指定,有的系統(tǒng)會自動分配一個端口號和自身的IP地址組合。這就是為什么通常服務(wù)器端在listen()之前會調(diào)用bind(),而客戶端就不會調(diào)用,而是在connect()時由系統(tǒng)隨機生成一個。 函數(shù)返回: 如無錯誤發(fā)生,則bind()返回0;否則返回SOCKET_ERROR,應(yīng)用程序可通過WSAGetLastError()獲取相應(yīng)錯誤代碼。 3。 服務(wù)端使用listen()開啟監(jiān)聽 listen()在套接字函數(shù)中表示讓一個套接字處于監(jiān)聽到來的連接請求的狀態(tài)。從客戶端發(fā)來的連接請求將首先進入該等待隊列,等待本進程的處理。listen()定義如下: int listen(SOCKET socket, int backlog)其中參數(shù): socket: 一個已綁定未被連接的套接字描述符。 backlog: 進入隊列中允許的連接的個數(shù)。進入的連接請求在使用系統(tǒng)調(diào)用accept()應(yīng)答之前要在進入隊列中等待。該值是隊列中*多可以擁有的請求的個數(shù),大多數(shù)系統(tǒng)的默認設(shè)置為20。 函數(shù)返回: 無錯誤返回0;否則返回SOCKET ERROR,可以調(diào)用函數(shù)WSAGetLastError取得錯誤代碼。 例如,listen(s,1)表示連接請求隊列長度為1,即只允許有一個請求,若有多個請求,則出現(xiàn)錯誤,給出錯誤代碼WSAECONNREFUSED。 4。 接受從客戶端發(fā)來的請求 accept()是網(wǎng)絡(luò)編程的重要函數(shù),其作用是在一個套接口接受一個連接,其頭文件對于Windows系統(tǒng)是在#include中,而Linux系統(tǒng)則在#include 中。 accept()從端口的請求連接的等待連接隊列中抽取*個連接,創(chuàng)建一個與此同類的新的套接口并返回句柄。如果隊列中無等待連接,且套接口為阻塞方式,則accept()阻塞調(diào)用進程直至新的連接出現(xiàn)。如果套接口為非阻塞方式且隊列中無等待連接,則accept()返回一錯誤代碼。已接受連接的套接口不能用于接受新的連接,原套接口仍保持開放。accept()定義如下: SOCKETaccept(SOCKET socket, struct sockaddr address, int addr_len)其中參數(shù): Socket: 正在監(jiān)聽端口的套接口文件描述符。 Address: 客戶端的socket地址。 addr_len: socket地址的長度。 函數(shù)返回: 如果沒有錯誤產(chǎn)生,則accept()返回一個描述所接收包的SOCKET類型的值;否則返回INVALID_SOCKET錯誤,應(yīng)用程序可通過調(diào)用WSAGetLastError()獲得特定的錯誤代碼。 5。 發(fā)送和接收數(shù)據(jù) 建立連接后,客戶端和服務(wù)器端就可以進行數(shù)據(jù)傳輸了,通過使用send()發(fā)送數(shù)據(jù),使用recv()接收數(shù)據(jù)。int send(SOCKETsocket, char message, int msg_len,int flags)其中參數(shù): socket: 發(fā)送數(shù)據(jù)的套接口文件描述符。它可以通過socket()系統(tǒng)調(diào)用返回,也可以通過accept()系統(tǒng)調(diào)用得到。 message: 指向要發(fā)送的數(shù)據(jù)的指針。 msg_len: 要發(fā)送數(shù)據(jù)的字節(jié)長度。 flags: 標(biāo)志,一般設(shè)置為0。 函數(shù)返回: 無錯時返回實際發(fā)送的字節(jié)數(shù),否則返回SOCKET_ERROR。int recv(SOCKETsocket, char message, int msg_len,int flags)其中參數(shù): socket: 要讀取的套接口文件描述符。 message: 保存讀入信息的緩沖區(qū)起始地址。 msg_len: 緩沖區(qū)的*大長度。 flags: 標(biāo)志,一般設(shè)置為0。 函數(shù)返回: 無錯時返回實際接收的字節(jié)數(shù),否則返回SOCKET_ERROR。 6。 關(guān)閉連接套接字 使用close()調(diào)用關(guān)閉連接的套接口文件描述符: int closesocket(SOCKETsocket);之后就不能再對此套接口做任何的讀/寫操作。 7。 轉(zhuǎn)4或結(jié)束 3。3。2面向連接的客戶端工作流程 1。 創(chuàng)建套接字SOCKETsocket(int domain, int type, int protocol) 2。 發(fā)出連接請求 connect()用于建立與指定socket的連接。對于流類套接口(SOCK_STREAM類型),利用名字與一個遠程主機建立連接,一旦套接口調(diào)用成功返回,它就能收發(fā)數(shù)據(jù)了。對于數(shù)據(jù)報類套接口(SOCK_DGRAM類型),則設(shè)置成一個默認的目的地址,并用它進行后續(xù)的send()與recv()調(diào)用。int connect(SOCKET socket, struct sockaddr address, int addr_len)其中參數(shù): Socket: 由系統(tǒng)調(diào)用socket()返回的套接口文件描述符。 Address: 指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針,其中包括目的(即服務(wù)器)端口和IP地址。 addr_len: 地址長度,可以使用sizeof(struct sockaddr)獲得。 函數(shù)返回: 若無錯誤發(fā)生,則connect()返回0;否則返回SOCKET_ERROR錯誤,可通過WSAGetLastError()獲取相應(yīng)錯誤代碼。 3。 發(fā)送和接收數(shù)據(jù) 4。 關(guān)閉此連接的套接字 其工作過程如圖3.3所示。 圖3.3基本TCP客戶.服務(wù)器工作過程 3。4無連接的Client/Server模式 在無連接的Client/Server結(jié)構(gòu)中,服務(wù)器使用socket()和bind()函數(shù)調(diào)用建立和連接Socket。由于此時的Socket是無連接的,服務(wù)器使用recvfrom()函數(shù)從Socket接收數(shù)據(jù)?蛻舳艘仓徽{(diào)用bind()函數(shù)而不調(diào)用connect()函數(shù)。注意: 無連接的協(xié)議不在兩個端口之間建立點對點的連接,因此sendto()函數(shù)要求程序在一個參數(shù)中指明目的地址。recvfrom()函數(shù)不需要建立連接,它對到達相連協(xié)議端口的任何數(shù)據(jù)作出響應(yīng)。當(dāng)recvfrom()函數(shù)從Socket收到一個數(shù)據(jù)報時,它將保存發(fā)送此數(shù)據(jù)包的進程的網(wǎng)絡(luò)地址以及數(shù)據(jù)包本身。程序(服務(wù)器和客戶)用保存的地址去確定發(fā)送(客戶)進程。在必要的條件下,服務(wù)器將其應(yīng)答數(shù)據(jù)報送到從recvfrom()函數(shù)調(diào)用中所得到的網(wǎng)絡(luò)地址中去。其工作過程如圖3.4所示。 圖3.4基本UDP客戶.服務(wù)器工作過程 一般而言,大多數(shù)TCP服務(wù)器是并發(fā)的,而大多數(shù)UDP服務(wù)器是迭代的。多數(shù)TCP服務(wù)器是與調(diào)用fork處理每個客戶連接的服務(wù)器并發(fā)執(zhí)行的。迭代服務(wù)器沒有對fork的調(diào)用,所以單一服務(wù)器進程就處理了所有客戶。 3。5編 程 實 驗 在Visual C++中進行Winsock的API編程開發(fā)時,需要在項目中使用下面3個文件,否則會出現(xiàn)編譯錯誤。 (1) winsock。h: Winsock API的頭文件,需要包含在項目中。 (2) wsock32。lib: Winsock API連接庫文件。在使用中,一定要把它作為項目的非默認的連接庫包含到項目文件中。 (3) winsock。dll: Winsock的動態(tài)連接庫,位于Windows的安裝目錄下。 【例3.1】下面是一個有連接的編程實例。程序分兩部分: 服務(wù)器端程序和客戶端程序。 (1) 服務(wù)器端程序。//TCPdtd_server。cpp - main, TCPdaytimed #include #include #include #include void errexit(const char ,…); void TCPdaytimed(SOCKET); SOCKET passiveTCP(const char , int); #define QLEN5 #defineWSVERSMAKEWORD(2, 0) ……
你還可能感興趣
我要評論
|