版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、目 錄摘要IIIAbstractIV第 1 章 緒論1研究背景1網(wǎng)絡(luò)掃描器概述.21.2.3安全的定義1的分級(jí)2掃描器3安全1.3 本文研究內(nèi)容5第 2 章 NetBIOS 及 UDP 協(xié)議介紹6網(wǎng)段掃描器實(shí)現(xiàn)原理6UDP 與TCP 簡介6UDP 與TCP 的選擇6TCP 與 UDP 的區(qū)別7TCP 與 UDP 的效率比較8第 3 章 Winsock 開發(fā)原理9套接字(Socket)的概念9套接字的分類10Winsoek 網(wǎng)絡(luò)編程原理11第 4 章 UDP 網(wǎng)段掃描器的設(shè)計(jì)14CSOCKET 的類中 UDP 協(xié)議相關(guān)函數(shù)簡介14事件函數(shù)為線程創(chuàng)建函數(shù)15網(wǎng)段掃描器設(shè)計(jì)16啟動(dòng)
2、掃描17掃描線程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)用程序的開發(fā)越來越普遍, 因此進(jìn)行網(wǎng)絡(luò)應(yīng)用程序的開發(fā)就顯得尤為重要。本文首先在數(shù)據(jù)傳輸網(wǎng)絡(luò)中,與 TCP、SCTP等其它傳輸協(xié)議相比,UDP 協(xié)議在速度上有著一定的優(yōu)勢,但也存在著可靠性差的問題。結(jié)合 TCP、SCTP 和 UDP 各自的優(yōu)勢,IETF 提出了可靠 UDP(Reliable UDP, RUDP)草案,并在此基礎(chǔ)上,提出了可靠 UDP 的實(shí)現(xiàn)方案。其次對 Windows 下 UDP編程接口 Windows Socket 的相關(guān)
3、知識(shí)進(jìn)行了概述, 介紹了套接字的分類及面向連接的套接字編程原理, 分析了在 Windows 環(huán)境應(yīng)用 Socket 實(shí)現(xiàn)網(wǎng)絡(luò)通信的機(jī)制, 并闡述了如何基于 Windows Socket 創(chuàng)建面向連接的客戶機(jī)/服務(wù)器(C/S) 網(wǎng)絡(luò)應(yīng)用程序。最后創(chuàng)建基于 Windows Socket 的網(wǎng)絡(luò)應(yīng)用程序時(shí), 需要對服務(wù)器方和客戶方都應(yīng)該編寫應(yīng)用程序。結(jié)合 Visual C+ 程序開發(fā)環(huán)境,利用 WinSock 的網(wǎng)絡(luò)開發(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)系在一起,“地球村”的夢想已然成為了現(xiàn)實(shí)?;ヂ?lián)網(wǎng)已經(jīng)深入到人類社會(huì)的各個(gè)領(lǐng)域,成為人們?nèi)粘I钏豢扇鄙俚囊徊糠?。它正在改變著人們的生產(chǎn)方式、工作方式、生活方式和學(xué)習(xí)方式,推動(dòng)了各行各業(yè)的發(fā)展?;ヂ?lián)網(wǎng)如此迅速發(fā)展并廣泛使用,主要得益于其所特有的豐富信息資源。人們只要進(jìn)入網(wǎng)路世界便可以從浩如煙海的信息中查詢到自己需要的部分,可以和遠(yuǎn)隔重洋的親朋好友互通音訊,可以坐在家中接受全球各地醫(yī)學(xué)的會(huì)診,可以實(shí)現(xiàn)網(wǎng)上購物、網(wǎng)上?;ヂ?lián)網(wǎng)
9、的迅速發(fā)展,給人們的日常生活帶來了全新的感受,同時(shí)人類社會(huì)對信息網(wǎng)絡(luò)的依賴程度已經(jīng)越來越強(qiáng),一個(gè)真正的互聯(lián)網(wǎng)時(shí)代已經(jīng)到來。然而,隨著互聯(lián)網(wǎng)的廣泛普及越來越多不同背景和不同的參與者介入到互聯(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)以來最大的,已成為ernet 上的焦點(diǎn),它關(guān)系著ernet 的進(jìn)一步發(fā)展和普及,甚至關(guān)系著ernet 的生存。問題已經(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)。具體舉例來說,比如在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)安全(可靠性、可用性、從廣義上講性、可控性、不可抵賴性)的事物。包括,硬件,程序,數(shù)據(jù)。計(jì)算機(jī)系統(tǒng)中存在的會(huì)隨著用戶的深入使用被不斷出來。隨著時(shí)間的推移,舊的會(huì)不斷消失,新的會(huì)不斷出現(xiàn),安全也會(huì)長期存在。因此,對安全問題的研究必須要進(jìn)行動(dòng)態(tài)實(shí)時(shí),對于發(fā)現(xiàn)的必須及時(shí)處理。1.2.2安全的分級(jí)系統(tǒng)安全的存在可以是某些者
11、得到可趁之機(jī),他們可以利用這些侵入他人計(jì)算機(jī)系統(tǒng)以達(dá)到其不可告人的目的。例如:他們可以利用某些在未情況下他人系統(tǒng),并獲取他人計(jì)算機(jī)上的資料。在對者行為分析的基程度可粗略的將其分為三級(jí):者并可能會(huì)破壞整個(gè)目標(biāo)系統(tǒng)的礎(chǔ)上,按對目標(biāo)主機(jī)的A 級(jí)用戶:允許,如允許未的。A 級(jí)是最大的一種,大多數(shù) A級(jí)是由于較差的系統(tǒng)管理或配置有誤造成的。幾乎可以在任意類型的中找到這樣的漏洞。如,F(xiàn)TP、ned等一些網(wǎng)絡(luò)程序常存在一些嚴(yán)重的 A 級(jí)。B 級(jí):是允許本地用戶提高權(quán)限,并可能允許其獲得系統(tǒng)控制的。大多數(shù)的 B 級(jí)是由應(yīng)用程序中的一些缺陷或代碼錯(cuò)誤引起的。例如,在程序調(diào)試過為了調(diào)試方便會(huì)設(shè)置一些特殊的,在某些
12、情況下可以使測試不需要密碼就能。如果當(dāng)程序調(diào)試成功后,忘記了將這些刪除,就會(huì)造成允許用戶提高權(quán)限的。造成的緩沖區(qū)溢出問題也是一類典型的 B此外,因編程缺陷或程序設(shè)計(jì)語言級(jí)安全。編程時(shí),程序員會(huì)設(shè)置一些緩沖區(qū),但是如果程序員沒有對這些緩沖區(qū)做適當(dāng)?shù)臋z查,判斷它們是否足夠大,結(jié)果就可能造成緩沖區(qū)溢出。當(dāng)緩沖區(qū)溢出時(shí),過剩的信息會(huì)覆蓋的是計(jì)算機(jī)內(nèi)存中的內(nèi)容。那些能夠被程序調(diào)用的子程序的列表信息以及傳遞給子程序的信息、參數(shù)都有可能丟失。這意味著程序不能得到足夠的信息從子程序返回。者會(huì)利用精心編寫的代碼使緩沖區(qū)溢出,然后告訴程序依據(jù)他們預(yù)設(shè)的方法處理緩沖區(qū)并且執(zhí)行,從而使整個(gè)運(yùn)行程序處于他們的控制之中。
13、C 級(jí)最典型的一種:是任何允許用戶中斷、降低或阻礙系統(tǒng)操作的,例如服務(wù)。服務(wù)是 SYNFLOOD,即者將大量的連接請求發(fā)往目標(biāo)服務(wù)器,目標(biāo)主機(jī)不得不處理這些“半開”的 SYN 請求,然而并不能得到 ACK 回答,很快服務(wù)器就會(huì)因?yàn)閮?nèi)存資源枯竭而掛起,任何用戶都不能再從服務(wù)器上獲得服務(wù)。綜上所述,對目標(biāo)主機(jī)危害最嚴(yán)重的是 A 級(jí)洞是對系統(tǒng)正常工作進(jìn)行干擾。,其次是 B 級(jí),而 C 級(jí)漏1.2.3掃描器從掃描過程來看,掃描工具大體上可分為網(wǎng)絡(luò)掃射,端口掃描,弱點(diǎn)掃描幾種類型。網(wǎng)絡(luò)(Packet掃射ernet Grope),因特網(wǎng)包探索器,用于測試網(wǎng)絡(luò)連接量的程序。最常用的,就是利用 ICMP 協(xié)議
14、,也是最簡單的探測,用來判斷目標(biāo)是否活動(dòng)。實(shí)際上是向目標(biāo)發(fā)送一個(gè)要求回顯(Type = 8)的 ICMP 數(shù)據(jù)報(bào),當(dāng)主機(jī)得到請求后,再返回一個(gè)回顯(Type =核中的,而不是一個(gè)用戶進(jìn)程。0)數(shù)據(jù)報(bào)。而且是最基本的探測程序一般是直接實(shí)現(xiàn)在系統(tǒng)內(nèi),Sp(掃射)就是對一個(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ù)使用,具體是鍵入按回車即可看到詳細(xì)說明。指的是端對端連通,通常用來作為可用性的檢查。端口掃描
15、真正的掃描器是TCP 端口掃描器,這種程序可以選通 TCP/IP 端口和服務(wù)(比如,目標(biāo)的回答。通過這種方法,可以搜集到關(guān)于目標(biāo)主機(jī)的有用net 或 FTP),并信息(比如,一個(gè)用戶是否可以登錄等等)。而其他所謂的掃描器僅僅是 UNIX 網(wǎng)絡(luò)應(yīng)用程序,這些程序一般用于觀察某一服務(wù)是否正在一臺(tái)機(jī)器上正常工作,它們不是真正的掃描器,但也可以用于收集目標(biāo)主機(jī)的信息(UNIXhost 命令就是這類程序的很好的例子)。上通用的 rusers 和一個(gè)端口就是一個(gè)潛在的通信通道,也就是一個(gè)通道。對目標(biāo)計(jì)算機(jī)進(jìn)行端口掃描,能得到許多有用的信息,從而發(fā)現(xiàn)系統(tǒng)的安全。它使系統(tǒng)用戶了解系統(tǒng)目前向外界提供了哪些服務(wù),
16、從而為系統(tǒng)用戶管理網(wǎng)絡(luò)提供了一種。端口掃描技術(shù)原理端口掃描向目標(biāo)主機(jī)的 TCP/IP 服務(wù)端口發(fā)送探測數(shù)據(jù)包,并目標(biāo)主機(jī)的響應(yīng)。通過分析響應(yīng)來判斷服務(wù)端口是打開還是關(guān)閉,就可以得知端口提供的服務(wù)或信息。端口掃描也可以通過捕獲本機(jī)或服務(wù)器的流入流出 IP 數(shù)據(jù)包來監(jiān)視本機(jī)的運(yùn)行情況,它僅能對接收到的數(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 連接請求,從而使得被攻擊方資源耗盡(CPU 滿負(fù)荷或內(nèi)存)的方式,最終導(dǎo)致系統(tǒng)或服務(wù)器宕機(jī)8。在S
17、YN Flood 原理前,需要從 TCP 連接建立的過程開始說起:TCP 與 UDP 不同,它是基于連接的,為了在服務(wù)端和客戶端之間傳送 TCP 數(shù)據(jù),必須先建立一個(gè)虛擬電路,也就是 TCP 連接。也就是經(jīng)常聽說的 TCP 協(xié)議中的三次握手(Three-wayHandshake),建立 TCP 連接的標(biāo)準(zhǔn)過程如下:首先,客戶端發(fā)送一個(gè)包含 SYN 標(biāo)志的 TCP 報(bào)文,SYN 即同步(Synchronize),同步報(bào)文會(huì)指明客戶端使用的端口以及 TCP 連接的初始序號(hào);其次,服務(wù)器在收到客戶端的 SYN 報(bào)文后,將返回一個(gè) SYN+ACK(即確認(rèn) Acknowledgement)的報(bào)文,表示客
18、戶端的請求被接受,同時(shí) TCP 初始序號(hào)自動(dòng)加一。最后,客戶端也返回一個(gè)確認(rèn)報(bào)文 ACK 給服務(wù)器端,同樣 TCP 序列號(hào)被加一,到此一個(gè) TCP 連接完成。SYN Flood正是利用了 TCP 連接的三次握手,假設(shè)一個(gè)用戶向服務(wù)器發(fā)送了SYN 報(bào)文后突然死機(jī)或掉線,那么服務(wù)器在發(fā)出 SYN+ACK 應(yīng)答報(bào)文后是無法收到客戶端的 ACK 報(bào)文的(第三次握手無法完成),這種情況下服務(wù)器端一般會(huì)重試(再次發(fā)送 SYN+ACK 給客戶端)并等待一段時(shí)間后丟棄這個(gè)未完成的連接,這段時(shí)間的長度稱為 SYN Timeout,一般來說這個(gè)時(shí)間是分鐘的數(shù)量級(jí)(大約為 30 秒-2 分鐘);一個(gè)用戶出現(xiàn)異常導(dǎo)致
19、服務(wù)器的一個(gè)線程等待 1 分鐘并不會(huì)對服務(wù)器端造成什么大的影響,但如果有大量的等待丟失的情況發(fā)生,服務(wù)器端將為了一個(gè)非常大的半連接請求而可以想象大量的保存并遍歷也會(huì)消耗非常多的 CPU 時(shí)間和內(nèi)消耗非常多的資源。存,再加上服務(wù)器端不斷對列表中的 IP 進(jìn)行 SYN+ACK 的重試,服務(wù)器的負(fù)載將會(huì)變得非常巨大。如果服務(wù)器的 TCP/IP 棧不夠強(qiáng)大,最后的結(jié)果往往是堆棧溢出。相對于數(shù)據(jù)流,正常的用戶請求就顯得十分渺小,服務(wù)器疲于處理者的TCP 連接請求而無暇理睬客戶的正常請求,此時(shí)從正??蛻魰?huì)表現(xiàn)為打開頁面緩慢或服務(wù)器無響應(yīng),這種情況就是常說的服務(wù)器端 SYN Flood(SYN 洪水)。這種
20、技術(shù)通常認(rèn)為是“半開放”掃描,這是因?yàn)閽呙璩绦虿槐匾蜷_一個(gè)完全的 TCP 連接。掃描程序發(fā)送的是一個(gè) SYN 數(shù)據(jù)包,好像準(zhǔn)備打開一個(gè)實(shí)際的連接并等待反應(yīng)一樣。一個(gè) SYN|ACK 的返回信息表示端口處于偵聽狀態(tài)。一個(gè) RST 返回,表示端口沒有處于偵聽?wèi)B(tài)。如果收到一個(gè) SYN|ACK,則掃描程序必須再發(fā)送一個(gè) RST 信號(hào),來關(guān)閉這個(gè)連接過程。這種掃描技術(shù)的優(yōu)點(diǎn)在于一般不會(huì)在目標(biāo)計(jì)算機(jī)上留下 。但這種方法的一個(gè)缺點(diǎn)是,必須要有 root 權(quán)限才能建立自己的 SYN 數(shù)據(jù)包。1.3本文研究內(nèi)容本文首先在數(shù)據(jù)傳輸網(wǎng)絡(luò)中,與 TCP、SCTP 等其它傳輸協(xié)議相比,UDP 協(xié)議在速度上有著一定的優(yōu)
21、勢,但也存在著可靠性差。結(jié)合 TCP、SCTP 和 UDP 各自的優(yōu)勢,IETF 提出了可靠 UDP(Reliable UDP,RUDP)草案,并在此基礎(chǔ)上,提出了可靠 UDP 的實(shí)現(xiàn)方案1。其次對 Windows 下 UDP 編程接口 Windows Socket 的相關(guān)知識(shí)進(jìn)行了概述, 介紹了套接字的分類及面向連接的套接字編程原理, 分析了在Windows 環(huán)境應(yīng)用 Socket 實(shí)現(xiàn)網(wǎng)絡(luò)通信的機(jī)制, 并闡述了如何基于 Windows Socket創(chuàng)建面向連接的客戶機(jī)/服務(wù)器(C/S) 網(wǎng)絡(luò)應(yīng)用程序。最后創(chuàng)建基于 Windows Socket 的網(wǎng)絡(luò)應(yīng)用程序時(shí), 需要對服務(wù)器方和客戶方都應(yīng)
22、該編寫應(yīng)用程序。結(jié)合 Visual C+ 程序開發(fā)環(huán)境,利用 WinSock 的網(wǎng)絡(luò)開發(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 簡介TCP 和 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ì)算,通過比較二者,就可以找出被破壞了的數(shù)據(jù)。因?yàn)樾枰匕l(fā)被破壞了的和已經(jīng)丟失的數(shù)據(jù),所以在需要重發(fā)數(shù)據(jù)時(shí)協(xié)議必須能夠使目的地給出的一個(gè)確認(rèn)信號(hào)。有些數(shù)據(jù)包不一定按照順序到達(dá),所以協(xié)議必須能夠探測出亂序的包,暫存起來,然后把它們按正確的次序送到應(yīng)用層中去。另外,協(xié)議還必須能夠找出并丟棄重復(fù)發(fā)送的數(shù)據(jù)。一組定時(shí)器可以限制針對不同確認(rèn)的等待時(shí)間,這樣就可以開始重新發(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)對非面向連接的包和數(shù)據(jù)包進(jìn)行路由。沒有點(diǎn)到點(diǎn)的連接,非面向連接的協(xié)議,如 UDP,是不可靠的連接。當(dāng)個(gè) UDP 數(shù)據(jù)包在網(wǎng)絡(luò)中移動(dòng)時(shí),發(fā)送過程并不知道它是否到達(dá)了目的地,除非應(yīng)用層已經(jīng)確認(rèn)了它已到達(dá)的事實(shí)。非面向連接的協(xié)議也不能探測重復(fù)的和亂序的包。標(biāo)準(zhǔn)的專業(yè)術(shù)語用“不可靠”來描述 UDP。在現(xiàn)代網(wǎng)絡(luò)中,UDP 并不易于導(dǎo)致傳輸失敗,但是也肯定地說它是可靠的。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é)長的頭部和數(shù)據(jù)的長度,域使其可以進(jìn)行整體校驗(yàn)。(許多應(yīng)用只支持 UDP,如多數(shù)據(jù)流,不產(chǎn)生任何額外的數(shù)據(jù),即使知道有破壞的包也不進(jìn)行重發(fā)。,很明顯,當(dāng)數(shù)據(jù)傳輸?shù)男阅鼙仨氉屛挥跀?shù)據(jù)傳輸?shù)耐暾?、可控制性和可靠性時(shí),TCP 協(xié)議是當(dāng)然的選擇。當(dāng)強(qiáng)調(diào)傳輸性能而不是傳輸?shù)耐暾詴r(shí),如音頻和多應(yīng)用,UDP 是最好的選擇。在數(shù)據(jù)傳輸時(shí)間很短,以至于此前的連接過程成為整個(gè)流量主體的情況下,UDP 也是個(gè)好的選擇,如 DNS 交換。把SNMP 建
26、立在 UDP 上的部分原因是設(shè)計(jì)者認(rèn)為當(dāng)發(fā)生網(wǎng)絡(luò)阻塞時(shí),UDP 較低的開銷使其有更好的機(jī)會(huì)去傳送管理數(shù)據(jù)4。TCP 豐富的功能有時(shí)會(huì)導(dǎo)致不可預(yù)料的性能低下,但是相信在不遠(yuǎn)的將來,TCP 可靠的點(diǎn)對點(diǎn)連接將會(huì)應(yīng)用于絕大多數(shù)的網(wǎng)絡(luò)中。本程序希望快速得到同網(wǎng)段機(jī)器的信息,并不需要特別可靠的連接確認(rèn)機(jī)制,故用 UDP來實(shí)現(xiàn)。對 TCP、UDP 和 SCTP 傳輸協(xié)議的描述可見,TCP 和 SCTP 都是面向連接的基的傳輸協(xié)議,為了保證可靠性,都采用了復(fù)雜的控制機(jī)制。雖然 SCTP 已經(jīng)比 TCP節(jié)約了很多資源,但是相對來說還是顯得復(fù)雜,也不適合基于消息的傳遞。而 UDP 協(xié)議對于可靠性又沒有采取任何措
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 提供無連接的通信,并不保證數(shù)據(jù)包被發(fā)送到。典型的即時(shí)傳輸少量數(shù)據(jù)的應(yīng)用程序使用 UDP。應(yīng)該說可靠的發(fā)送是應(yīng)用程序的責(zé)任。TCP 對系統(tǒng)資源的要求較多,UDP 較少且程序結(jié)構(gòu)比較簡單。TCP 能為應(yīng)用程序提供可靠的通信連接,使一臺(tái)計(jì)算機(jī)發(fā)出的字節(jié)流無差錯(cuò)地發(fā)往網(wǎng)絡(luò)上的
28、其他計(jì)算機(jī),對可靠性要求高的數(shù)據(jù)通信系統(tǒng)往往使用 TCP 協(xié)議傳輸數(shù)據(jù)14。UDP 適用于一次只傳送少量數(shù)據(jù)對可靠性要求不高的應(yīng)用環(huán)境,比如經(jīng)常使用命令來測試兩臺(tái)主SYNACKEAKRSTNULCHKTCS0Header LengthSequence NumberAck Number機(jī)之間TCP/護(hù)通信是否正常,其實(shí)命令的原理就是方主機(jī)發(fā)送 UDP 數(shù)據(jù)包,然后對方主機(jī)確認(rèn)收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來,那么網(wǎng)絡(luò)就是通的。這充分說明了 UDP 協(xié)議是面向非連接的協(xié)議,沒有建立連接的過程。正因?yàn)?UDP 協(xié)議沒有連接的過程,所以它的通信效果高,但也正因?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)開銷增大,通信帶寬有效利用率要低于無連接的通信方式;基機(jī)制,對通信數(shù)據(jù)的最終解釋和組裝要靠用戶來完成,這將帶來額外的系統(tǒng)開銷;到達(dá)確認(rèn)和超時(shí)重傳,在帶來可靠性的同時(shí)卻要耗費(fèi)相當(dāng)?shù)臅r(shí)間。UDP 協(xié)議不提供可靠性保證,也不提供流量控制,但卻在效率上有如下優(yōu)勢:不存在數(shù)據(jù)分片和連接管理,系統(tǒng)開銷較小,通信帶寬利用率要高于基于連接的通信方式;用戶無需再對接收到的數(shù)據(jù)進(jìn)
30、行組裝和解釋,也就無額外的系統(tǒng)開銷;不需確認(rèn)機(jī)制和超時(shí)重傳機(jī)制,了傳輸時(shí)間。第三章 Winsock 開發(fā)原理隨著ernet 的迅速發(fā)展, 網(wǎng)絡(luò)應(yīng)用的開發(fā)需求與日俱增。 急需各式各樣的網(wǎng)絡(luò)應(yīng)用, 也催生著各種網(wǎng)絡(luò)編程技術(shù), 用套接字(Socket)來實(shí)現(xiàn)互聯(lián)網(wǎng)上的進(jìn)程通訊, 進(jìn)而實(shí)現(xiàn)各種網(wǎng)絡(luò)應(yīng)用功能, 是開發(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、議,而是一套開放的、支持多種協(xié)議的 Windows 下的網(wǎng)絡(luò)編程接口。 現(xiàn)在的 WinSock 已可以使用 WinSock 來調(diào)用多種協(xié)議的功能,但較常經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無關(guān),使用的是 TCP/IP 協(xié)議。Socket 實(shí)際在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過這個(gè)端口與任何一個(gè)具有 Socket 接口的計(jì)算機(jī)通信。 應(yīng)用程序在網(wǎng)絡(luò)上傳輸, 接收的信息都通過這個(gè) Socket 接口來實(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), 通過它既可以發(fā)送數(shù)據(jù),也可以接收數(shù)據(jù)。接3.1 套接字(Socket)的概念網(wǎng)絡(luò)編程,即編寫基于ernet 的應(yīng)用程序。 這種程序首先要能利用 TCP/IP 協(xié)議棧形成的網(wǎng)絡(luò)通信管道,完成網(wǎng)絡(luò)上不同主機(jī)進(jìn)程間的通信。 在此基礎(chǔ)上, 才能開發(fā)各種網(wǎng)絡(luò)應(yīng)用功能。 而套接字正是實(shí)現(xiàn)進(jìn)程通信的得力工具。 從效果上說, 套接字(Socket)是對網(wǎng)絡(luò)中不同主機(jī)間進(jìn)程通信端點(diǎn)的抽象,一個(gè)套接字就是通信的一端,提供了應(yīng)用層進(jìn)程利用下層協(xié)議棧交換數(shù)據(jù)的機(jī)制。 如圖 3. 1 所示。從實(shí)現(xiàn)上說, 套接字是一個(gè)機(jī)構(gòu), 包含一定的數(shù)據(jù)結(jié)構(gòu), 用一個(gè)整數(shù)來代表, 相當(dāng)于文件句柄。 使用
33、上說, 套接字是一個(gè)編程接口。 猶如電器通過電插座,來方便地用電; 程序通過綁定套接字, 來方便地使用網(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ī)。 傳輸層則通過端口為應(yīng)用層的進(jìn)程提供端到端的傳輸服務(wù)。 傳輸層定義了兩個(gè)端到端的協(xié)議。 一個(gè)是傳輸控制協(xié)議 TCP(TransmisControl Protocol ), 這是一個(gè)面向連接的可靠的流的傳輸協(xié)議; 另一個(gè)是用戶數(shù)據(jù)報(bào)協(xié)議 UDP(User Datagr連接的
34、協(xié)議。rotocol), 這是一個(gè)不可靠的、無3.2套接字的分類用戶可使用兩種套接字:流式套接字和數(shù)據(jù)報(bào)套接字。 流式套接字使用傳輸控制協(xié)議(TCP), 數(shù)據(jù)報(bào)套接字使用用戶數(shù)據(jù)報(bào)協(xié)議(UDP)。流式套接字提供可靠的、面向連接的流傳輸服務(wù), 類似于系統(tǒng)。 每次完整的數(shù)據(jù)傳輸都要經(jīng)過建立連接,使用連接, 終止連接的過程。 在數(shù)據(jù)傳輸過, 各數(shù)據(jù)分組不攜帶目的地址, 而使用連接號(hào)(Connection ID)。TCP 協(xié)議提供面向連接的虛電路, 本質(zhì)上, 連接是一個(gè)管道, 數(shù)據(jù)從管道的一端流入, 從另一端流出, 不但順序一致, 而且內(nèi)容相同。 鑒于此, 流式套接字得到越來越廣泛的應(yīng)用, 通常用來做
35、數(shù)據(jù)文件的傳輸, 如 ftp、 net 等, 特別適合于傳輸大批量、有序、無重復(fù)的數(shù)據(jù)。數(shù)據(jù)報(bào)套接字, 提供無連接的數(shù)據(jù)報(bào)傳輸服務(wù), 支持雙向的數(shù)據(jù)流, 數(shù)據(jù)通過相互獨(dú)立的數(shù)據(jù)報(bào)進(jìn)行傳輸,類似于郵政系統(tǒng)。 每個(gè)分組都攜帶完整的目的地址, 各分組在系統(tǒng)中獨(dú)立傳送。 但無連接服務(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)是它保留的邊界, 對于這一特點(diǎn), 數(shù)據(jù)報(bào)套接字采用了與現(xiàn)在
36、許多包交換網(wǎng)絡(luò)非常類似的模型。 數(shù)據(jù)報(bào)套接字方式由于取消了重發(fā)校驗(yàn)機(jī)制, 能夠達(dá)到較高的通訊速率, 可以用作一些對數(shù)據(jù)可靠性要求不高的通訊方面, 例如實(shí)時(shí)的語音、圖像轉(zhuǎn)送和廣播消息等。數(shù)據(jù)報(bào)套接字支持雙向的數(shù)據(jù)流,但并不保證是可靠,有序,無重復(fù)的。也就是說,一個(gè)從數(shù)據(jù)報(bào)套接字接收信息的進(jìn)程有可能發(fā)現(xiàn)信息重復(fù)了,或者和發(fā)出時(shí)的順序不同。數(shù)據(jù)報(bào)套接字是無連接的。因此在層上它適用于 UDP 協(xié)議。數(shù)據(jù)報(bào)套接字的一個(gè)重要特點(diǎn)是它保留了邊界。數(shù)據(jù)報(bào)套接字可以用來向許多系統(tǒng)支持的網(wǎng)絡(luò)發(fā)送廣播數(shù)據(jù)包。要實(shí)現(xiàn)這種功能,網(wǎng)絡(luò)本身必須支持廣播功能,因?yàn)橄到y(tǒng)并不提供對廣播功能的任何模擬。因?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源的地址又沒有任何先驗(yàn)的知識(shí)。2.一些重要的功能,例如路由要求把它們的給所有可以找到的鄰機(jī)。被廣播信息的目的地址取決于這一信息將在何種網(wǎng)絡(luò)上廣播。ernet 域中支持一個(gè)速記地址用于廣播 INADDRBROADCAST。由于使用廣播以前必須一個(gè)數(shù)據(jù)報(bào)套接字,所以所有收到的廣播消息都帶有發(fā)送者的地址和端口。3.3Winsoek 網(wǎng)絡(luò)編程原理通信的基石是套接口,一個(gè)套接口是通信的一端。在這一端上可以找到與其對應(yīng)的一個(gè)名字
38、。一個(gè)正在被使用的套接口都有它的類型和與其相關(guān)的進(jìn)程。套接口存在信域中。通信域是為了處理一般的線程通過套接口通信而引進(jìn)的一種抽象概念。套接口通常和同一個(gè)域中的套接換數(shù)據(jù)(也可能穿越域的界限,但這時(shí)一定要執(zhí)行某種解釋程序)。Windows Sockets 規(guī)范支持單一的通信域,即ernet 域。各種進(jìn)程使用這個(gè)域互相之間用ernet 協(xié)議簇來進(jìn)行通信(WindowsSoekets1.1 以上的版本支持其他的域,例如Windows Soekets2)。套接口可以根據(jù)通信性質(zhì)分類;這種性質(zhì)對于用戶是可見的。應(yīng)用程序一般僅在同一類的套接口間通信。不過只要底層的通信協(xié)議允許,不同類型的套接口間也照樣可以
39、通信。用戶目前可以使用兩種套接口,即流套接口和數(shù)據(jù)報(bào)套接口。流套接口提供了雙向的,有序的,無重復(fù)并且無邊界的數(shù)據(jù)流服務(wù)。數(shù)據(jù)報(bào)套接口支持雙向的數(shù)據(jù)流,但并不保證是可靠,有序,無重復(fù)的。也就是說,一個(gè)從數(shù)據(jù)報(bào)套接口接收信息的進(jìn)程有可能發(fā)現(xiàn)信息重復(fù)了,或者和發(fā)出時(shí)的順序不同。數(shù)據(jù)報(bào)套接口的一個(gè)重要特點(diǎn)是它保留了邊界。對于這一特點(diǎn),數(shù)據(jù)報(bào)套接口采用了與現(xiàn)在許多包交換網(wǎng)絡(luò)(例如以太網(wǎng))非常類似的模型17。流套接字和數(shù)據(jù)報(bào)套接字編程的過程基本類似。由于本程序是基于 UDP 協(xié)議的,所以下面簡單介紹下數(shù)據(jù)報(bào)套接字編程的常用函數(shù):創(chuàng)建套接字:SOCKET socket(aftype,protocol);參數(shù)
40、of 用于指定網(wǎng)絡(luò)地址,一般取 AF INET,表示該套接字在ernet 域中通信。參數(shù)type 用于指定套接字類型,若取 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)為TCP/IP協(xié)議。關(guān)閉套接字:closesocket(SOCKET s);綁定套接:bind(SOCKET s,const struct sockaddr *name,namelen);s 是未套接字的句柄,用來等待客戶機(jī)的連接。name 是
41、賦予套接字的地址,由sockaddr 結(jié)構(gòu)體表示,但由于該結(jié)構(gòu)體的結(jié)構(gòu)隨選擇的協(xié)議的不同而變化,所以通常選用sockaddr in 結(jié)構(gòu)體表示,用來標(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)體的長度。使用
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)體的長度。recvfrom(Socket s,char FAR *buf,F(xiàn)AR* fromlen);len,flags,struct sockaddr FAR*from,參數(shù)意義與sendt。類似,只是由發(fā)送函數(shù)變?yōu)榻邮?/p>
43、函數(shù)。Close()Close()圖 3.2 數(shù)據(jù)報(bào)套接字編程流程圖recvfrom()sendto()服務(wù)應(yīng)答處理服務(wù)請求sendto()服務(wù)請求阻塞,等待客戶數(shù)recvfrom()bind()bind()Socket()Socket()發(fā)送端接收端第四章 UDP 網(wǎng)段掃描器的設(shè)計(jì)4.1CSOCKET 的類中 UDP 協(xié)議相關(guān)函數(shù)簡介VC 中的 CSocket 類提供了 UDP 的實(shí)現(xiàn),在創(chuàng)建套接字的函數(shù) Create 里通過指定套接字類型為SOCK_STREAM,就可以實(shí)現(xiàn) UDP 的傳輸。/創(chuàng)建特定類型的套接字 BOOL Create(UnSocketPort=0,/端口 nSocket
44、Type /套接字類型LPCTSTR lpszSocetAddreULL/IP 地址);SOCK_STREAM:流式套接字,提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯(cuò)、無重復(fù)地發(fā)送,且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限:數(shù)據(jù)被看作是字節(jié)流。無長度限制:文件傳送協(xié)議(FTP)即使用流式套接字19。SOCK_DGRAM:數(shù)據(jù)報(bào)式套接字,提供了一個(gè)無連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序(NFS)使剛數(shù)據(jù)報(bào)式套接字20。/將數(shù)據(jù)寫到某種類型的Socket,發(fā)送到指定的地址 SendTo(const void*lpBuf,/發(fā)送的數(shù)據(jù) n
45、BufLen,/數(shù)據(jù)長度U1NT nHostPort,/目的端口。網(wǎng)絡(luò)文件系統(tǒng)LPCTSTR lpSZHOStAddrenFlags=0/調(diào)用的方法ULL,/目的地址);/接收數(shù)據(jù)ReceiveFrom(void*lpBuf,/接收的數(shù)據(jù) nBufLen,/數(shù)據(jù)長度CString&rSocketAddress,/發(fā)數(shù)據(jù)的機(jī)器IP U&rSocketPort,/端口nFlagS:0/調(diào)用的方法);/收到消息 void OnReceive (nErrorCode/Socket 錯(cuò)誤代碼);這里要注意 OnReceive()函數(shù),由于 CSocket 是基于窗口消息的類,因此,只要套接字上有消息(比
46、如數(shù)據(jù)到達(dá)),就會(huì)調(diào)用 OnReceive()函數(shù)。4.2事件函數(shù)為線程創(chuàng)建函數(shù)為了防止在查詢信息過界面不響應(yīng),例將查詢的代碼放到一個(gè)線程里單獨(dú)實(shí)現(xiàn)。為了控制線程的執(zhí)行,還引入了事件對象Event,下面介紹一下相關(guān)的函數(shù):/創(chuàng)建事件對象 HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventributes,/事件對象繼承屬性BOOL bManualReset,/明確重置類型,如果為 TRUE,則要用 ResetEvent 來重置,否則自動(dòng)重置BOOL bInitialS溯U 處于非觸發(fā)狀態(tài)e,/初始狀態(tài),如果為TRUE,表示初始處于觸發(fā)狀態(tài),LPCTS
47、TR lpName /對象名字);/重置事件,使事件處于非觸發(fā)狀態(tài) BOOL ResetEvent(HANDLE hEvent/事件的句柄);/設(shè)置事件到觸發(fā)狀態(tài) BOOL SetEvent(HANDLE hEvent/事件的句柄);/檢查對象的狀態(tài),如果對象處于非觸發(fā)狀態(tài),則繼續(xù)等待,如果處于觸發(fā)狀態(tài)或者超時(shí),則退出 DWORD WaitForSingleObject(HANDLE hHandle,/對象句柄 DWORD dwMilliseconds /超時(shí)間隔);/創(chuàng)建啟動(dòng)線程CW(hread*AhfxBeghreadAFX_THREROC pfnThreroc,/工作函數(shù)指針LPVOID
48、 pParam,/工作函數(shù)參數(shù)指針nPriority=THRERIORITY MORMAL,/線程優(yōu)先級(jí)UnStackSize=0,/線程的堆大小DWORD dwCreateFlags=0,/明確線程的附加屬性LPSECURlTY_ATTRIBUTES lpSecurityAttrs=NULL/線程的安全屬性);4.3網(wǎng)段掃描器設(shè)計(jì)4.3.1程序主界面UDP 網(wǎng)段掃描器的程序主界面包括設(shè)定 IP 地址,設(shè)定端口,顯示掃描過程和顯示掃描結(jié)果等幾部分,具體見圖 4.1。圖 4.1 程序主界面4.3.2啟動(dòng)掃描在CNBTS/啟動(dòng)掃描BTSDlg:OnBtnSend()中啟動(dòng)掃描,該函數(shù)創(chuàng)建了掃描線程
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)線程AfxBeghread(NbtsThread,this-GetSafeHwnd(),THREAD_PRJORITY_NORMAL)12;4.3.3掃描線程線程函數(shù)主要是向指定范圍的 IP 發(fā)數(shù)據(jù),首先,它向一個(gè) IP 發(fā)數(shù)據(jù),然后利用WaitForSingleObject()等待,直到 CNBTSDlg:OnR
51、eceive()里收到了該 IP 機(jī)器發(fā)回的響應(yīng)信息,觸發(fā)了事件后,線程才繼續(xù)對下一個(gè)IP 發(fā)數(shù)據(jù),如此循環(huán)。/線程函數(shù)UNbtsThread(LPVOID param)/循環(huán)對要查詢的IP 發(fā)數(shù)據(jù)doif(bExit)/是否退出線程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è)要查詢的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è)要查詢的機(jī)器發(fā)回的響應(yīng)信息,從響應(yīng)信息里取出對應(yīng)的機(jī)器工作組、機(jī)器名、用戶名、MAC 地址,然后,觸發(fā)事件導(dǎo)致線程函數(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 為空或者與原來接收到的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)致線程函數(shù)的繼續(xù)執(zhí)行 Set
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考物理總復(fù)習(xí)專題二相互作用實(shí)驗(yàn)二探究彈力和彈簧伸長量的關(guān)系練習(xí)含答案
- 江蘇省2015-2015學(xué)年高中英語 Unit3 Amazing people project教案 牛津譯林版必修2
- 八年級(jí)歷史下冊 第12課 欣欣向榮的科教文體事業(yè)教案 北師大版
- 2024年九年級(jí)語文上冊 第二單元 第6課《敬業(yè)與樂業(yè)》說課稿 新人教版
- 2024-2025學(xué)年高中語文 第二單元 珠星碧月彩云中 4 詞三首(一)教案 語文版必修3
- 2023四年級(jí)數(shù)學(xué)下冊 4 小數(shù)的意義和性質(zhì) 3小數(shù)點(diǎn)移動(dòng)引起小數(shù)大小的變化第2課時(shí) 小數(shù)點(diǎn)移動(dòng)引起小數(shù)大小變化的規(guī)律(2)配套教案 新人教版
- 二年級(jí)語文上冊 課文3 9 黃山奇石教案 新人教版
- 2024-2025學(xué)年新教材高中歷史 第八單元 中華民族的抗日戰(zhàn)爭和人民解放戰(zhàn)爭 第24課 全民族浴血奮戰(zhàn)與抗日戰(zhàn)爭的勝利教案3 新人教版必修《中外歷史綱要(上)》
- 變壓器報(bào)停委托書
- 租房電器超過使用年限合同(2篇)
- 六年級(jí)語文 六年級(jí)班家長會(huì)
- 內(nèi)科學(xué)(腎臟-內(nèi)分泌-血液)知到章節(jié)答案智慧樹2023年溫州醫(yī)科大學(xué)
- 年產(chǎn)10噸功能益生菌凍干粉的工廠設(shè)計(jì)改
- 地理教育測量與評價(jià)
- 2023上海車展展前報(bào)告
- 事業(yè)單位獎(jiǎng)勵(lì)審批表主要事跡
- 中科大天文學(xué)史課件17近代天體測量和天體力學(xué)的發(fā)展
- 六年級(jí)勞動(dòng)與技術(shù)上冊教案
- 馬王堆導(dǎo)引術(shù)獨(dú)立彩圖版
- 小學(xué)一年級(jí)語文上學(xué)期教研活動(dòng)記錄(10次)
- GB/T 31315-2014機(jī)械結(jié)構(gòu)用冷拔或冷軋精密焊接鋼管
評論
0/150
提交評論