




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、目 錄摘要IIIAbstractIV第 1 章 緒論1研究背景1網(wǎng)絡(luò)掃描器概述.21.2.3安全的定義1的分級(jí)2掃描器3安全1.3 本文研究?jī)?nèi)容5第 2 章 NetBIOS 及 UDP 協(xié)議介紹6網(wǎng)段掃描器實(shí)現(xiàn)原理6UDP 與TCP 簡(jiǎn)介6UDP 與TCP 的選擇6TCP 與 UDP 的區(qū)別7TCP 與 UDP 的效率比較8第 3 章 Winsock 開(kāi)發(fā)原理9套接字(Socket)的概念9套接字的分類(lèi)10Winsoek 網(wǎng)絡(luò)編程原理11第 4 章 UDP 網(wǎng)段掃描器的設(shè)計(jì)14CSOCKET 的類(lèi)中 UDP 協(xié)議相關(guān)函數(shù)簡(jiǎn)介14事件函數(shù)為線(xiàn)程創(chuàng)建函數(shù)15網(wǎng)段掃描器設(shè)計(jì)16啟動(dòng)
2、掃描17掃描線(xiàn)程18獲得掃描結(jié)果20第 5 章 總結(jié)與展望22參考文獻(xiàn)23致 謝24UDP 網(wǎng)段掃描器設(shè)計(jì)摘要隨著計(jì)算機(jī)技術(shù)的發(fā)展和網(wǎng)絡(luò)的不斷普及, 網(wǎng)絡(luò)應(yīng)用程序的開(kāi)發(fā)越來(lái)越普遍, 因此進(jìn)行網(wǎng)絡(luò)應(yīng)用程序的開(kāi)發(fā)就顯得尤為重要。本文首先在數(shù)據(jù)傳輸網(wǎng)絡(luò)中,與 TCP、SCTP等其它傳輸協(xié)議相比,UDP 協(xié)議在速度上有著一定的優(yōu)勢(shì),但也存在著可靠性差的問(wèn)題。結(jié)合 TCP、SCTP 和 UDP 各自的優(yōu)勢(shì),IETF 提出了可靠 UDP(Reliable UDP, RUDP)草案,并在此基礎(chǔ)上,提出了可靠 UDP 的實(shí)現(xiàn)方案。其次對(duì) Windows 下 UDP編程接口 Windows Socket 的相關(guān)
3、知識(shí)進(jìn)行了概述, 介紹了套接字的分類(lèi)及面向連接的套接字編程原理, 分析了在 Windows 環(huán)境應(yīng)用 Socket 實(shí)現(xiàn)網(wǎng)絡(luò)通信的機(jī)制, 并闡述了如何基于 Windows Socket 創(chuàng)建面向連接的客戶(hù)機(jī)/服務(wù)器(C/S) 網(wǎng)絡(luò)應(yīng)用程序。最后創(chuàng)建基于 Windows Socket 的網(wǎng)絡(luò)應(yīng)用程序時(shí), 需要對(duì)服務(wù)器方和客戶(hù)方都應(yīng)該編寫(xiě)應(yīng)用程序。結(jié)合 Visual C+ 程序開(kāi)發(fā)環(huán)境,利用 WinSock 的網(wǎng)絡(luò)開(kāi)發(fā)技術(shù),采用 UDP協(xié)議,實(shí)現(xiàn)網(wǎng)段掃描器的設(shè)計(jì)。關(guān)鍵字:UDP;Socket;網(wǎng)段;掃描器The Design of UDP Network Segment ScannerAbstra
4、ctWith the development of computer technology and network, the increasing popularity ofernet applications development ising more common, so for the development ofnetwork applications are particularly important. This prly in data transmisnetwork, and other SCTP TCP, UDP protocol transmisprotocols in
5、speed compared tohave certain advantages, but there is also poor reliability problems. TCP, UDP SCTP and withtheir respective advantages and IETF proes Reliable UDP (RUDP) draft is UDP, and basedon this, advanthe Reliable UDP scheme. Next to the Windows down UDP programmingerface Windows Socket revi
6、ewed the relevant knowledge,roduthe classification ofr used in WindowsSocket and connection-oriented Socket programming principle, the penvironment Socket realize network communication mechanism, and expounds how to Windows based Socket create connection-oriented c nt/server (C/S) network applicatio
7、ns. Finally create Windows based Socket web applications, need on the server side and the c nt should write applications. Combined with Visual c + + program development environment, use WinSock network development technology, using the UDP protocol, realize the design ofnetwork segment scanner.Keywo
8、rd: UDP, Socket, nets section, scanner第一章緒論1.1研究背景隨著信息與通信技術(shù)迅速在多個(gè)領(lǐng)域取得突破性進(jìn)展, ernet 將人們更緊密聯(lián)系在一起,“地球村”的夢(mèng)想已然成為了現(xiàn)實(shí)。互聯(lián)網(wǎng)已經(jīng)深入到人類(lèi)社會(huì)的各個(gè)領(lǐng)域,成為人們?nèi)粘I钏豢扇鄙俚囊徊糠帧K诟淖冎藗兊纳a(chǎn)方式、工作方式、生活方式和學(xué)習(xí)方式,推動(dòng)了各行各業(yè)的發(fā)展。互聯(lián)網(wǎng)如此迅速發(fā)展并廣泛使用,主要得益于其所特有的豐富信息資源。人們只要進(jìn)入網(wǎng)路世界便可以從浩如煙海的信息中查詢(xún)到自己需要的部分,可以和遠(yuǎn)隔重洋的親朋好友互通音訊,可以坐在家中接受全球各地醫(yī)學(xué)的會(huì)診,可以實(shí)現(xiàn)網(wǎng)上購(gòu)物、網(wǎng)上?;ヂ?lián)網(wǎng)
9、的迅速發(fā)展,給人們的日常生活帶來(lái)了全新的感受,同時(shí)人類(lèi)社會(huì)對(duì)信息網(wǎng)絡(luò)的依賴(lài)程度已經(jīng)越來(lái)越強(qiáng),一個(gè)真正的互聯(lián)網(wǎng)時(shí)代已經(jīng)到來(lái)。然而,隨著互聯(lián)網(wǎng)的廣泛普及越來(lái)越多不同背景和不同的參與者介入到互聯(lián)網(wǎng)環(huán)境中,之徒試圖不斷利用各種伺機(jī)侵入他人網(wǎng)絡(luò)系統(tǒng)。事實(shí)證明,隨著電子商務(wù)和電子業(yè)務(wù)廣泛使用,由于利益的驅(qū)使網(wǎng)絡(luò)活動(dòng)日趨猖獗,互聯(lián)網(wǎng)正著其出現(xiàn)以來(lái)最大的,已成為ernet 上的焦點(diǎn),它關(guān)系著ernet 的進(jìn)一步發(fā)展和普及,甚至關(guān)系著ernet 的生存。問(wèn)題已經(jīng)成為互聯(lián)網(wǎng)發(fā)展道所亟待解決。1.2網(wǎng)絡(luò)掃描器概述1.2.1安全的定義是在硬件、協(xié)議的具體實(shí)現(xiàn)或系統(tǒng)安全策略上存在的缺陷,從而可以使者能夠在未的情況下進(jìn)行
10、或破壞系統(tǒng)。具體舉例來(lái)說(shuō),比如在el協(xié)議Pentium中存在的邏輯錯(cuò)誤,在 Send早期版本中的編程錯(cuò)誤,在 NFS中認(rèn)證方式上的弱點(diǎn),在 Unix 系統(tǒng)管理員設(shè)置Ftp 服務(wù)時(shí)配置不當(dāng)都可能被者使用,到系統(tǒng)的安全。因而這些都可以認(rèn)為是系統(tǒng)中存在的安全。就是指一切導(dǎo)致或破壞計(jì)算機(jī)系統(tǒng)安全(可靠性、可用性、從廣義上講性、可控性、不可抵賴(lài)性)的事物。包括,硬件,程序,數(shù)據(jù)。計(jì)算機(jī)系統(tǒng)中存在的會(huì)隨著用戶(hù)的深入使用被不斷出來(lái)。隨著時(shí)間的推移,舊的會(huì)不斷消失,新的會(huì)不斷出現(xiàn),安全也會(huì)長(zhǎng)期存在。因此,對(duì)安全問(wèn)題的研究必須要進(jìn)行動(dòng)態(tài)實(shí)時(shí),對(duì)于發(fā)現(xiàn)的必須及時(shí)處理。1.2.2安全的分級(jí)系統(tǒng)安全的存在可以是某些者
11、得到可趁之機(jī),他們可以利用這些侵入他人計(jì)算機(jī)系統(tǒng)以達(dá)到其不可告人的目的。例如:他們可以利用某些在未情況下他人系統(tǒng),并獲取他人計(jì)算機(jī)上的資料。在對(duì)者行為分析的基程度可粗略的將其分為三級(jí):者并可能會(huì)破壞整個(gè)目標(biāo)系統(tǒng)的礎(chǔ)上,按對(duì)目標(biāo)主機(jī)的A 級(jí)用戶(hù):允許,如允許未的。A 級(jí)是最大的一種,大多數(shù) A級(jí)是由于較差的系統(tǒng)管理或配置有誤造成的。幾乎可以在任意類(lèi)型的中找到這樣的漏洞。如,F(xiàn)TP、ned等一些網(wǎng)絡(luò)程序常存在一些嚴(yán)重的 A 級(jí)。B 級(jí):是允許本地用戶(hù)提高權(quán)限,并可能允許其獲得系統(tǒng)控制的。大多數(shù)的 B 級(jí)是由應(yīng)用程序中的一些缺陷或代碼錯(cuò)誤引起的。例如,在程序調(diào)試過(guò)為了調(diào)試方便會(huì)設(shè)置一些特殊的,在某些
12、情況下可以使測(cè)試不需要密碼就能。如果當(dāng)程序調(diào)試成功后,忘記了將這些刪除,就會(huì)造成允許用戶(hù)提高權(quán)限的。造成的緩沖區(qū)溢出問(wèn)題也是一類(lèi)典型的 B此外,因編程缺陷或程序設(shè)計(jì)語(yǔ)言級(jí)安全。編程時(shí),程序員會(huì)設(shè)置一些緩沖區(qū),但是如果程序員沒(méi)有對(duì)這些緩沖區(qū)做適當(dāng)?shù)臋z查,判斷它們是否足夠大,結(jié)果就可能造成緩沖區(qū)溢出。當(dāng)緩沖區(qū)溢出時(shí),過(guò)剩的信息會(huì)覆蓋的是計(jì)算機(jī)內(nèi)存中的內(nèi)容。那些能夠被程序調(diào)用的子程序的列表信息以及傳遞給子程序的信息、參數(shù)都有可能丟失。這意味著程序不能得到足夠的信息從子程序返回。者會(huì)利用精心編寫(xiě)的代碼使緩沖區(qū)溢出,然后告訴程序依據(jù)他們預(yù)設(shè)的方法處理緩沖區(qū)并且執(zhí)行,從而使整個(gè)運(yùn)行程序處于他們的控制之中。
13、C 級(jí)最典型的一種:是任何允許用戶(hù)中斷、降低或阻礙系統(tǒng)操作的,例如服務(wù)。服務(wù)是 SYNFLOOD,即者將大量的連接請(qǐng)求發(fā)往目標(biāo)服務(wù)器,目標(biāo)主機(jī)不得不處理這些“半開(kāi)”的 SYN 請(qǐng)求,然而并不能得到 ACK 回答,很快服務(wù)器就會(huì)因?yàn)閮?nèi)存資源枯竭而掛起,任何用戶(hù)都不能再?gòu)姆?wù)器上獲得服務(wù)。綜上所述,對(duì)目標(biāo)主機(jī)危害最嚴(yán)重的是 A 級(jí)洞是對(duì)系統(tǒng)正常工作進(jìn)行干擾。,其次是 B 級(jí),而 C 級(jí)漏1.2.3掃描器從掃描過(guò)程來(lái)看,掃描工具大體上可分為網(wǎng)絡(luò)掃射,端口掃描,弱點(diǎn)掃描幾種類(lèi)型。網(wǎng)絡(luò)(Packet掃射ernet Grope),因特網(wǎng)包探索器,用于測(cè)試網(wǎng)絡(luò)連接量的程序。最常用的,就是利用 ICMP 協(xié)議
14、,也是最簡(jiǎn)單的探測(cè),用來(lái)判斷目標(biāo)是否活動(dòng)。實(shí)際上是向目標(biāo)發(fā)送一個(gè)要求回顯(Type = 8)的 ICMP 數(shù)據(jù)報(bào),當(dāng)主機(jī)得到請(qǐng)求后,再返回一個(gè)回顯(Type =核中的,而不是一個(gè)用戶(hù)進(jìn)程。0)數(shù)據(jù)報(bào)。而且是最基本的探測(cè)程序一般是直接實(shí)現(xiàn)在系統(tǒng)內(nèi),Sp(掃射)就是對(duì)一個(gè)網(wǎng)段進(jìn)行大范圍的,由此確定這個(gè)網(wǎng)段的網(wǎng)絡(luò)情況,比如著名的掃射的7。f工具就是進(jìn)行是 Windows 系列自帶的一個(gè)可執(zhí)行命令。利用它可以檢查網(wǎng)絡(luò)是否能夠連IP 地址。該命令通,用好它可以很好地幫助分析判定網(wǎng)絡(luò)故障。應(yīng)用格式:還可以加許多參數(shù)使用,具體是鍵入按回車(chē)即可看到詳細(xì)說(shuō)明。指的是端對(duì)端連通,通常用來(lái)作為可用性的檢查。端口掃描
15、真正的掃描器是TCP 端口掃描器,這種程序可以選通 TCP/IP 端口和服務(wù)(比如,目標(biāo)的回答。通過(guò)這種方法,可以搜集到關(guān)于目標(biāo)主機(jī)的有用net 或 FTP),并信息(比如,一個(gè)用戶(hù)是否可以登錄等等)。而其他所謂的掃描器僅僅是 UNIX 網(wǎng)絡(luò)應(yīng)用程序,這些程序一般用于觀察某一服務(wù)是否正在一臺(tái)機(jī)器上正常工作,它們不是真正的掃描器,但也可以用于收集目標(biāo)主機(jī)的信息(UNIXhost 命令就是這類(lèi)程序的很好的例子)。上通用的 rusers 和一個(gè)端口就是一個(gè)潛在的通信通道,也就是一個(gè)通道。對(duì)目標(biāo)計(jì)算機(jī)進(jìn)行端口掃描,能得到許多有用的信息,從而發(fā)現(xiàn)系統(tǒng)的安全。它使系統(tǒng)用戶(hù)了解系統(tǒng)目前向外界提供了哪些服務(wù),
16、從而為系統(tǒng)用戶(hù)管理網(wǎng)絡(luò)提供了一種。端口掃描技術(shù)原理端口掃描向目標(biāo)主機(jī)的 TCP/IP 服務(wù)端口發(fā)送探測(cè)數(shù)據(jù)包,并目標(biāo)主機(jī)的響應(yīng)。通過(guò)分析響應(yīng)來(lái)判斷服務(wù)端口是打開(kāi)還是關(guān)閉,就可以得知端口提供的服務(wù)或信息。端口掃描也可以通過(guò)捕獲本機(jī)或服務(wù)器的流入流出 IP 數(shù)據(jù)包來(lái)監(jiān)視本機(jī)的運(yùn)行情況,它僅能對(duì)接收到的數(shù)據(jù)進(jìn)行分析,幫助發(fā)現(xiàn)目標(biāo)主機(jī)的某些內(nèi)在的弱點(diǎn)。半連接(SYN)掃描SYN Flood 是當(dāng)前最流行的 DoS()與 DDoS(分布式服務(wù))的服務(wù)方式之一,它是利用 TCP 協(xié)議缺陷,發(fā)送大量的 TCP 連接請(qǐng)求,從而使得被攻擊方資源耗盡(CPU 滿(mǎn)負(fù)荷或內(nèi)存)的方式,最終導(dǎo)致系統(tǒng)或服務(wù)器宕機(jī)8。在S
17、YN Flood 原理前,需要從 TCP 連接建立的過(guò)程開(kāi)始說(shuō)起:TCP 與 UDP 不同,它是基于連接的,為了在服務(wù)端和客戶(hù)端之間傳送 TCP 數(shù)據(jù),必須先建立一個(gè)虛擬電路,也就是 TCP 連接。也就是經(jīng)常聽(tīng)說(shuō)的 TCP 協(xié)議中的三次握手(Three-wayHandshake),建立 TCP 連接的標(biāo)準(zhǔn)過(guò)程如下:首先,客戶(hù)端發(fā)送一個(gè)包含 SYN 標(biāo)志的 TCP 報(bào)文,SYN 即同步(Synchronize),同步報(bào)文會(huì)指明客戶(hù)端使用的端口以及 TCP 連接的初始序號(hào);其次,服務(wù)器在收到客戶(hù)端的 SYN 報(bào)文后,將返回一個(gè) SYN+ACK(即確認(rèn) Acknowledgement)的報(bào)文,表示客
18、戶(hù)端的請(qǐng)求被接受,同時(shí) TCP 初始序號(hào)自動(dòng)加一。最后,客戶(hù)端也返回一個(gè)確認(rèn)報(bào)文 ACK 給服務(wù)器端,同樣 TCP 序列號(hào)被加一,到此一個(gè) TCP 連接完成。SYN Flood正是利用了 TCP 連接的三次握手,假設(shè)一個(gè)用戶(hù)向服務(wù)器發(fā)送了SYN 報(bào)文后突然死機(jī)或掉線(xiàn),那么服務(wù)器在發(fā)出 SYN+ACK 應(yīng)答報(bào)文后是無(wú)法收到客戶(hù)端的 ACK 報(bào)文的(第三次握手無(wú)法完成),這種情況下服務(wù)器端一般會(huì)重試(再次發(fā)送 SYN+ACK 給客戶(hù)端)并等待一段時(shí)間后丟棄這個(gè)未完成的連接,這段時(shí)間的長(zhǎng)度稱(chēng)為 SYN Timeout,一般來(lái)說(shuō)這個(gè)時(shí)間是分鐘的數(shù)量級(jí)(大約為 30 秒-2 分鐘);一個(gè)用戶(hù)出現(xiàn)異常導(dǎo)致
19、服務(wù)器的一個(gè)線(xiàn)程等待 1 分鐘并不會(huì)對(duì)服務(wù)器端造成什么大的影響,但如果有大量的等待丟失的情況發(fā)生,服務(wù)器端將為了一個(gè)非常大的半連接請(qǐng)求而可以想象大量的保存并遍歷也會(huì)消耗非常多的 CPU 時(shí)間和內(nèi)消耗非常多的資源。存,再加上服務(wù)器端不斷對(duì)列表中的 IP 進(jìn)行 SYN+ACK 的重試,服務(wù)器的負(fù)載將會(huì)變得非常巨大。如果服務(wù)器的 TCP/IP 棧不夠強(qiáng)大,最后的結(jié)果往往是堆棧溢出。相對(duì)于數(shù)據(jù)流,正常的用戶(hù)請(qǐng)求就顯得十分渺小,服務(wù)器疲于處理者的TCP 連接請(qǐng)求而無(wú)暇理睬客戶(hù)的正常請(qǐng)求,此時(shí)從正??蛻?hù)會(huì)表現(xiàn)為打開(kāi)頁(yè)面緩慢或服務(wù)器無(wú)響應(yīng),這種情況就是常說(shuō)的服務(wù)器端 SYN Flood(SYN 洪水)。這種
20、技術(shù)通常認(rèn)為是“半開(kāi)放”掃描,這是因?yàn)閽呙璩绦虿槐匾蜷_(kāi)一個(gè)完全的 TCP 連接。掃描程序發(fā)送的是一個(gè) SYN 數(shù)據(jù)包,好像準(zhǔn)備打開(kāi)一個(gè)實(shí)際的連接并等待反應(yīng)一樣。一個(gè) SYN|ACK 的返回信息表示端口處于偵聽(tīng)狀態(tài)。一個(gè) RST 返回,表示端口沒(méi)有處于偵聽(tīng)?wèi)B(tài)。如果收到一個(gè) SYN|ACK,則掃描程序必須再發(fā)送一個(gè) RST 信號(hào),來(lái)關(guān)閉這個(gè)連接過(guò)程。這種掃描技術(shù)的優(yōu)點(diǎn)在于一般不會(huì)在目標(biāo)計(jì)算機(jī)上留下 。但這種方法的一個(gè)缺點(diǎn)是,必須要有 root 權(quán)限才能建立自己的 SYN 數(shù)據(jù)包。1.3本文研究?jī)?nèi)容本文首先在數(shù)據(jù)傳輸網(wǎng)絡(luò)中,與 TCP、SCTP 等其它傳輸協(xié)議相比,UDP 協(xié)議在速度上有著一定的優(yōu)
21、勢(shì),但也存在著可靠性差。結(jié)合 TCP、SCTP 和 UDP 各自的優(yōu)勢(shì),IETF 提出了可靠 UDP(Reliable UDP,RUDP)草案,并在此基礎(chǔ)上,提出了可靠 UDP 的實(shí)現(xiàn)方案1。其次對(duì) Windows 下 UDP 編程接口 Windows Socket 的相關(guān)知識(shí)進(jìn)行了概述, 介紹了套接字的分類(lèi)及面向連接的套接字編程原理, 分析了在Windows 環(huán)境應(yīng)用 Socket 實(shí)現(xiàn)網(wǎng)絡(luò)通信的機(jī)制, 并闡述了如何基于 Windows Socket創(chuàng)建面向連接的客戶(hù)機(jī)/服務(wù)器(C/S) 網(wǎng)絡(luò)應(yīng)用程序。最后創(chuàng)建基于 Windows Socket 的網(wǎng)絡(luò)應(yīng)用程序時(shí), 需要對(duì)服務(wù)器方和客戶(hù)方都應(yīng)
22、該編寫(xiě)應(yīng)用程序。結(jié)合 Visual C+ 程序開(kāi)發(fā)環(huán)境,利用 WinSock 的網(wǎng)絡(luò)開(kāi)發(fā)技術(shù),采用 UDP 協(xié)議,實(shí)現(xiàn)網(wǎng)段掃描器的設(shè)計(jì)。第二章 NetBIOS 及UDP 協(xié)議介紹2.1網(wǎng)段掃描器實(shí)現(xiàn)原理2.1.1UDP 與TCP 簡(jiǎn)介T(mén)CP 和 UDP 是 TCP/IP 協(xié)議中的兩個(gè)傳輸層協(xié)議,它們使用 IP 路由功能把數(shù)據(jù)包發(fā)送到目的地,從而為應(yīng)用程序及應(yīng)用層協(xié)議(包括 HTTP、SMTP、SNMP、FTP 和net)提供網(wǎng)絡(luò)服務(wù)。TCP 提供的是面向連接的、可靠的數(shù)據(jù)流傳輸,而 UDP 提供的是非面向連接的、不可靠的數(shù)據(jù)流傳輸。面向連接的協(xié)議在任何數(shù)據(jù)傳輸前就建立好了點(diǎn)到點(diǎn)的連接。ATM
23、和幀中繼是面向連接的協(xié)議,但它們工作在數(shù)據(jù)鏈路層,而不是在傳輸層。普通的音頻也是面向連接的3??煽康膫鬏攨f(xié)議可避免數(shù)據(jù)傳輸錯(cuò)誤,其實(shí)現(xiàn)方式是:在構(gòu)造數(shù)據(jù)包時(shí)在其中設(shè)置,到達(dá)目的地后再采用一定的算法重新計(jì)算,通過(guò)比較二者,就可以找出被破壞了的數(shù)據(jù)。因?yàn)樾枰匕l(fā)被破壞了的和已經(jīng)丟失的數(shù)據(jù),所以在需要重發(fā)數(shù)據(jù)時(shí)協(xié)議必須能夠使目的地給出的一個(gè)確認(rèn)信號(hào)。有些數(shù)據(jù)包不一定按照順序到達(dá),所以協(xié)議必須能夠探測(cè)出亂序的包,暫存起來(lái),然后把它們按正確的次序送到應(yīng)用層中去。另外,協(xié)議還必須能夠找出并丟棄重復(fù)發(fā)送的數(shù)據(jù)。一組定時(shí)器可以限制針對(duì)不同確認(rèn)的等待時(shí)間,這樣就可以開(kāi)始重新發(fā)送或重新建立連接。數(shù)據(jù)流傳輸協(xié)議不支
24、持位傳輸。TCP 不構(gòu)造數(shù)據(jù),它只負(fù)責(zé)傳輸構(gòu)造的 8 位字符串。非面能在一個(gè)包內(nèi)以字節(jié)或位為向連接的傳輸協(xié)議在數(shù)據(jù)傳輸之前不建立連接,而是在每個(gè)中間節(jié)點(diǎn)對(duì)非面向連接的包和數(shù)據(jù)包進(jìn)行路由。沒(méi)有點(diǎn)到點(diǎn)的連接,非面向連接的協(xié)議,如 UDP,是不可靠的連接。當(dāng)個(gè) UDP 數(shù)據(jù)包在網(wǎng)絡(luò)中移動(dòng)時(shí),發(fā)送過(guò)程并不知道它是否到達(dá)了目的地,除非應(yīng)用層已經(jīng)確認(rèn)了它已到達(dá)的事實(shí)。非面向連接的協(xié)議也不能探測(cè)重復(fù)的和亂序的包。標(biāo)準(zhǔn)的專(zhuān)業(yè)術(shù)語(yǔ)用“不可靠”來(lái)描述 UDP。在現(xiàn)代網(wǎng)絡(luò)中,UDP 并不易于導(dǎo)致傳輸失敗,但是也肯定地說(shuō)它是可靠的。2.1.2UDP 與TCP 的選擇如果比較 UDP 包和 TCP 包的結(jié)構(gòu),很明顯 U
25、DP 包不具備 TCP 包復(fù)雜的可靠性與控制機(jī)制。與 TCP 協(xié)議相同,UDP 的源端口數(shù)和目的端口數(shù)也都支持一臺(tái)主機(jī)上的多個(gè)應(yīng)用。一個(gè) 16 位的UDP含了一個(gè)字節(jié)長(zhǎng)的頭部和數(shù)據(jù)的長(zhǎng)度,域使其可以進(jìn)行整體校驗(yàn)。(許多應(yīng)用只支持 UDP,如多數(shù)據(jù)流,不產(chǎn)生任何額外的數(shù)據(jù),即使知道有破壞的包也不進(jìn)行重發(fā)。,很明顯,當(dāng)數(shù)據(jù)傳輸?shù)男阅鼙仨氉屛挥跀?shù)據(jù)傳輸?shù)耐暾浴⒖煽刂菩院涂煽啃詴r(shí),TCP 協(xié)議是當(dāng)然的選擇。當(dāng)強(qiáng)調(diào)傳輸性能而不是傳輸?shù)耐暾詴r(shí),如音頻和多應(yīng)用,UDP 是最好的選擇。在數(shù)據(jù)傳輸時(shí)間很短,以至于此前的連接過(guò)程成為整個(gè)流量主體的情況下,UDP 也是個(gè)好的選擇,如 DNS 交換。把SNMP 建
26、立在 UDP 上的部分原因是設(shè)計(jì)者認(rèn)為當(dāng)發(fā)生網(wǎng)絡(luò)阻塞時(shí),UDP 較低的開(kāi)銷(xiāo)使其有更好的機(jī)會(huì)去傳送管理數(shù)據(jù)4。TCP 豐富的功能有時(shí)會(huì)導(dǎo)致不可預(yù)料的性能低下,但是相信在不遠(yuǎn)的將來(lái),TCP 可靠的點(diǎn)對(duì)點(diǎn)連接將會(huì)應(yīng)用于絕大多數(shù)的網(wǎng)絡(luò)中。本程序希望快速得到同網(wǎng)段機(jī)器的信息,并不需要特別可靠的連接確認(rèn)機(jī)制,故用 UDP來(lái)實(shí)現(xiàn)。對(duì) TCP、UDP 和 SCTP 傳輸協(xié)議的描述可見(jiàn),TCP 和 SCTP 都是面向連接的基的傳輸協(xié)議,為了保證可靠性,都采用了復(fù)雜的控制機(jī)制。雖然 SCTP 已經(jīng)比 TCP節(jié)約了很多資源,但是相對(duì)來(lái)說(shuō)還是顯得復(fù)雜,也不適合基于消息的傳遞。而 UDP 協(xié)議對(duì)于可靠性又沒(méi)有采取任何措
27、施,由此,IETF 提出了可靠 UDP(Reliable UDP,RUDP)草案。表 2-1 RUDP 報(bào)文頭ChecksumRUDP,即以 UDP 為基礎(chǔ)傳輸數(shù)據(jù),并在應(yīng)用層上采取一定得措施,使得可靠性得到保證。2.2TCP 與 UDP 的區(qū)別TCP 為典型的傳輸大量數(shù)據(jù)或需要接收數(shù)據(jù)的應(yīng)用程序提供連接定向和可靠的通信。UDP 提供無(wú)連接的通信,并不保證數(shù)據(jù)包被發(fā)送到。典型的即時(shí)傳輸少量數(shù)據(jù)的應(yīng)用程序使用 UDP。應(yīng)該說(shuō)可靠的發(fā)送是應(yīng)用程序的責(zé)任。TCP 對(duì)系統(tǒng)資源的要求較多,UDP 較少且程序結(jié)構(gòu)比較簡(jiǎn)單。TCP 能為應(yīng)用程序提供可靠的通信連接,使一臺(tái)計(jì)算機(jī)發(fā)出的字節(jié)流無(wú)差錯(cuò)地發(fā)往網(wǎng)絡(luò)上的
28、其他計(jì)算機(jī),對(duì)可靠性要求高的數(shù)據(jù)通信系統(tǒng)往往使用 TCP 協(xié)議傳輸數(shù)據(jù)14。UDP 適用于一次只傳送少量數(shù)據(jù)對(duì)可靠性要求不高的應(yīng)用環(huán)境,比如經(jīng)常使用命令來(lái)測(cè)試兩臺(tái)主SYNACKEAKRSTNULCHKTCS0Header LengthSequence NumberAck Number機(jī)之間TCP/護(hù)通信是否正常,其實(shí)命令的原理就是方主機(jī)發(fā)送 UDP 數(shù)據(jù)包,然后對(duì)方主機(jī)確認(rèn)收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來(lái),那么網(wǎng)絡(luò)就是通的。這充分說(shuō)明了 UDP 協(xié)議是面向非連接的協(xié)議,沒(méi)有建立連接的過(guò)程。正因?yàn)?UDP 協(xié)議沒(méi)有連接的過(guò)程,所以它的通信效果高,但也正因?yàn)槿绱?,它的可靠性不?T
29、CP 協(xié)議高。然而本程序希望快速實(shí)現(xiàn)通信的功能,并不需要特別可靠的連接確認(rèn)機(jī)制,所以選擇用 UDP 協(xié)議實(shí)現(xiàn)。2.3TCP 與 UDP 的效率比較TCP 雖然提供了差錯(cuò)控制和流量控制,但卻在效率上存在諸多缺陷:數(shù)據(jù)分片和連接管理,使得系統(tǒng)開(kāi)銷(xiāo)增大,通信帶寬有效利用率要低于無(wú)連接的通信方式;基機(jī)制,對(duì)通信數(shù)據(jù)的最終解釋和組裝要靠用戶(hù)來(lái)完成,這將帶來(lái)額外的系統(tǒng)開(kāi)銷(xiāo);到達(dá)確認(rèn)和超時(shí)重傳,在帶來(lái)可靠性的同時(shí)卻要耗費(fèi)相當(dāng)?shù)臅r(shí)間。UDP 協(xié)議不提供可靠性保證,也不提供流量控制,但卻在效率上有如下優(yōu)勢(shì):不存在數(shù)據(jù)分片和連接管理,系統(tǒng)開(kāi)銷(xiāo)較小,通信帶寬利用率要高于基于連接的通信方式;用戶(hù)無(wú)需再對(duì)接收到的數(shù)據(jù)進(jìn)
30、行組裝和解釋?zhuān)簿蜔o(wú)額外的系統(tǒng)開(kāi)銷(xiāo);不需確認(rèn)機(jī)制和超時(shí)重傳機(jī)制,了傳輸時(shí)間。第三章 Winsock 開(kāi)發(fā)原理隨著ernet 的迅速發(fā)展, 網(wǎng)絡(luò)應(yīng)用的開(kāi)發(fā)需求與日俱增。 急需各式各樣的網(wǎng)絡(luò)應(yīng)用, 也催生著各種網(wǎng)絡(luò)編程技術(shù), 用套接字(Socket)來(lái)實(shí)現(xiàn)互聯(lián)網(wǎng)上的進(jìn)程通訊, 進(jìn)而實(shí)現(xiàn)各種網(wǎng)絡(luò)應(yīng)用功能, 是開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序的重要方法11。最初的套接字編程接口是 UNIX 操作系統(tǒng)下的 Berkeley Socket,編程較繁。為了方便網(wǎng)絡(luò)編程, 20 世紀(jì) 90 年代初,由聯(lián)合了其他幾家公司共同制定了一套 WINDOWS 下的網(wǎng)絡(luò)編程接口,即 Windows Socket 規(guī)范, 它不是一種網(wǎng)絡(luò)協(xié)
31、議,而是一套開(kāi)放的、支持多種協(xié)議的 Windows 下的網(wǎng)絡(luò)編程接口。 現(xiàn)在的 WinSock 已可以使用 WinSock 來(lái)調(diào)用多種協(xié)議的功能,但較常經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無(wú)關(guān),使用的是 TCP/IP 協(xié)議。Socket 實(shí)際在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過(guò)這個(gè)端口與任何一個(gè)具有 Socket 接口的計(jì)算機(jī)通信。 應(yīng)用程序在網(wǎng)絡(luò)上傳輸, 接收的信息都通過(guò)這個(gè) Socket 接口來(lái)實(shí)現(xiàn)。應(yīng)用程序利用 WinSock 的 API(應(yīng)用程序編程接口)實(shí)現(xiàn)相互之間的通信,每個(gè) Socket 與一個(gè)進(jìn)程相聯(lián)系,它又利用下層的網(wǎng)絡(luò)通信協(xié)議功能和操作系統(tǒng)調(diào)用實(shí)現(xiàn)實(shí)際的通信工作。 實(shí)際上,Socket
32、只是一種抽象,它是的雙向端點(diǎn), 通過(guò)它既可以發(fā)送數(shù)據(jù),也可以接收數(shù)據(jù)。接3.1 套接字(Socket)的概念網(wǎng)絡(luò)編程,即編寫(xiě)基于ernet 的應(yīng)用程序。 這種程序首先要能利用 TCP/IP 協(xié)議棧形成的網(wǎng)絡(luò)通信管道,完成網(wǎng)絡(luò)上不同主機(jī)進(jìn)程間的通信。 在此基礎(chǔ)上, 才能開(kāi)發(fā)各種網(wǎng)絡(luò)應(yīng)用功能。 而套接字正是實(shí)現(xiàn)進(jìn)程通信的得力工具。 從效果上說(shuō), 套接字(Socket)是對(duì)網(wǎng)絡(luò)中不同主機(jī)間進(jìn)程通信端點(diǎn)的抽象,一個(gè)套接字就是通信的一端,提供了應(yīng)用層進(jìn)程利用下層協(xié)議棧交換數(shù)據(jù)的機(jī)制。 如圖 3. 1 所示。從實(shí)現(xiàn)上說(shuō), 套接字是一個(gè)機(jī)構(gòu), 包含一定的數(shù)據(jù)結(jié)構(gòu), 用一個(gè)整數(shù)來(lái)代表, 相當(dāng)于文件句柄。 使用
33、上說(shuō), 套接字是一個(gè)編程接口。 猶如電器通過(guò)電插座,來(lái)方便地用電; 程序通過(guò)綁定套接字, 來(lái)方便地使用網(wǎng)絡(luò)的通信功能。 套接字存在信域中。 套接字通常和同一個(gè)域中的套接字交換數(shù)據(jù)。Socket 可以使用多種通訊協(xié)議棧, 在互聯(lián)網(wǎng)中使用的是 TCP/IP 協(xié)議棧。 網(wǎng)絡(luò)層IP 尋找路由, 盡力將數(shù)據(jù)報(bào)從一臺(tái)主機(jī)傳送到另一臺(tái)主機(jī)。 傳輸層則通過(guò)端口為應(yīng)用層的進(jìn)程提供端到端的傳輸服務(wù)。 傳輸層定義了兩個(gè)端到端的協(xié)議。 一個(gè)是傳輸控制協(xié)議 TCP(TransmisControl Protocol ), 這是一個(gè)面向連接的可靠的流的傳輸協(xié)議; 另一個(gè)是用戶(hù)數(shù)據(jù)報(bào)協(xié)議 UDP(User Datagr連接的
34、協(xié)議。rotocol), 這是一個(gè)不可靠的、無(wú)3.2套接字的分類(lèi)用戶(hù)可使用兩種套接字:流式套接字和數(shù)據(jù)報(bào)套接字。 流式套接字使用傳輸控制協(xié)議(TCP), 數(shù)據(jù)報(bào)套接字使用用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP)。流式套接字提供可靠的、面向連接的流傳輸服務(wù), 類(lèi)似于系統(tǒng)。 每次完整的數(shù)據(jù)傳輸都要經(jīng)過(guò)建立連接,使用連接, 終止連接的過(guò)程。 在數(shù)據(jù)傳輸過(guò), 各數(shù)據(jù)分組不攜帶目的地址, 而使用連接號(hào)(Connection ID)。TCP 協(xié)議提供面向連接的虛電路, 本質(zhì)上, 連接是一個(gè)管道, 數(shù)據(jù)從管道的一端流入, 從另一端流出, 不但順序一致, 而且內(nèi)容相同。 鑒于此, 流式套接字得到越來(lái)越廣泛的應(yīng)用, 通常用來(lái)做
35、數(shù)據(jù)文件的傳輸, 如 ftp、 net 等, 特別適合于傳輸大批量、有序、無(wú)重復(fù)的數(shù)據(jù)。數(shù)據(jù)報(bào)套接字, 提供無(wú)連接的數(shù)據(jù)報(bào)傳輸服務(wù), 支持雙向的數(shù)據(jù)流, 數(shù)據(jù)通過(guò)相互獨(dú)立的數(shù)據(jù)報(bào)進(jìn)行傳輸,類(lèi)似于郵政系統(tǒng)。 每個(gè)分組都攜帶完整的目的地址, 各分組在系統(tǒng)中獨(dú)立傳送。 但無(wú)連接服務(wù)不能保證分組的先后順序, 不進(jìn)行出錯(cuò)分組的圖 3.1 應(yīng)用程序與 Socket 的關(guān)系物理通訊介質(zhì)操作系統(tǒng)(Windows)網(wǎng)絡(luò)通信協(xié)議服務(wù)接口網(wǎng)絡(luò)編程接口(Windows Socket)應(yīng)用程序應(yīng)用程序恢復(fù)與重傳, 不保證傳輸?shù)目煽啃浴?數(shù)據(jù)報(bào)套接字的一個(gè)重要特點(diǎn)是它保留的邊界, 對(duì)于這一特點(diǎn), 數(shù)據(jù)報(bào)套接字采用了與現(xiàn)在
36、許多包交換網(wǎng)絡(luò)非常類(lèi)似的模型。 數(shù)據(jù)報(bào)套接字方式由于取消了重發(fā)校驗(yàn)機(jī)制, 能夠達(dá)到較高的通訊速率, 可以用作一些對(duì)數(shù)據(jù)可靠性要求不高的通訊方面, 例如實(shí)時(shí)的語(yǔ)音、圖像轉(zhuǎn)送和廣播消息等。數(shù)據(jù)報(bào)套接字支持雙向的數(shù)據(jù)流,但并不保證是可靠,有序,無(wú)重復(fù)的。也就是說(shuō),一個(gè)從數(shù)據(jù)報(bào)套接字接收信息的進(jìn)程有可能發(fā)現(xiàn)信息重復(fù)了,或者和發(fā)出時(shí)的順序不同。數(shù)據(jù)報(bào)套接字是無(wú)連接的。因此在層上它適用于 UDP 協(xié)議。數(shù)據(jù)報(bào)套接字的一個(gè)重要特點(diǎn)是它保留了邊界。數(shù)據(jù)報(bào)套接字可以用來(lái)向許多系統(tǒng)支持的網(wǎng)絡(luò)發(fā)送廣播數(shù)據(jù)包。要實(shí)現(xiàn)這種功能,網(wǎng)絡(luò)本身必須支持廣播功能,因?yàn)橄到y(tǒng)并不提供對(duì)廣播功能的任何模擬。因?yàn)閺V播信息要求網(wǎng)絡(luò)上的每臺(tái)
37、主機(jī)都為它們服務(wù),所以發(fā)送廣播數(shù)據(jù)包的能力被限制于那些用顯式標(biāo)記了允許廣播的套接字中。廣播通常是為了如下兩個(gè)原因而使用的:1.應(yīng)用程序希望在本地網(wǎng)絡(luò)中找到一個(gè)資源,而應(yīng)用程序?qū)υ撡Y源的地址又沒(méi)有任何先驗(yàn)的知識(shí)。2.一些重要的功能,例如路由要求把它們的給所有可以找到的鄰機(jī)。被廣播信息的目的地址取決于這一信息將在何種網(wǎng)絡(luò)上廣播。ernet 域中支持一個(gè)速記地址用于廣播 INADDRBROADCAST。由于使用廣播以前必須一個(gè)數(shù)據(jù)報(bào)套接字,所以所有收到的廣播消息都帶有發(fā)送者的地址和端口。3.3Winsoek 網(wǎng)絡(luò)編程原理通信的基石是套接口,一個(gè)套接口是通信的一端。在這一端上可以找到與其對(duì)應(yīng)的一個(gè)名字
38、。一個(gè)正在被使用的套接口都有它的類(lèi)型和與其相關(guān)的進(jìn)程。套接口存在信域中。通信域是為了處理一般的線(xiàn)程通過(guò)套接口通信而引進(jìn)的一種抽象概念。套接口通常和同一個(gè)域中的套接換數(shù)據(jù)(也可能穿越域的界限,但這時(shí)一定要執(zhí)行某種解釋程序)。Windows Sockets 規(guī)范支持單一的通信域,即ernet 域。各種進(jìn)程使用這個(gè)域互相之間用ernet 協(xié)議簇來(lái)進(jìn)行通信(WindowsSoekets1.1 以上的版本支持其他的域,例如Windows Soekets2)。套接口可以根據(jù)通信性質(zhì)分類(lèi);這種性質(zhì)對(duì)于用戶(hù)是可見(jiàn)的。應(yīng)用程序一般僅在同一類(lèi)的套接口間通信。不過(guò)只要底層的通信協(xié)議允許,不同類(lèi)型的套接口間也照樣可以
39、通信。用戶(hù)目前可以使用兩種套接口,即流套接口和數(shù)據(jù)報(bào)套接口。流套接口提供了雙向的,有序的,無(wú)重復(fù)并且無(wú)邊界的數(shù)據(jù)流服務(wù)。數(shù)據(jù)報(bào)套接口支持雙向的數(shù)據(jù)流,但并不保證是可靠,有序,無(wú)重復(fù)的。也就是說(shuō),一個(gè)從數(shù)據(jù)報(bào)套接口接收信息的進(jìn)程有可能發(fā)現(xiàn)信息重復(fù)了,或者和發(fā)出時(shí)的順序不同。數(shù)據(jù)報(bào)套接口的一個(gè)重要特點(diǎn)是它保留了邊界。對(duì)于這一特點(diǎn),數(shù)據(jù)報(bào)套接口采用了與現(xiàn)在許多包交換網(wǎng)絡(luò)(例如以太網(wǎng))非常類(lèi)似的模型17。流套接字和數(shù)據(jù)報(bào)套接字編程的過(guò)程基本類(lèi)似。由于本程序是基于 UDP 協(xié)議的,所以下面簡(jiǎn)單介紹下數(shù)據(jù)報(bào)套接字編程的常用函數(shù):創(chuàng)建套接字:SOCKET socket(aftype,protocol);參數(shù)
40、of 用于指定網(wǎng)絡(luò)地址,一般取 AF INET,表示該套接字在ernet 域中通信。參數(shù)type 用于指定套接字類(lèi)型,若取 SOC 凡STREAM 表示要?jiǎng)?chuàng)建的套接字是流套接字,采用TCP 協(xié)議,若取SOCK DGRAM,表示要?jiǎng)?chuàng)建數(shù)據(jù)報(bào)套接字,采用 UDP 協(xié)議。這里取SOCK DGRAM。參數(shù) protocol 用于指定網(wǎng)絡(luò)協(xié)議,一般取 0,表示默認(rèn)為T(mén)CP/IP協(xié)議。關(guān)閉套接字:closesocket(SOCKET s);綁定套接:bind(SOCKET s,const struct sockaddr *name,namelen);s 是未套接字的句柄,用來(lái)等待客戶(hù)機(jī)的連接。name 是
41、賦予套接字的地址,由sockaddr 結(jié)構(gòu)體表示,但由于該結(jié)構(gòu)體的結(jié)構(gòu)隨選擇的協(xié)議的不同而變化,所以通常選用sockaddr in 結(jié)構(gòu)體表示,用來(lái)標(biāo)識(shí)TCP/IP 協(xié)議下的地址。該結(jié)構(gòu)體原型如下:struct sockaddr inshort sin family;unsigned short sin_port; struct in addrsin addr;char sin zero8;其中,sin family 必須取 AF-INET, sin-port 即為要設(shè)置的端地址,sin addr 則是要指定的IP 地址,sin zero 只充當(dāng)填充項(xiàng)。namelen 表示該結(jié)構(gòu)體的長(zhǎng)度。使用
42、套接字發(fā)送數(shù)據(jù)接收數(shù)據(jù):sendto(Socket s,const char FAR *buf,o,tolen);lendflags const struct sockaddr FAR*s 標(biāo)識(shí)了發(fā)送套接字,buf 是字符緩沖區(qū),包含即將發(fā)送的數(shù)據(jù),len 指定 buf 內(nèi)的字符數(shù)。flags 通常取 0,to 是一個(gè)sockaddr in 結(jié)構(gòu)體指針。tolen 則是該結(jié)構(gòu)體的長(zhǎng)度。recvfrom(Socket s,char FAR *buf,F(xiàn)AR* fromlen);len,flags,struct sockaddr FAR*from,參數(shù)意義與sendt。類(lèi)似,只是由發(fā)送函數(shù)變?yōu)榻邮?/p>
43、函數(shù)。Close()Close()圖 3.2 數(shù)據(jù)報(bào)套接字編程流程圖recvfrom()sendto()服務(wù)應(yīng)答處理服務(wù)請(qǐng)求sendto()服務(wù)請(qǐng)求阻塞,等待客戶(hù)數(shù)recvfrom()bind()bind()Socket()Socket()發(fā)送端接收端第四章 UDP 網(wǎng)段掃描器的設(shè)計(jì)4.1CSOCKET 的類(lèi)中 UDP 協(xié)議相關(guān)函數(shù)簡(jiǎn)介VC 中的 CSocket 類(lèi)提供了 UDP 的實(shí)現(xiàn),在創(chuàng)建套接字的函數(shù) Create 里通過(guò)指定套接字類(lèi)型為SOCK_STREAM,就可以實(shí)現(xiàn) UDP 的傳輸。/創(chuàng)建特定類(lèi)型的套接字 BOOL Create(UnSocketPort=0,/端口 nSocket
44、Type /套接字類(lèi)型LPCTSTR lpszSocetAddreULL/IP 地址);SOCK_STREAM:流式套接字,提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)地發(fā)送,且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限:數(shù)據(jù)被看作是字節(jié)流。無(wú)長(zhǎng)度限制:文件傳送協(xié)議(FTP)即使用流式套接字19。SOCK_DGRAM:數(shù)據(jù)報(bào)式套接字,提供了一個(gè)無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無(wú)錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序(NFS)使剛數(shù)據(jù)報(bào)式套接字20。/將數(shù)據(jù)寫(xiě)到某種類(lèi)型的Socket,發(fā)送到指定的地址 SendTo(const void*lpBuf,/發(fā)送的數(shù)據(jù) n
45、BufLen,/數(shù)據(jù)長(zhǎng)度U1NT nHostPort,/目的端口。網(wǎng)絡(luò)文件系統(tǒng)LPCTSTR lpSZHOStAddrenFlags=0/調(diào)用的方法ULL,/目的地址);/接收數(shù)據(jù)ReceiveFrom(void*lpBuf,/接收的數(shù)據(jù) nBufLen,/數(shù)據(jù)長(zhǎng)度CString&rSocketAddress,/發(fā)數(shù)據(jù)的機(jī)器IP U&rSocketPort,/端口nFlagS:0/調(diào)用的方法);/收到消息 void OnReceive (nErrorCode/Socket 錯(cuò)誤代碼);這里要注意 OnReceive()函數(shù),由于 CSocket 是基于窗口消息的類(lèi),因此,只要套接字上有消息(比
46、如數(shù)據(jù)到達(dá)),就會(huì)調(diào)用 OnReceive()函數(shù)。4.2事件函數(shù)為線(xiàn)程創(chuàng)建函數(shù)為了防止在查詢(xún)信息過(guò)界面不響應(yīng),例將查詢(xún)的代碼放到一個(gè)線(xiàn)程里單獨(dú)實(shí)現(xiàn)。為了控制線(xiàn)程的執(zhí)行,還引入了事件對(duì)象Event,下面介紹一下相關(guān)的函數(shù):/創(chuàng)建事件對(duì)象 HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventributes,/事件對(duì)象繼承屬性BOOL bManualReset,/明確重置類(lèi)型,如果為 TRUE,則要用 ResetEvent 來(lái)重置,否則自動(dòng)重置BOOL bInitialS溯U 處于非觸發(fā)狀態(tài)e,/初始狀態(tài),如果為T(mén)RUE,表示初始處于觸發(fā)狀態(tài),LPCTS
47、TR lpName /對(duì)象名字);/重置事件,使事件處于非觸發(fā)狀態(tài) BOOL ResetEvent(HANDLE hEvent/事件的句柄);/設(shè)置事件到觸發(fā)狀態(tài) BOOL SetEvent(HANDLE hEvent/事件的句柄);/檢查對(duì)象的狀態(tài),如果對(duì)象處于非觸發(fā)狀態(tài),則繼續(xù)等待,如果處于觸發(fā)狀態(tài)或者超時(shí),則退出 DWORD WaitForSingleObject(HANDLE hHandle,/對(duì)象句柄 DWORD dwMilliseconds /超時(shí)間隔);/創(chuàng)建啟動(dòng)線(xiàn)程CW(hread*AhfxBeghreadAFX_THREROC pfnThreroc,/工作函數(shù)指針LPVOID
48、 pParam,/工作函數(shù)參數(shù)指針nPriority=THRERIORITY MORMAL,/線(xiàn)程優(yōu)先級(jí)UnStackSize=0,/線(xiàn)程的堆大小DWORD dwCreateFlags=0,/明確線(xiàn)程的附加屬性LPSECURlTY_ATTRIBUTES lpSecurityAttrs=NULL/線(xiàn)程的安全屬性);4.3網(wǎng)段掃描器設(shè)計(jì)4.3.1程序主界面UDP 網(wǎng)段掃描器的程序主界面包括設(shè)定 IP 地址,設(shè)定端口,顯示掃描過(guò)程和顯示掃描結(jié)果等幾部分,具體見(jiàn)圖 4.1。圖 4.1 程序主界面4.3.2啟動(dòng)掃描在CNBTS/啟動(dòng)掃描BTSDlg:OnBtnSend()中啟動(dòng)掃描,該函數(shù)創(chuàng)建了掃描線(xiàn)程
49、。Dlg:OnBmSend()/從IP 控件得到要掃描的IP 范圍 m_IPEditlGetAddress(B10,B11,B12,Bl3); m_IPEdit2GetAddress(B20,B21,B22,B23);/判斷IP 范圍是否合法If (B22B12) AfxMessageBox(“終止地址應(yīng)大于起始地址!”);return; Else if (B22=B12&B23EnableWindow(false); GetDlgltem (IDC_EDITl)-EnableWindow(false);GetDlgltem (IDC_SPINl)-EnableWindow(false); G
50、etDlgltem (IDC_IPADDRESSl)-EnableWindow(fdse); GetDlgltem (IDC_IPADDRESS2)-EnableWindow(fdse); GetDlgltem (IDC_BTNEXIT)-EnableWindow(true);/啟動(dòng)線(xiàn)程AfxBeghread(NbtsThread,this-GetSafeHwnd(),THREAD_PRJORITY_NORMAL)12;4.3.3掃描線(xiàn)程線(xiàn)程函數(shù)主要是向指定范圍的 IP 發(fā)數(shù)據(jù),首先,它向一個(gè) IP 發(fā)數(shù)據(jù),然后利用WaitForSingleObject()等待,直到 CNBTSDlg:OnR
51、eceive()里收到了該 IP 機(jī)器發(fā)回的響應(yīng)信息,觸發(fā)了事件后,線(xiàn)程才繼續(xù)對(duì)下一個(gè)IP 發(fā)數(shù)據(jù),如此循環(huán)。/線(xiàn)程函數(shù)UNbtsThread(LPVOID param)/循環(huán)對(duì)要查詢(xún)的IP 發(fā)數(shù)據(jù)doif(bExit)/是否退出線(xiàn)程AfxMessageBox(“exit thread!”);pDlg-GetDlgltem (IDC_BTN_SEND)-EnableWindow(true); pDlg-GetDlgltem (IDC_EDIT1)-EnableWindow(true); pDlg-GetDlgltem (IDC_SPINl)-EnableWindow(true);pDlg-Ge
52、tDlgltem (IDC_IPADDRESS1)-EnableWindow(true); pDlg-GetDlgltem (IDC_IPADDRESS2)-EnableWindow(true); pDlg-GetDlgltem (IDC _BTN_EXIT)-EnableWindow(false); bExit=false;retum1;pDlg-m_seIPFormat(“dd,dd”,B10,B11,B12,B13);/得到IPpDlg-m_m_LisBOxInsertString(0,pDlg-mstrIP);/將該 IPListView 的IP 字段if(B13!=0&B12!=0)
53、/向指定的IP 發(fā)數(shù)據(jù)報(bào)pDlg-m_UDPSocke nWait=pDlg-m_swaitForSingleOject (dTo(void*)bs,50,destPORT,pDlg-mstrIP,0);et();/設(shè)置超時(shí)wait_lhandle,/等待事件的句柄 nWait /超時(shí));ResetEvent(wait_handle);/將事件重新置回非觸發(fā)狀態(tài)/生成下一個(gè)要查詢(xún)的IP if(B12=B22)if(B13B23+;else if(B12B22&B13255)B13+;else if(Bl2=B23&Bl2=B22)break;whi1(2)=255&B13m_ListBox.I
54、nsertStling(0,“plete!”);pDlg- GetDlgltem (IDC_BTN_SEND)-EnableWindow(ture);pDlg- GetDlgltem (IDC_EDIT1)-EnableWindow(true); pDlg- GetDlgltem (IDC_SPINl)-EnableWindow(true);pDlg- GetDlgltem (IDC_IPADDRESSl)-EnableWindow(true); pDlg- GetDlgltem (IDC_IPADDRESS2)-EnableWindow(true); pDlg- GetDlgltem (ID
55、C_BTN_EXIT)-EnableWindow(false); retum0;4.3.4獲得掃描結(jié)果在 CNBTSDlg:OnReceive()里,接收各個(gè)要查詢(xún)的機(jī)器發(fā)回的響應(yīng)信息,從響應(yīng)信息里取出對(duì)應(yīng)的機(jī)器工作組、機(jī)器名、用戶(hù)名、MAC 地址,然后,觸發(fā)事件導(dǎo)致線(xiàn)程函數(shù)可以繼續(xù)執(zhí)行。/接收消息 Void CNBTSDlg:OnReceive()BYTE Buf500;CString str,strIP,strHost,strHex,strMac,Host,Group,USer;Udport;M_UDPSocketReceiveFrom(Buf,500,slxIP,dport,O);/接收數(shù)據(jù),數(shù)據(jù)報(bào)在Buf,IP在strlF/如果接收到的IP 為空或者與原來(lái)接收到的IP 相同,則返回if(strip=(char)NULL|strip=strOldP)return; strO1dIP=strip;index=m_ListViewInsertltem(0,s stxHost=“”;/機(jī)器名字 sffHex=“”;/MAC 地址User=“?”; Host=“”;tem=0,num=0;boo1 bAdd=true;);/將IPListView;/根據(jù)數(shù)據(jù)報(bào)規(guī)則取出相應(yīng)的信息 For(i=57;i500;i+)/57-72/省略/觸發(fā)事件,導(dǎo)致線(xiàn)程函數(shù)的繼續(xù)執(zhí)行 Set
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳染病防控政策執(zhí)行效果評(píng)價(jià)考核試卷
- 農(nóng)藥生產(chǎn)?;钒踩僮饕?guī)程考核試卷
- 內(nèi)陸?zhàn)B殖水域資源開(kāi)發(fā)與漁業(yè)生態(tài)補(bǔ)償機(jī)制設(shè)計(jì)考核試卷
- 化學(xué)礦床勘探成本控制技術(shù)考核試卷
- 世界環(huán)境日活動(dòng)總結(jié)集合14篇
- 神經(jīng)內(nèi)科業(yè)務(wù)學(xué)
- 會(huì)計(jì)人員年度的工作總結(jié)
- 沈陽(yáng)建黨節(jié)活動(dòng)方案
- 江灘大舞臺(tái)活動(dòng)方案
- 漢陽(yáng)促銷(xiāo)活動(dòng)方案
- 2025-2030中國(guó)功率半導(dǎo)體器件市場(chǎng)格局與投資方向報(bào)告
- 統(tǒng)編版五年級(jí)升六年級(jí)語(yǔ)文暑期銜接《課外閱讀》專(zhuān)項(xiàng)測(cè)試卷及答案
- 2025年 煙草陜西公司招聘考試筆試試題附答案
- 2025年老年教育課程設(shè)置:藝術(shù)修養(yǎng)與審美教學(xué)探索報(bào)告
- 2025年河北高考真題化學(xué)試題+解析(參考版)
- 2025至2030中國(guó)數(shù)字出版行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國(guó)中藥材種植行業(yè)運(yùn)作模式與競(jìng)爭(zhēng)格局分析報(bào)告
- 武漢大學(xué)2020年強(qiáng)基計(jì)劃物理試題(原卷版)
- 2025年隨州國(guó)投集團(tuán)公開(kāi)招聘42名工作人員筆試參考題庫(kù)附帶答案詳解
- 2025泰和安消防產(chǎn)品選型手冊(cè)
- CJ/T 316-2009城鎮(zhèn)供水服務(wù)
評(píng)論
0/150
提交評(píng)論