關于我們
書單推薦
新書推薦
|
計算機網(wǎng)絡實驗教程
全書共分12章, 主要內(nèi)容包括: 實驗基礎、雙絞線、交換機技術、路由技術、訪問控制列表、IPv6 技術、NAT地址轉換、VPN技術、網(wǎng)絡嗅探與協(xié)議分析、網(wǎng)絡編程、網(wǎng)絡安全、綜合實驗。
本書重點突出,結構層次清晰,語言通俗易懂。有許多的典型應用實例。實例采用引導型模式,主要環(huán)節(jié)均留出思考空間。每個實例針對性很強,敘述和分析透徹,它包括網(wǎng)絡拓撲結構、實驗環(huán)境說明、實驗目的和要求、配置步驟、測試結果等,每章都配有相關實驗習題,具有可讀性、可操作性和實用性強的特點,特別適合于課堂教學。
作者在本書第1版的基礎上,對原內(nèi)容做了一些調(diào)整。原第1章不變,但內(nèi)容有刪減。原第9~11章調(diào)整為第2~4章,原第2~8章調(diào)整為第5~11章,并增加了新的第12章無線網(wǎng)絡,原綜合實驗調(diào)整為第13章。
本書第1版大部分內(nèi)容的操作系統(tǒng)是基于Windows XP的,第2版修改了不適用于Windows 10的部分。交換機與路由器的端口也從百兆升級為千兆端口,以銳捷的S5750、RSR20為參考設備,但實際上對于網(wǎng)絡設備的配置管理命令并沒有太大改變。書中交換機與路由器等網(wǎng)絡設備的配置實驗,對于不具備硬件實驗環(huán)境的可以采用第1章實驗基礎所介紹的Cisco仿真軟件模擬實現(xiàn)。針對目前無線網(wǎng)絡比較流行的情況,本版增加了相關內(nèi)容,供讀者學習參考。本書內(nèi)容覆蓋較為廣泛,將網(wǎng)絡知識和技術融于網(wǎng)絡配置實驗中,每章均配有用于鞏固所講授內(nèi)容的思考與練習題和上機實驗題,本版還增加了一些有挑戰(zhàn)性的實驗。本書可作為計算機網(wǎng)絡專業(yè)應用本科的實驗教材,也可作為網(wǎng)絡專業(yè)從業(yè)人員的自學教材。
全書共有13章,主要內(nèi)容包括實驗基礎(第1章)、網(wǎng)絡嗅探與協(xié)議分析(第2章)、網(wǎng)絡編程(第3章)、網(wǎng)絡安全(第4章)、雙絞線實驗(第5章)、交換機技術(第6章)、路由技術(第7章)、訪問控制列表(第8章)、網(wǎng)絡地址轉換(第9章)、VPN技術(第10章)、IPv6技術(第11章)、無線技術(第12章)、綜合實驗(第13章)。
本書重點突出,結構層次清晰,語言通俗易懂,有眾多的網(wǎng)絡實驗,每個實驗針對性很強,敘述和分析透徹,包括網(wǎng)絡拓撲結構、實驗環(huán)境說明、實驗目的和要求、配置步驟、測試結果等,具有可讀性、可操作性和實用性強的特點。本書十分重視實驗前后的驗證,同時在實驗中插入了許多思考和討論環(huán)節(jié)。
在本書的編寫過程中,參考了大量銳捷網(wǎng)絡的技術資料和培訓教材,借鑒了許多網(wǎng)絡工程和網(wǎng)絡同仁的寶貴經(jīng)驗,在此表示誠摯的謝意。由于作者水平有限,書中的不妥和錯誤在所難免,誠請各位專家和讀者批評指正。
編者
2017年2月
王盛邦, 碩士、高工,主要從事軟件開發(fā)和計算機類課程教學工作,研究方向是計算機網(wǎng)絡、信息安全。曾講授的課程有“計算機網(wǎng)絡及應用”、“計算機網(wǎng)絡實驗”、“計算機網(wǎng)絡與信息安全基礎”、“網(wǎng)絡安全原理與技術實驗”、“信息安全綜合實踐”等。
曾任全國大學生嵌入式大賽中山大學參賽小組指導老師、全國大學生信息安全競賽中大參賽隊的指導老師、中山大學信息安全競賽校際選拔賽評委、全國大學生信息安全競賽網(wǎng)評專家。
曾主持校級實驗室開放基金項目“計算機網(wǎng)絡創(chuàng)新實驗”、“EMC教學實驗案例的設計與開發(fā)”、“計算機網(wǎng)絡實踐課程改革與實驗教材建設”、“計算機網(wǎng)絡實踐課程自主創(chuàng)新本科教學體系建設”、““計算機網(wǎng)絡實驗”精品課程建設”、“信息安全專業(yè)綜合實踐實驗改革與設計”、“信息安全綜合實踐課程建設”、“教材建設-網(wǎng)絡與信息安全綜合實踐”等。
所編寫廣東省本科高校教學質(zhì)量與教學改革工程立項建設項目《網(wǎng)絡與信息安全綜合實踐》被全國多所高校采用。
第1章實驗基礎1
1.1常用網(wǎng)絡命令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地址基礎16
1.2.1IPv4地址表示16
1.2.2IPv4地址結構16
1.2.3IPv4地址分類17
1.2.4網(wǎng)絡掩碼17
1.2.5子網(wǎng)掩碼與子網(wǎng)劃分18
1.2.6子網(wǎng)劃分實例18
1.3網(wǎng)絡包分析工具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)絡模擬軟件Packet Tracer29
1.4.1Packet Tracer界面29
1.4.2設備管理33
1.4.3通過Packet Tracer分析協(xié)議35
1.4.4Packet Tracer使用實驗38
1.5繪制網(wǎng)絡拓撲圖40
1.5.1網(wǎng)絡設備圖例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
習題145第2章網(wǎng)絡嗅探與協(xié)議分析50
2.1網(wǎng)絡嗅探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客戶/服務器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的基本服務69
2.6.2選項協(xié)商70
2.6.3Telnet客戶機和服務器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
習題287第3章網(wǎng)絡編程91
3.1利用套接字建立邏輯信道92
3.2Client/Server工作模式分類93
3.3面向連接的Client/Server模式93
3.3.1面向連接的服務器工作流程93
3.3.2面向連接的客戶端工作流程95
3.4無連接的Client/Server模式97
3.5編程實驗97
實驗3.1TCP通信程序設計102
實驗3.2UDP通信程序設計103
實驗3.3網(wǎng)絡嗅探器設計104
實驗3.4停等協(xié)議通信106
實驗3.5GBN協(xié)議編程107
實驗3.6IPv4組播通信108
實驗3.7應用層組播113
習題3115第4章網(wǎng)絡安全117
4.1Linux防火墻配置117
4.1.1netfilter/iptables118
4.1.2建立規(guī)則和鏈119
4.1.3其他NAT配置123
實驗4.1Linux防火墻設計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盜鏈與反盜鏈技術131
4.3.1盜鏈原理131
4.3.2反盜鏈技術131
實驗4.3分析某下載軟件的盜鏈行為132
4.4蜜罐技術133
實驗4.4簡單蜜罐陷阱的配置134
4.5入侵檢測技術136
實驗4.5入侵檢測實驗137
習題4138第5章雙絞線實驗142
5.1雙絞線142
5.2RJ.45連接器145
5.3雙絞線跳線的制作標準和跳線類型147
5.3.1T568.A標準與T568.B標準147
5.3.2跳線線序148
5.3.3直連線和交叉線148
實驗5.1雙絞線跳線的制作和測試149
5.4信息模塊152
實驗5.2信息模塊的壓制和測試154
習題5156第6章交換機技術157
6.1交換機技術基礎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交換機配置基礎161
6.1.8交換機的命令模式162
6.2VLAN技術163
6.2.1基本概念163
6.2.2VLAN的分類164
6.2.3VLAN數(shù)據(jù)幀的標識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é)議小結215
6.6交換技術的發(fā)展前景215
習題6216第7章路由技術223
7.1路由器技術基礎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é)議小結269
習題7269第8章訪問控制列表279
8.1基本概念279
8.2ACL匹配性檢查280
8.2.1ACL的匹配過程280
第3章網(wǎng) 絡 編 程 本章主要介紹網(wǎng)絡編程的一些主要方法,并配有編程實驗。一些實驗只提出要求,程序編寫過程需要讀者自行完成。 如果應用程序涉及本地與遠程之間的通信,就需要采用網(wǎng)絡編程。網(wǎng)絡編程*主要的工作就是在發(fā)送端把信息通過規(guī)定好的協(xié)議進行包的組裝,在接收端按照規(guī)定好的協(xié)議把包進行解析并提取出對應的信息,從而達到通信的目的。中間*主要的就是數(shù)據(jù)包的組裝、過濾、捕獲和分析以及其他處理。 通過使用套接字達到進程間通信目的的編程就是網(wǎng)絡編程。套接字即Socket,應用程序通常通過套接字向網(wǎng)絡發(fā)出請求或者應答網(wǎng)絡請求,實際上是網(wǎng)絡應用程序接口(API)。套接字是由傳輸層提供的應用程序(進程)和網(wǎng)絡之間的接入點,如圖3.1所示。應用程序(進程)可以通過套接字訪問網(wǎng)絡,套接字利用主機的網(wǎng)絡層地址和端口號為兩個進程建立邏輯連接。 圖3.1Socket是應用層與傳輸層之間的橋梁 套接字可以用于多種協(xié)議,包括TCP/IP協(xié)議。常用的端口號如表3.1所示。表3.1TCP/IP常用端口號協(xié)議NNTPFTP(數(shù)據(jù))FTP(控制)TelnetSTMPHTTPPOP3端口號192021232580110為了方便網(wǎng)絡編程,20世紀90年代初,Microsoft聯(lián)合其他幾家公司共同制定了一套Windows下的網(wǎng)絡編程接口,即Windows Sockets規(guī)范。它不是一種網(wǎng)絡協(xié)議,而是一套開放的、支持多種協(xié)議的Windows下的網(wǎng)絡編程接口。現(xiàn)在的Winsock已經(jīng)基本上實現(xiàn)了與協(xié)議無關,可以使用Winsock調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。Socket實際上是在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有Socket接口的計算機通信。應用程序在網(wǎng)絡上傳輸,接收的信息都通過這個Socket接口實現(xiàn)。 Socket是TCP/IP網(wǎng)絡的API,Socket接口提供了很多的函數(shù),可以用于開發(fā)網(wǎng)絡應用程序。Socket數(shù)據(jù)傳輸是一種特殊的I/O,同時Socket也是一種文件描述符。Socket的使用主要有Socket建立、配置、建立連接、數(shù)據(jù)傳輸和結束傳輸?shù)冗^程。 3。1利用套接字建立邏輯信道 一般發(fā)起通信請求的程序被稱為客戶端,用戶一般是通過客戶端軟件訪問某種服務?蛻舳藨贸绦蛲ㄟ^與服務器建立連接和發(fā)送請求,然后接收服務器返回的內(nèi)容。服務器則一般是等待并處理客戶端請求的應用程序。服務器通常由系統(tǒng)執(zhí)行,在系統(tǒng)生存期間一直存在和等待客戶端的請求,并且在接收到客戶端的請求后,根據(jù)請求向客戶端返回合適的內(nèi)容。 通信的一方(被動方,稱為服務器)監(jiān)聽某個端口;通信的另一方(主動方,稱為客戶端)如果知道服務器的IP地址和它所監(jiān)聽的端口, 便可以試圖發(fā)送請求建立連接。該連接請求包含: 服務器IP地址、服務器端口號、客戶IP地址、客戶端口號。由于客戶端口號由客戶端的系統(tǒng)(TCP進程)自動選取一個當前未用的端口,該四元組便可以在因特網(wǎng)中*標識一個邏輯連接。服務器收到客戶端發(fā)來的連接請求后,便發(fā)出響應建立該連接,這樣就建立了一條邏輯信道。 客戶和服務器通過請求響應方式可以進行雙向數(shù)據(jù)傳輸。當結束數(shù)據(jù)傳輸時,需要關閉該連接。這種工作模式是有連接的客戶端/服務器模式(Client/Server)。 根據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟: 服務器監(jiān)聽,客戶端請求,連接確認。 (1) 服務器監(jiān)聽: 是指服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡狀態(tài)。 (2) 客戶端請求: 是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后向服務器端套接字提出連接請求。 (3) 連接確認: 是指當服務器端套接字監(jiān)聽到或者接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。 這三個步驟類似于三次握手,如圖3.2所示。 圖3.2客戶端與服務器端的三次握手3。2Client/Server工作模式分類 Client/Server工作模式一般按下列分類: (1) 有狀態(tài)和無狀態(tài): 服務器是否記錄客戶端的當前狀態(tài)。 (2) 有連接(TCP)和無連接(UDP): 客戶端和服務器之間是否先建立連接再傳輸數(shù)據(jù)。 (3) 循環(huán)和并發(fā): 服務器對多客戶端請求的服務是采用循環(huán)方法還是并發(fā)程序方法。 TCP協(xié)議面向連接,使用可靠的字節(jié)流傳送服務;而UDP協(xié)議面向非連接,使用非可靠的數(shù)據(jù)報服務。TCP協(xié)議提供高可靠性的傳輸,UDP協(xié)議提供高效的傳輸。它們在實際應用中有其各自所適應的場合。 3。3面向連接的Client/Server模式 在面向連接的Client/Server結構中,操作過程采取的是主動請求方式: 服務器首先啟動,并根據(jù)請求提供相應服務。 通過調(diào)用socket()建立一個套接口,然后調(diào)用bind()將該套接口和本地網(wǎng)絡地址聯(lián)系在一起,再調(diào)用listen()使套接口做好偵聽的準備,并規(guī)定它的請求隊列的長度,之后調(diào)用accept()接收連接?蛻舳嗽诮⑻捉涌诤缶涂烧{(diào)用connect()和服務器建立連接。連接一旦建立,客戶機和服務器之間就可以供對方讀取或者讀取對方數(shù)據(jù)。*后在數(shù)據(jù)傳送結束后,雙方調(diào)用close()關閉套接口。 3。3。1面向連接的服務器工作流程 面向連接的服務器工作流程包括以下幾個環(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é)議族,如果取值AF_INET,用于網(wǎng)絡通信;如果取值AF_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ù)結構分配了一個名字空間并返回指針,接著要對數(shù)據(jù)結構提供數(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ù)結構sockaddr中包括了關于本地地址、端口和IP地址的信息。 addr_len: 地址長度,可以設置成sizeof(structsockaddr)。 通常服務器在啟動時都會綁定一個眾所周知的地址(如IP地址+端口號),用于提供服務,客戶端可以通過它連接服務器;而客戶端不用指定,有的系統(tǒng)會自動分配一個端口號和自身的IP地址組合。這就是為什么通常服務器端在listen()之前會調(diào)用bind(),而客戶端就不會調(diào)用,而是在connect()時由系統(tǒng)隨機生成一個。 函數(shù)返回: 如無錯誤發(fā)生,則bind()返回0;否則返回SOCKET_ERROR,應用程序可通過WSAGetLastError()獲取相應錯誤代碼。 3。 服務端使用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()應答之前要在進入隊列中等待。該值是隊列中*多可以擁有的請求的個數(shù),大多數(shù)系統(tǒng)的默認設置為20。 函數(shù)返回: 無錯誤返回0;否則返回SOCKET ERROR,可以調(diào)用函數(shù)WSAGetLastError取得錯誤代碼。 例如,listen(s,1)表示連接請求隊列長度為1,即只允許有一個請求,若有多個請求,則出現(xiàn)錯誤,給出錯誤代碼WSAECONNREFUSED。 4。 接受從客戶端發(fā)來的請求 accept()是網(wǎng)絡編程的重要函數(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錯誤,應用程序可通過調(diào)用WSAGetLastError()獲得特定的錯誤代碼。 5。 發(fā)送和接收數(shù)據(jù) 建立連接后,客戶端和服務器端就可以進行數(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: 標志,一般設置為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: 標志,一般設置為0。 函數(shù)返回: 無錯時返回實際接收的字節(jié)數(shù),否則返回SOCKET_ERROR。 6。 關閉連接套接字 使用close()調(diào)用關閉連接的套接口文件描述符: int closesocket(SOCKETsocket);之后就不能再對此套接口做任何的讀/寫操作。 7。 轉4或結束 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類型),則設置成一個默認的目的地址,并用它進行后續(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ù)結構sockaddr的指針,其中包括目的(即服務器)端口和IP地址。 addr_len: 地址長度,可以使用sizeof(struct sockaddr)獲得。 函數(shù)返回: 若無錯誤發(fā)生,則connect()返回0;否則返回SOCKET_ERROR錯誤,可通過WSAGetLastError()獲取相應錯誤代碼。 3。 發(fā)送和接收數(shù)據(jù) 4。 關閉此連接的套接字 其工作過程如圖3.3所示。 圖3.3基本TCP客戶.服務器工作過程 3。4無連接的Client/Server模式 在無連接的Client/Server結構中,服務器使用socket()和bind()函數(shù)調(diào)用建立和連接Socket。由于此時的Socket是無連接的,服務器使用recvfrom()函數(shù)從Socket接收數(shù)據(jù)?蛻舳艘仓徽{(diào)用bind()函數(shù)而不調(diào)用connect()函數(shù)。注意: 無連接的協(xié)議不在兩個端口之間建立點對點的連接,因此sendto()函數(shù)要求程序在一個參數(shù)中指明目的地址。recvfrom()函數(shù)不需要建立連接,它對到達相連協(xié)議端口的任何數(shù)據(jù)作出響應。當recvfrom()函數(shù)從Socket收到一個數(shù)據(jù)報時,它將保存發(fā)送此數(shù)據(jù)包的進程的網(wǎng)絡地址以及數(shù)據(jù)包本身。程序(服務器和客戶)用保存的地址去確定發(fā)送(客戶)進程。在必要的條件下,服務器將其應答數(shù)據(jù)報送到從recvfrom()函數(shù)調(diào)用中所得到的網(wǎng)絡地址中去。其工作過程如圖3.4所示。 圖3.4基本UDP客戶.服務器工作過程 一般而言,大多數(shù)TCP服務器是并發(fā)的,而大多數(shù)UDP服務器是迭代的。多數(shù)TCP服務器是與調(diào)用fork處理每個客戶連接的服務器并發(fā)執(zhí)行的。迭代服務器沒有對fork的調(diào)用,所以單一服務器進程就處理了所有客戶。 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】下面是一個有連接的編程實例。程序分兩部分: 服務器端程序和客戶端程序。 (1) 服務器端程序。//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) ……
你還可能感興趣
我要評論
|