版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
網(wǎng)絡(luò)編程快速入門作業(yè)指導(dǎo)書TOC\o"1-2"\h\u32607第1章網(wǎng)絡(luò)編程基礎(chǔ) 3161151.1網(wǎng)絡(luò)協(xié)議簡(jiǎn)介 398891.1.1TCP協(xié)議 4307261.1.2IP協(xié)議 4142041.1.3HTTP協(xié)議 4141711.1.4FTP協(xié)議 4126481.2網(wǎng)絡(luò)模型與分層結(jié)構(gòu) 4309661.2.1OSI模型 4228121.2.2TCP/IP模型 5195601.3套接字編程概述 5201501.3.1套接字的概念 5114921.3.2套接字編程接口 513827第2章TCP/IP協(xié)議族 6304312.1IP協(xié)議 625792.1.1無連接 6204302.1.2不可靠 6160102.1.3分片與重組 6145302.1.4路由選擇 692832.2TCP協(xié)議 628012.2.1面向連接 6297642.2.2可靠傳輸 7218652.2.3流量控制 7151202.2.4擁塞控制 734602.3UDP協(xié)議 7286402.3.1面向無連接 7204362.3.2不可靠傳輸 777542.3.3面向數(shù)據(jù)報(bào) 775892.3.4頭部開銷小 732337第3章套接字編程入門 790243.1套接字創(chuàng)建與關(guān)閉 7302193.1.1套接字創(chuàng)建 7137163.1.2套接字關(guān)閉 864453.2地址結(jié)構(gòu)及字節(jié)序轉(zhuǎn)換 8271283.2.1地址結(jié)構(gòu) 877433.2.2字節(jié)序轉(zhuǎn)換 82873.3與監(jiān)聽 9159553.3.1 9262223.3.2監(jiān)聽 923396第4章基于TCP的網(wǎng)絡(luò)編程 10203174.1TCP服務(wù)器端實(shí)現(xiàn) 10273454.1.1創(chuàng)建套接字 1088424.1.2綁定地址和端口 10195994.1.3監(jiān)聽連接 10196154.1.4接受連接 11156214.1.5數(shù)據(jù)通信 1164664.1.6關(guān)閉連接 12160484.2TCP客戶端實(shí)現(xiàn) 1263084.2.1創(chuàng)建套接字 125144.2.2連接服務(wù)器 1277874.2.3數(shù)據(jù)通信 13176864.2.4關(guān)閉連接 1333404.3TCP粘包問題及解決方案 13128524.3.1粘包問題產(chǎn)生原因 13309274.3.2解決方案 1315158第5章基于UDP的網(wǎng)絡(luò)編程 14184475.1UDP服務(wù)器端實(shí)現(xiàn) 1485205.1.1引言 14252155.1.2環(huán)境準(zhǔn)備 1450325.1.3服務(wù)器端編程步驟 14203355.1.4示例代碼 14259265.2UDP客戶端實(shí)現(xiàn) 15254515.2.1引言 1562585.2.2客戶端編程步驟 15244915.2.3示例代碼 15145925.3UDP數(shù)據(jù)報(bào)文處理 16148955.3.1引言 161375.3.2數(shù)據(jù)報(bào)文格式 16152225.3.3數(shù)據(jù)報(bào)文處理注意事項(xiàng) 16239845.3.4示例代碼 1718224第6章網(wǎng)絡(luò)應(yīng)用層協(xié)議 17324056.1HTTP協(xié)議 1739436.1.1HTTP請(qǐng)求與響應(yīng) 17163496.1.2HTTP報(bào)文格式 18117526.1.3HTTP連接管理 18115096.2FTP協(xié)議 18158586.2.1FTP工作模式 18254706.2.2FTP命令與響應(yīng) 1883186.2.3FTP安全性 18314916.3SMTP協(xié)議 18101356.3.1SMTP工作流程 18233946.3.2SMTP命令與響應(yīng) 1824586.3.3SMTP擴(kuò)展 1932665第7章網(wǎng)絡(luò)安全基礎(chǔ) 19172417.1加密與解密技術(shù) 19204317.1.1對(duì)稱加密算法 1921677.1.2非對(duì)稱加密算法 19217167.1.3混合加密算法 1970267.2數(shù)字證書與SSL 19226347.2.1數(shù)字證書 19294987.2.2SSL協(xié)議 20248557.3防火墻與入侵檢測(cè) 205817.3.1防火墻 20116067.3.2入侵檢測(cè) 2021378第8章網(wǎng)絡(luò)編程進(jìn)階 20126278.1多線程與并發(fā) 2050128.1.1線程的概念與創(chuàng)建 20296008.1.2線程同步與互斥鎖 2044168.1.3線程池 20185668.2非阻塞IO與事件驅(qū)動(dòng) 21220038.2.1非阻塞IO 21104598.2.2事件驅(qū)動(dòng)編程 21163298.3網(wǎng)絡(luò)編程功能優(yōu)化 2121788.3.1網(wǎng)絡(luò)協(xié)議優(yōu)化 2142218.3.2數(shù)據(jù)傳輸優(yōu)化 21291918.3.3網(wǎng)絡(luò)庫與框架選擇 21166818.3.4異步IO與協(xié)程 216128第9章常用網(wǎng)絡(luò)庫與框架 21104379.1Boost.Asio庫 21209209.1.1簡(jiǎn)介 21132429.1.2主要功能 22270289.1.3使用示例 2274409.2MFC網(wǎng)絡(luò)編程 2224209.2.1簡(jiǎn)介 23240549.2.2主要功能 23186439.2.3使用示例 23283539.3基于Java的網(wǎng)絡(luò)編程 24108449.3.1簡(jiǎn)介 2432109.3.2主要功能 2439549.3.3使用示例 244372第10章實(shí)戰(zhàn)項(xiàng)目:開發(fā)一個(gè)簡(jiǎn)易聊天室 25641410.1項(xiàng)目需求分析 25580310.2系統(tǒng)架構(gòu)設(shè)計(jì) 252678410.3功能實(shí)現(xiàn)與調(diào)試優(yōu)化 26第1章網(wǎng)絡(luò)編程基礎(chǔ)1.1網(wǎng)絡(luò)協(xié)議簡(jiǎn)介網(wǎng)絡(luò)協(xié)議是計(jì)算機(jī)網(wǎng)絡(luò)中通信實(shí)體之間進(jìn)行數(shù)據(jù)交換的規(guī)則和約定。它定義了數(shù)據(jù)的格式、傳輸方式、傳輸順序等,以保證數(shù)據(jù)在不同計(jì)算機(jī)之間正確、高效地傳輸。常見的網(wǎng)絡(luò)協(xié)議包括TCP(傳輸控制協(xié)議)、IP(互聯(lián)網(wǎng)協(xié)議)、HTTP(超文本傳輸協(xié)議)、FTP(文件傳輸協(xié)議)等。本節(jié)將對(duì)這些協(xié)議進(jìn)行簡(jiǎn)要介紹。1.1.1TCP協(xié)議TCP(傳輸控制協(xié)議)是一種面向連接、可靠的數(shù)據(jù)傳輸協(xié)議。它提供全雙工通信,保證數(shù)據(jù)在傳輸過程中不丟失、不重復(fù),并按照發(fā)送順序到達(dá)接收方。TCP協(xié)議通過三次握手建立連接,四次揮手?jǐn)嚅_連接,并采用滑動(dòng)窗口機(jī)制進(jìn)行流量控制。1.1.2IP協(xié)議IP(互聯(lián)網(wǎng)協(xié)議)是網(wǎng)絡(luò)層的主要協(xié)議,負(fù)責(zé)將數(shù)據(jù)包從源主機(jī)發(fā)送到目的主機(jī)。它使用IP地址標(biāo)識(shí)網(wǎng)絡(luò)中的設(shè)備,并通過路由算法選擇最佳路徑進(jìn)行數(shù)據(jù)傳輸。IP協(xié)議提供不可靠、無連接的數(shù)據(jù)傳輸服務(wù)。1.1.3HTTP協(xié)議HTTP(超文本傳輸協(xié)議)是應(yīng)用層協(xié)議,主要用于在Web瀏覽器和服務(wù)器之間傳輸超文本數(shù)據(jù)。它基于請(qǐng)求/響應(yīng)模式,客戶端發(fā)送請(qǐng)求,服務(wù)器返回響應(yīng)。HTTP協(xié)議使用統(tǒng)一資源定位符(URL)標(biāo)識(shí)網(wǎng)絡(luò)資源。1.1.4FTP協(xié)議FTP(文件傳輸協(xié)議)是用于在計(jì)算機(jī)之間傳輸文件的協(xié)議。它基于客戶端/服務(wù)器模式,客戶端通過FTP協(xié)議連接到服務(wù)器,或文件。1.2網(wǎng)絡(luò)模型與分層結(jié)構(gòu)網(wǎng)絡(luò)模型是對(duì)計(jì)算機(jī)網(wǎng)絡(luò)通信過程的抽象和劃分。目前廣泛采用的是OSI(開放式系統(tǒng)互聯(lián))模型和TCP/IP模型。這兩種模型都將網(wǎng)絡(luò)通信劃分為不同層次,每一層完成特定的功能。1.2.1OSI模型OSI模型共分為七層,從下到上分別為:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層和應(yīng)用層。每一層負(fù)責(zé)不同的功能,如下:(1)物理層:負(fù)責(zé)傳輸原始比特流,如電纜、光纖等;(2)數(shù)據(jù)鏈路層:負(fù)責(zé)在相鄰節(jié)點(diǎn)之間建立、管理和終止連接,如以太網(wǎng)、PPP等;(3)網(wǎng)絡(luò)層:負(fù)責(zé)數(shù)據(jù)包的傳輸和路由選擇,如IP協(xié)議;(4)傳輸層:負(fù)責(zé)提供端到端的可靠傳輸,如TCP、UDP協(xié)議;(5)會(huì)話層:負(fù)責(zé)建立、管理和終止會(huì)話;(6)表示層:負(fù)責(zé)數(shù)據(jù)的表示和加密;(7)應(yīng)用層:為應(yīng)用軟件提供網(wǎng)絡(luò)服務(wù),如HTTP、FTP等。1.2.2TCP/IP模型TCP/IP模型共分為四層,從下到上分別為:網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。與OSI模型相比,TCP/IP模型更加簡(jiǎn)潔,如下:(1)網(wǎng)絡(luò)接口層:相當(dāng)于OSI模型的物理層和數(shù)據(jù)鏈路層,負(fù)責(zé)數(shù)據(jù)在物理媒介上的傳輸;(2)網(wǎng)絡(luò)層:相當(dāng)于OSI模型的網(wǎng)絡(luò)層,負(fù)責(zé)數(shù)據(jù)包的傳輸和路由選擇;(3)傳輸層:相當(dāng)于OSI模型的傳輸層,負(fù)責(zé)提供端到端的可靠傳輸;(4)應(yīng)用層:相當(dāng)于OSI模型的會(huì)話層、表示層和應(yīng)用層,為應(yīng)用軟件提供網(wǎng)絡(luò)服務(wù)。1.3套接字編程概述套接字(Socket)編程是網(wǎng)絡(luò)編程的一種重要方式,它允許程序員通過編程接口實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)通信的控制。套接字是操作系統(tǒng)提供的一種通信機(jī)制,用于在兩個(gè)進(jìn)程之間進(jìn)行數(shù)據(jù)交換。1.3.1套接字的概念套接字是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,它可以看作是不同計(jì)算機(jī)之間通信的通道。每個(gè)套接字都有唯一的地址,包括IP地址和端口號(hào)。根據(jù)傳輸層協(xié)議的不同,套接字可以分為TCP套接字和UDP套接字。1.3.2套接字編程接口套接字編程接口提供了一組函數(shù),用于創(chuàng)建、配置、使用和關(guān)閉套接字。常見的套接字函數(shù)包括:(1)socket():創(chuàng)建套接字;(2)bind():將套接字綁定到特定地址和端口;(3)listen():設(shè)置套接字為監(jiān)聽模式,等待客戶端連接;(4)accept():接受客戶端連接請(qǐng)求,建立連接;(5)connect():客戶端發(fā)起連接請(qǐng)求;(6)send()和recv():發(fā)送和接收數(shù)據(jù);(7)close():關(guān)閉套接字。通過套接字編程,程序員可以實(shí)現(xiàn)各種網(wǎng)絡(luò)應(yīng)用,如Web服務(wù)器、客戶端、聊天程序等。掌握套接字編程是進(jìn)行網(wǎng)絡(luò)編程的基礎(chǔ)。第2章TCP/IP協(xié)議族2.1IP協(xié)議IP協(xié)議(InternetProtocol)是互聯(lián)網(wǎng)中最為關(guān)鍵的協(xié)議之一,負(fù)責(zé)實(shí)現(xiàn)不同網(wǎng)絡(luò)設(shè)備間的數(shù)據(jù)傳輸。其主要功能包括:為傳輸數(shù)據(jù)包提供尋址和路由,保證數(shù)據(jù)包能夠從源主機(jī)傳輸?shù)侥康闹鳈C(jī)。IP協(xié)議具有以下特點(diǎn):2.1.1無連接IP協(xié)議采用無連接方式,即在數(shù)據(jù)傳輸前不需要建立連接。每個(gè)數(shù)據(jù)包獨(dú)立處理,并獨(dú)立選擇路徑。2.1.2不可靠IP協(xié)議不保證數(shù)據(jù)包的可靠傳輸。當(dāng)數(shù)據(jù)包在傳輸過程中出現(xiàn)錯(cuò)誤或丟失時(shí),IP協(xié)議不會(huì)主動(dòng)重傳。2.1.3分片與重組IP協(xié)議允許數(shù)據(jù)包在傳輸過程中進(jìn)行分片,以適應(yīng)不同網(wǎng)絡(luò)設(shè)備的最大傳輸單元(MTU)。到達(dá)目的主機(jī)后,分片會(huì)被重新組裝成原始數(shù)據(jù)包。2.1.4路由選擇IP協(xié)議通過路由選擇算法,為數(shù)據(jù)包選擇合適的路徑,保證數(shù)據(jù)包能夠從源主機(jī)傳輸?shù)侥康闹鳈C(jī)。2.2TCP協(xié)議TCP協(xié)議(TransmissionControlProtocol)是IP協(xié)議族中的一種傳輸層協(xié)議,提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù)。其主要特點(diǎn)如下:2.2.1面向連接TCP協(xié)議在數(shù)據(jù)傳輸前需要建立連接。通過三次握手(ThreewayHandshake)過程,保證連接的可靠性。2.2.2可靠傳輸TCP協(xié)議通過序號(hào)、確認(rèn)應(yīng)答、重傳機(jī)制等,保證數(shù)據(jù)包的可靠傳輸。2.2.3流量控制TCP協(xié)議采用滑動(dòng)窗口機(jī)制,實(shí)現(xiàn)流量控制,防止網(wǎng)絡(luò)擁塞。2.2.4擁塞控制TCP協(xié)議通過擁塞窗口、慢啟動(dòng)、擁塞避免、快速重傳和快速恢復(fù)等機(jī)制,有效控制網(wǎng)絡(luò)擁塞。2.3UDP協(xié)議UDP協(xié)議(UserDatagramProtocol)是IP協(xié)議族中的一種傳輸層協(xié)議,提供面向無連接的數(shù)據(jù)傳輸服務(wù)。其主要特點(diǎn)如下:2.3.1面向無連接UDP協(xié)議在數(shù)據(jù)傳輸前不需要建立連接,數(shù)據(jù)包可以直接發(fā)送給目的主機(jī)。2.3.2不可靠傳輸U(kuò)DP協(xié)議不保證數(shù)據(jù)包的可靠傳輸,數(shù)據(jù)包在傳輸過程中可能會(huì)出現(xiàn)丟失、重復(fù)或亂序。2.3.3面向數(shù)據(jù)報(bào)UDP協(xié)議以數(shù)據(jù)報(bào)為單位進(jìn)行數(shù)據(jù)傳輸,每個(gè)數(shù)據(jù)報(bào)具有固定的長(zhǎng)度。2.3.4頭部開銷小UDP協(xié)議的頭部開銷相對(duì)較小,適用于對(duì)實(shí)時(shí)性要求較高的應(yīng)用場(chǎng)景,如視頻會(huì)議、在線游戲等。第3章套接字編程入門3.1套接字創(chuàng)建與關(guān)閉3.1.1套接字創(chuàng)建在套接字編程中,首先需要?jiǎng)?chuàng)建套接字。套接字是通信鏈路的端點(diǎn),用于在不同的計(jì)算機(jī)進(jìn)程之間傳輸數(shù)據(jù)。以下是創(chuàng)建套接字的函數(shù)及其用法:cinclude<sys/socket.h>intsocket(intdomain,inttype,intprotocol);domain:指定協(xié)議族,如AF_INET表示IPv4協(xié)議族。type:指定套接字類型,如SOCK_STREAM表示面向連接的套接字,SOCK_DGRAM表示無連接的套接字。protocol:通常設(shè)置為0,表示使用默認(rèn)協(xié)議。3.1.2套接字關(guān)閉當(dāng)通信結(jié)束后,需要關(guān)閉套接字以釋放資源。以下是關(guān)閉套接字的函數(shù)及其用法:cinclude<unistd.h>intclose(intsockfd);sockfd:要關(guān)閉的套接字描述符。3.2地址結(jié)構(gòu)及字節(jié)序轉(zhuǎn)換3.2.1地址結(jié)構(gòu)在網(wǎng)絡(luò)編程中,需要表示套接字的地址信息。對(duì)于IPv4協(xié)議族,使用sockaddr_in結(jié)構(gòu)體表示地址信息:cinclude<netinet/in.h>structsockaddr_in{sa_family_tsin_family;//地址族,通常為AF_INETin_port_tsin_port;//端口號(hào)structin_addrsin_addr;//IP地址};structin_addr{in_addr_ts_addr;//IP地址,通常使用點(diǎn)分十進(jìn)制表示法};3.2.2字節(jié)序轉(zhuǎn)換由于網(wǎng)絡(luò)字節(jié)序和主機(jī)字節(jié)序可能不一致,需要將地址信息轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序。以下是相關(guān)的字節(jié)序轉(zhuǎn)換函數(shù):cinclude<arpa/inet.h>uint32_thtonl(uint32_thostlong);//主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序(長(zhǎng)整數(shù))uint16_thtons(uint16_thostshort);//主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序(短整數(shù))uint32_tntohl(uint32_tnetlong);//網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序(長(zhǎng)整數(shù))uint16_tntohs(uint16_tnetshort);//網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序(短整數(shù))3.3與監(jiān)聽3.3.1客戶端使用connect函數(shù)與服務(wù)器建立連接:cinclude<sys/socket.h>intconnect(intsockfd,conststructsockaddrservaddr,socklen_taddrlen);sockfd:已創(chuàng)建的套接字描述符。servaddr:指向服務(wù)器地址結(jié)構(gòu)的指針。addrlen:地址結(jié)構(gòu)長(zhǎng)度。3.3.2監(jiān)聽服務(wù)器使用listen函數(shù)監(jiān)聽客戶端的連接請(qǐng)求:cinclude<sys/socket.h>intlisten(intsockfd,intbacklog);sockfd:已創(chuàng)建的套接字描述符。backlog:等待處理的連接請(qǐng)求的最大數(shù)量。當(dāng)服務(wù)器收到客戶端的連接請(qǐng)求時(shí),使用accept函數(shù)接受連接:cinclude<sys/socket.h>intaccept(intsockfd,structsockaddrcliaddr,socklen_taddrlen);sockfd:已監(jiān)聽的套接字描述符。cliaddr:指向客戶端地址結(jié)構(gòu)的指針。addrlen:指向地址結(jié)構(gòu)長(zhǎng)度的指針。通過以上步驟,服務(wù)器與客戶端之間可以建立可靠的連接,進(jìn)行數(shù)據(jù)傳輸。第4章基于TCP的網(wǎng)絡(luò)編程4.1TCP服務(wù)器端實(shí)現(xiàn)在本節(jié)中,我們將介紹如何實(shí)現(xiàn)一個(gè)基于TCP協(xié)議的服務(wù)器端程序。以下是實(shí)現(xiàn)TCP服務(wù)器端的基本步驟:4.1.1創(chuàng)建套接字服務(wù)器端需要?jiǎng)?chuàng)建一個(gè)套接字(Socket),用于監(jiān)聽客戶端的連接請(qǐng)求。cintserver_fd=socket(AF_INET,SOCK_STREAM,0);if(server_fd==1){perror("socketcreationfailed");exit(EXIT_FLURE);}4.1.2綁定地址和端口cstructsockaddr_inserver_addr;memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(PORT);if(bind(server_fd,(structsockaddr)&server_addr,sizeof(server_addr))<0){perror("bindfailed");exit(EXIT_FLURE);}4.1.3監(jiān)聽連接服務(wù)器端需要調(diào)用listen函數(shù),以便監(jiān)聽客戶端的連接請(qǐng)求。cif(listen(server_fd,MAX_PENDING_CONN)<0){perror("listenfailed");exit(EXIT_FLURE);}4.1.4接受連接當(dāng)服務(wù)器端監(jiān)聽到客戶端的連接請(qǐng)求時(shí),需要調(diào)用accept函數(shù)接受連接。cstructsockaddr_inclient_addr;socklen_tclient_addr_len=sizeof(client_addr);intclient_fd=accept(server_fd,(structsockaddr)&client_addr,&client_addr_len);if(client_fd<0){perror("acceptfailed");exit(EXIT_FLURE);}4.1.5數(shù)據(jù)通信接受連接后,服務(wù)器端可以與客戶端進(jìn)行數(shù)據(jù)通信。ccharbuffer[BUFFER_SIZE];ssize_tread_len=read(client_fd,buffer,sizeof(buffer));if(read_len>0){//處理接收到的數(shù)據(jù)//}//發(fā)送數(shù)據(jù)ssize_twrite_len=write(client_fd,buffer,strlen(buffer));if(write_len<0){perror("writefailed");exit(EXIT_FLURE);}4.1.6關(guān)閉連接通信完成后,服務(wù)器端需要關(guān)閉與客戶端的連接。cclose(client_fd);4.2TCP客戶端實(shí)現(xiàn)在本節(jié)中,我們將介紹如何實(shí)現(xiàn)一個(gè)基于TCP協(xié)議的客戶端程序。以下是實(shí)現(xiàn)TCP客戶端的基本步驟:4.2.1創(chuàng)建套接字客戶端需要?jiǎng)?chuàng)建一個(gè)套接字(Socket)。cintclient_fd=socket(AF_INET,SOCK_STREAM,0);if(client_fd==1){perror("socketcreationfailed");exit(EXIT_FLURE);}4.2.2連接服務(wù)器cstructsockaddr_inserver_addr;memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);server_addr.sin_port=htons(PORT);if(connect(client_fd,(structsockaddr)&server_addr,sizeof(server_addr))<0){perror("connectfailed");exit(EXIT_FLURE);}4.2.3數(shù)據(jù)通信連接服務(wù)器后,客戶端可以與服務(wù)器進(jìn)行數(shù)據(jù)通信。ccharbuffer[BUFFER_SIZE];//發(fā)送數(shù)據(jù)ssize_twrite_len=write(client_fd,buffer,strlen(buffer));if(write_len<0){perror("writefailed");exit(EXIT_FLURE);}//接收數(shù)據(jù)ssize_tread_len=read(client_fd,buffer,sizeof(buffer));if(read_len>0){//處理接收到的數(shù)據(jù)//}4.2.4關(guān)閉連接通信完成后,客戶端需要關(guān)閉與服務(wù)器的連接。cclose(client_fd);4.3TCP粘包問題及解決方案在基于TCP的網(wǎng)絡(luò)編程中,粘包問題是一個(gè)常見的問題。粘包問題是指多個(gè)發(fā)送的數(shù)據(jù)包在接收方可能會(huì)粘在一起,導(dǎo)致接收方無法正確解析這些數(shù)據(jù)。4.3.1粘包問題產(chǎn)生原因(1)發(fā)送方多次發(fā)送數(shù)據(jù),接收方一次性讀取。(2)發(fā)送方發(fā)送大量數(shù)據(jù),導(dǎo)致接收方緩沖區(qū)溢出。4.3.2解決方案(1)定長(zhǎng)數(shù)據(jù)包:規(guī)定每個(gè)數(shù)據(jù)包的固定長(zhǎng)度,接收方按照這個(gè)長(zhǎng)度讀取數(shù)據(jù)。(2)分隔符:在每個(gè)數(shù)據(jù)包的末尾添加一個(gè)特殊的分隔符,接收方根據(jù)分隔符來分割數(shù)據(jù)包。(3)消息頭:在每個(gè)數(shù)據(jù)包前添加一個(gè)消息頭,其中包含數(shù)據(jù)包的長(zhǎng)度信息,接收方根據(jù)消息頭解析數(shù)據(jù)包。(4)使用更高級(jí)的網(wǎng)絡(luò)通信協(xié)議,如HTTP、FTP等,它們本身就包含了處理粘包問題的機(jī)制。第5章基于UDP的網(wǎng)絡(luò)編程5.1UDP服務(wù)器端實(shí)現(xiàn)5.1.1引言UDP服務(wù)器是基于用戶數(shù)據(jù)報(bào)協(xié)議(UserDatagramProtocol)的服務(wù)器。本章將介紹如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的UDP服務(wù)器端程序。5.1.2環(huán)境準(zhǔn)備在進(jìn)行UDP服務(wù)器端編程之前,需要保證已具備以下條件:安裝了支持套接字編程的編程環(huán)境(如Python、C/C等);了解基本的套接字編程知識(shí)。5.1.3服務(wù)器端編程步驟以下是實(shí)現(xiàn)UDP服務(wù)器端的基本步驟:(1)創(chuàng)建套接字:使用socket函數(shù)創(chuàng)建一個(gè)UDP套接字;(2)綁定地址:將套接字與服務(wù)器地址(IP地址和端口號(hào))綁定;(3)接收數(shù)據(jù):使用recvfrom函數(shù)接收客戶端發(fā)送的數(shù)據(jù);(4)處理數(shù)據(jù):根據(jù)需求對(duì)接收到的數(shù)據(jù)進(jìn)行處理;(5)發(fā)送數(shù)據(jù):使用sendto函數(shù)向客戶端發(fā)送響應(yīng)數(shù)據(jù);(6)關(guān)閉套接字:通信完成后,關(guān)閉套接字。5.1.4示例代碼以下是使用Python實(shí)現(xiàn)的一個(gè)簡(jiǎn)單UDP服務(wù)器端示例:importsocket創(chuàng)建UDP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)綁定地址server_address=('localhost',6789)server_socket.bind(server_address)print("服務(wù)器已啟動(dòng),等待接收數(shù)據(jù)")try:whileTrue:接收數(shù)據(jù)data,client_address=server_socket.recvfrom(4096)print(f"收到數(shù)據(jù):{data}來自{client_address}")處理數(shù)據(jù)(此處僅簡(jiǎn)單地將數(shù)據(jù)回顯給客戶端)sent_data=data發(fā)送數(shù)據(jù)server_socket.sendto(sent_data,client_address)finally:關(guān)閉套接字server_socket.close()5.2UDP客戶端實(shí)現(xiàn)5.2.1引言UDP客戶端是基于用戶數(shù)據(jù)報(bào)協(xié)議(UserDatagramProtocol)的客戶端。本章將介紹如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的UDP客戶端程序。5.2.2客戶端編程步驟以下是實(shí)現(xiàn)UDP客戶端的基本步驟:(1)創(chuàng)建套接字:使用socket函數(shù)創(chuàng)建一個(gè)UDP套接字;(2)發(fā)送數(shù)據(jù):使用sendto函數(shù)向服務(wù)器發(fā)送數(shù)據(jù);(3)接收數(shù)據(jù):使用recvfrom函數(shù)接收服務(wù)器的響應(yīng)數(shù)據(jù);(4)處理數(shù)據(jù):根據(jù)需求對(duì)接收到的數(shù)據(jù)進(jìn)行處理;(5)關(guān)閉套接字:通信完成后,關(guān)閉套接字。5.2.3示例代碼以下是使用Python實(shí)現(xiàn)的一個(gè)簡(jiǎn)單UDP客戶端示例:importsocket創(chuàng)建UDP套接字client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)server_address=('localhost',6789)try:發(fā)送數(shù)據(jù)message=b"你好,服務(wù)器!"client_socket.sendto(message,server_address)print(f"發(fā)送數(shù)據(jù):{message}")接收數(shù)據(jù)data,server_address=client_socket.recvfrom(4096)print(f"收到數(shù)據(jù):{data}來自{server_address}")finally:關(guān)閉套接字client_socket.close()5.3UDP數(shù)據(jù)報(bào)文處理5.3.1引言UDP數(shù)據(jù)報(bào)文處理是指在UDP通信過程中,對(duì)數(shù)據(jù)報(bào)文的接收、發(fā)送和解析等操作。5.3.2數(shù)據(jù)報(bào)文格式UDP數(shù)據(jù)報(bào)文包括以下部分:源端口:發(fā)送方端口號(hào);目標(biāo)端口:接收方端口號(hào);長(zhǎng)度:數(shù)據(jù)報(bào)文長(zhǎng)度,包括頭部和數(shù)據(jù)部分;校驗(yàn)和:用于檢測(cè)數(shù)據(jù)報(bào)文在傳輸過程中的錯(cuò)誤;數(shù)據(jù):實(shí)際傳輸?shù)臄?shù)據(jù)。5.3.3數(shù)據(jù)報(bào)文處理注意事項(xiàng)保證接收和發(fā)送的數(shù)據(jù)報(bào)文長(zhǎng)度合適,避免數(shù)據(jù)丟失;考慮網(wǎng)絡(luò)環(huán)境和傳輸距離,合理設(shè)置超時(shí)時(shí)間;對(duì)于重要數(shù)據(jù),可以通過校驗(yàn)和或其他機(jī)制檢查數(shù)據(jù)完整性;根據(jù)需求,對(duì)數(shù)據(jù)報(bào)文進(jìn)行適當(dāng)?shù)慕馕龊吞幚怼?.3.4示例代碼以下是使用Python對(duì)UDP數(shù)據(jù)報(bào)文進(jìn)行簡(jiǎn)單處理的示例:importsocketimportstruct創(chuàng)建UDP套接字socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)假設(shè)接收到的數(shù)據(jù)報(bào)文格式為:'BBBBHHLLLLLLLL'data,_=socket.recvfrom(4096)header=struct.unpack('BBBBHH',data[:10])解析頭部信息header變量包含以下信息:header[0]:字段1header[1]:字段2header[2]:字段3header[3]:字段4header[4]:源端口header[5]:目標(biāo)端口body=data[10:]獲取數(shù)據(jù)部分根據(jù)需求處理數(shù)據(jù)部分第6章網(wǎng)絡(luò)應(yīng)用層協(xié)議6.1HTTP協(xié)議HTTP(HyperTextTransferProtocol,超文本傳輸協(xié)議)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。它定義了客戶端與服務(wù)器之間交換數(shù)據(jù)的請(qǐng)求和響應(yīng)格式。HTTP協(xié)議工作于應(yīng)用層,基于TCP協(xié)議進(jìn)行傳輸。6.1.1HTTP請(qǐng)求與響應(yīng)HTTP請(qǐng)求由請(qǐng)求行、請(qǐng)求頭、空行和請(qǐng)求體組成。請(qǐng)求行包含請(qǐng)求方法、URL和HTTP版本。請(qǐng)求方法包括GET、POST、PUT、DELETE等。HTTP響應(yīng)由狀態(tài)行、響應(yīng)頭、空行和響應(yīng)體組成。狀態(tài)行包含HTTP版本、狀態(tài)碼和狀態(tài)描述。6.1.2HTTP報(bào)文格式HTTP報(bào)文采用ASCII編碼,格式清晰,易于閱讀。請(qǐng)求頭和響應(yīng)頭采用鍵值對(duì)形式,以冒號(hào)分隔。HTTP頭部字段包括通用頭部、請(qǐng)求頭部、響應(yīng)頭部和實(shí)體頭部。6.1.3HTTP連接管理HTTP連接分為持久連接和非持久連接。非持久連接在每次請(qǐng)求和響應(yīng)后關(guān)閉,而持久連接在多次請(qǐng)求和響應(yīng)后保持打開狀態(tài),以提高傳輸效率。6.2FTP協(xié)議FTP(FileTransferProtocol,文件傳輸協(xié)議)是用于在互聯(lián)網(wǎng)上控制文件雙向傳輸?shù)膮f(xié)議。它工作于應(yīng)用層,基于TCP協(xié)議進(jìn)行傳輸。6.2.1FTP工作模式FTP有兩種工作模式:主動(dòng)模式和被動(dòng)模式。主動(dòng)模式下,客戶端向服務(wù)器發(fā)起連接請(qǐng)求,服務(wù)器主動(dòng)向客戶端發(fā)起數(shù)據(jù)連接。被動(dòng)模式下,服務(wù)器等待客戶端發(fā)起數(shù)據(jù)連接。6.2.2FTP命令與響應(yīng)FTP命令分為控制命令和數(shù)據(jù)命令??刂泼钣糜诠芾鞦TP會(huì)話,如USER、PASS、QUIT等。數(shù)據(jù)命令用于傳輸文件,如RETR、STOR、LIST等。服務(wù)器對(duì)每個(gè)命令發(fā)送響應(yīng)代碼,如230表示登錄成功,150表示文件狀態(tài)良好。6.2.3FTP安全性為了提高安全性,F(xiàn)TP可以使用SSL/TLS加密傳輸數(shù)據(jù)。還可以通過設(shè)置防火墻、使用安全賬號(hào)等措施來增強(qiáng)FTP服務(wù)的安全性。6.3SMTP協(xié)議SMTP(SimpleMailTransferProtocol,簡(jiǎn)單郵件傳輸協(xié)議)是用于發(fā)送和接收郵件的協(xié)議。它工作于應(yīng)用層,基于TCP協(xié)議進(jìn)行傳輸。6.3.1SMTP工作流程SMTP工作流程包括建立連接、問候、身份驗(yàn)證、郵件發(fā)送和斷開連接等步驟??蛻舳伺c服務(wù)器建立連接后,通過HELO命令問候服務(wù)器,然后使用AUTH命令進(jìn)行身份驗(yàn)證。6.3.2SMTP命令與響應(yīng)SMTP命令包括ML、RCPT、DATA等。ML命令指定發(fā)件人地址,RCPT命令指定收件人地址,DATA命令開始郵件正文傳輸。服務(wù)器對(duì)每個(gè)命令發(fā)送響應(yīng)代碼,如250表示請(qǐng)求成功,354表示開始郵件輸入。6.3.3SMTP擴(kuò)展SMTP支持多種擴(kuò)展,如身份驗(yàn)證、加密傳輸?shù)?。通過使用擴(kuò)展,SMTP可以實(shí)現(xiàn)更高級(jí)的功能,提高郵件傳輸?shù)陌踩院涂煽啃浴3R姷腟MTP擴(kuò)展包括SMTPAUTH、STARTTLS等。第7章網(wǎng)絡(luò)安全基礎(chǔ)7.1加密與解密技術(shù)本章首先介紹網(wǎng)絡(luò)安全的核心技術(shù)——加密與解密。加密技術(shù)是通過特定的算法將明文數(shù)據(jù)轉(zhuǎn)換成密文數(shù)據(jù),以保護(hù)信息在傳輸過程中的安全性;解密技術(shù)則是將密文數(shù)據(jù)還原成明文數(shù)據(jù)。以下將重點(diǎn)討論幾種常用的加密算法及其應(yīng)用。7.1.1對(duì)稱加密算法對(duì)稱加密算法是指加密和解密使用相同密鑰的加密方式。常見的對(duì)稱加密算法有DES、3DES、AES等。由于其加密解密速度快,對(duì)稱加密算法廣泛應(yīng)用于數(shù)據(jù)傳輸過程中的加密。7.1.2非對(duì)稱加密算法非對(duì)稱加密算法是指加密和解密使用不同密鑰的加密方式,也稱為公私鑰加密。常見的非對(duì)稱加密算法有RSA、ECC等。非對(duì)稱加密算法的安全性較高,但其加解密速度相對(duì)較慢,通常用于數(shù)字簽名和安全密鑰交換。7.1.3混合加密算法混合加密算法是將對(duì)稱加密和非對(duì)稱加密相結(jié)合的一種加密方式,如SSL/TLS協(xié)議。混合加密算法既保證了加密速度,又提高了安全性。7.2數(shù)字證書與SSL為了驗(yàn)證通信雙方的身份和數(shù)據(jù)完整性,本章介紹數(shù)字證書與SSL(安全套接字層)技術(shù)。7.2.1數(shù)字證書數(shù)字證書是一種用于驗(yàn)證公鑰擁有者身份的證書,由權(quán)威的第三方證書頒發(fā)機(jī)構(gòu)(CA)簽發(fā)。數(shù)字證書包含證書持有者的公鑰、證書序列號(hào)、證書有效期等信息。7.2.2SSL協(xié)議SSL(SecureSocketsLayer)協(xié)議是一種安全通信協(xié)議,用于在客戶端和服務(wù)器之間建立加密連接。SSL協(xié)議采用混合加密技術(shù),通過數(shù)字證書驗(yàn)證通信雙方的身份,保證數(shù)據(jù)傳輸?shù)陌踩?.3防火墻與入侵檢測(cè)為了防止外部攻擊和內(nèi)部安全威脅,本章將介紹防火墻與入侵檢測(cè)技術(shù)。7.3.1防火墻防火墻是一種網(wǎng)絡(luò)安全系統(tǒng),用于監(jiān)控和控制進(jìn)出網(wǎng)絡(luò)的數(shù)據(jù)流。防火墻可以根據(jù)預(yù)定義的安全規(guī)則,允許或拒絕數(shù)據(jù)包的傳輸。7.3.2入侵檢測(cè)入侵檢測(cè)系統(tǒng)(IDS)用于監(jiān)控網(wǎng)絡(luò)或系統(tǒng)中的異常行為,分析潛在的安全威脅。入侵檢測(cè)可分為基于特征的檢測(cè)和基于行為的檢測(cè)兩種方法。通過本章的學(xué)習(xí),讀者應(yīng)了解網(wǎng)絡(luò)安全基礎(chǔ)知識(shí),掌握加密與解密技術(shù)、數(shù)字證書與SSL、防火墻與入侵檢測(cè)等網(wǎng)絡(luò)安全技術(shù)。這將有助于提高網(wǎng)絡(luò)編程的安全性,防止數(shù)據(jù)泄露和信息篡改。第8章網(wǎng)絡(luò)編程進(jìn)階8.1多線程與并發(fā)8.1.1線程的概念與創(chuàng)建線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。在網(wǎng)絡(luò)編程中,多線程可以用于同時(shí)處理多個(gè)客戶端連接,提高程序的并發(fā)能力。本節(jié)將介紹線程的基本概念以及如何在網(wǎng)絡(luò)編程中使用多線程。8.1.2線程同步與互斥鎖多線程編程中,線程同步是一個(gè)重要的問題。為了避免多個(gè)線程同時(shí)訪問共享資源導(dǎo)致的競(jìng)態(tài)條件,需要使用互斥鎖(Mutex)來保證同一時(shí)刻一個(gè)線程可以訪問共享資源。8.1.3線程池線程池是一種用于管理線程的資源池,可以有效減少創(chuàng)建和銷毀線程的開銷。在本節(jié)中,我們將介紹線程池的實(shí)現(xiàn)原理以及如何在網(wǎng)絡(luò)編程中使用線程池。8.2非阻塞IO與事件驅(qū)動(dòng)8.2.1非阻塞IO非阻塞IO是一種網(wǎng)絡(luò)編程模型,當(dāng)一個(gè)IO操作無法立即完成時(shí),它不會(huì)阻塞當(dāng)前線程,而是立即返回。本節(jié)將介紹非阻塞IO的基本概念及其在編程中的應(yīng)用。8.2.2事件驅(qū)動(dòng)編程事件驅(qū)動(dòng)編程是一種編程范式,它依賴于事件和事件處理程序來控制程序的流程。在非阻塞IO的基礎(chǔ)上,事件驅(qū)動(dòng)編程可以實(shí)現(xiàn)高效的并發(fā)處理。本節(jié)將介紹事件驅(qū)動(dòng)的原理以及如何在實(shí)際項(xiàng)目中應(yīng)用。8.3網(wǎng)絡(luò)編程功能優(yōu)化8.3.1網(wǎng)絡(luò)協(xié)議優(yōu)化網(wǎng)絡(luò)協(xié)議的選擇對(duì)程序功能有很大影響。本節(jié)將探討常用的網(wǎng)絡(luò)協(xié)議,并分析如何在特定場(chǎng)景下選擇合適的協(xié)議以優(yōu)化功能。8.3.2數(shù)據(jù)傳輸優(yōu)化數(shù)據(jù)傳輸優(yōu)化是提高網(wǎng)絡(luò)編程功能的關(guān)鍵因素。本節(jié)將從數(shù)據(jù)壓縮、數(shù)據(jù)緩存和數(shù)據(jù)傳輸策略等方面介紹如何優(yōu)化數(shù)據(jù)傳輸。8.3.3網(wǎng)絡(luò)庫與框架選擇選擇合適的網(wǎng)絡(luò)庫和框架對(duì)網(wǎng)絡(luò)編程功能有很大影響。本節(jié)將分析常用的網(wǎng)絡(luò)庫和框架,以及如何根據(jù)項(xiàng)目需求選擇合適的庫和框架。8.3.4異步IO與協(xié)程異步IO和協(xié)程是提高網(wǎng)絡(luò)編程功能的有效手段。本節(jié)將介紹異步IO的概念、原理以及如何在編程中使用協(xié)程實(shí)現(xiàn)異步操作。第9章常用網(wǎng)絡(luò)庫與框架9.1Boost.Asio庫Boost.Asio庫是一個(gè)跨平臺(tái)的C庫,用于網(wǎng)絡(luò)編程和低級(jí)別I/O操作。它提供了對(duì)TCP、UDP、串行端口等的支持,并允許開發(fā)者實(shí)現(xiàn)高效率的網(wǎng)絡(luò)應(yīng)用。9.1.1簡(jiǎn)介Boost.Asio庫通過模板和對(duì)象的方式來處理網(wǎng)絡(luò)編程中的異步I/O操作,提高了代碼的可讀性和可維護(hù)性。9.1.2主要功能異步TCP/UDP通信同步TCP/UDP通信串行端口通信定時(shí)器I/O多路復(fù)用9.1.3使用示例以下是一個(gè)使用Boost.Asio實(shí)現(xiàn)異步TCP服務(wù)器的基本示例:cppinclude<boost/asio.hpp>usingboost::asio::ip::tcp;intmain(){try{boost::asio::io_serviceio_service;tcp::acceptoracceptor(io_service,tcp::endpoint(tcp::v4(),));while(true){tcp::socketsocket(io_service);acceptor.accept(socket);//處理連接}}catch(std::exception&e){std::cerr<<e.what()<<std::endl;}return0;}9.2MFC網(wǎng)絡(luò)編程MFC(MicrosoftFoundationClasses)是微軟提供的一套C類庫,用于Windows應(yīng)用程序開發(fā)。它提供了網(wǎng)絡(luò)編程相關(guān)的功能,便于開發(fā)者實(shí)現(xiàn)基于C/S架構(gòu)的應(yīng)用程序。9.2.1簡(jiǎn)介MFC網(wǎng)絡(luò)編程主要涉及到CAsyncSocket類和CSocket類,這兩個(gè)類分別為非阻塞和阻塞方式提供了網(wǎng)絡(luò)通信的支持。9.2.2主要功能支持TCP和UDP協(xié)議阻塞和非阻塞模式異步通知機(jī)制9.2.3使用示例以下是一個(gè)使用MFC實(shí)現(xiàn)TCP客戶端的基本示例:cpp//TcpClient.cpp:implementationfile//include"stdafx.h"include"TcpClient.h"IMPLEMENT_DYNCREATE(CTcpClient,CAsyncSocket)CTcpClient::CTcpClient(){}CTcpClient::~CTcpClient(){}voidCTcpClient::OnConnect(intnErrorCode){if(nErrorCode==0){//連接成功,發(fā)送數(shù)據(jù)}else{//連接失敗}}voidCTcpClient::O
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版商用建筑水暖施工協(xié)議模板版B版
- 醫(yī)療器械供應(yīng)鏈協(xié)同管理考核試卷
- 創(chuàng)業(yè)項(xiàng)目投資談判策略與合同簽訂考核試卷
- 2025至2030年中國(guó)圓形吊帶數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年中國(guó)動(dòng)圈手持話筒市場(chǎng)調(diào)查研究報(bào)告
- 用英語表達(dá)課程設(shè)計(jì)
- 轉(zhuǎn)動(dòng)坐標(biāo)系課程設(shè)計(jì)
- 2025年度新型門衛(wèi)人力資源服務(wù)合同
- 疫情下的地理課程設(shè)計(jì)
- 雷公馬主題課程設(shè)計(jì)
- 《道路交通安全法》課件完整版
- 向女朋友認(rèn)錯(cuò)保證書范文
- 五分?jǐn)?shù)加法和減法(課件)-數(shù)學(xué)五年級(jí)下冊(cè)
- 2024年四川省綿陽市中考語文試卷(附真題答案)
- 設(shè)計(jì)材料與工藝課程 課件 第1章 產(chǎn)品設(shè)計(jì)材料與工藝概述
- 幼兒園反恐防暴技能培訓(xùn)內(nèi)容
- 食品企業(yè)質(zhì)檢員聘用合同
- 中醫(yī)診所內(nèi)外部審計(jì)制度
- 自然辯證法學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024年國(guó)家危險(xiǎn)化學(xué)品經(jīng)營(yíng)單位安全生產(chǎn)考試題庫(含答案)
- 護(hù)理員技能培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論