日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机网络端口扫描

發布時間:2024/8/1 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机网络端口扫描 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

計算機網絡端口掃描

前言

在網絡信息時代的今天,面向新的需求和挑戰,為了學校的科研、教學、管理的技術水平,為研究開發和培養高層次人才建立現代化平臺,Intranet/Internet 技術的高速多媒體校園網。
整個高速多媒體校園網建設原則是"經濟高效、領先實惠",既要領先一步,具有發展余地,又要比較實惠。校園網是集計算機技術、網絡技術、多媒體技術于一體的系統,能夠最大限度地調動學生對教學內容的參與性以及積極性。
網絡教學平臺是以互聯網為基礎,為網絡教學提供服務的 軟件系統.完整的網絡教學平臺包括課程開發系統、教學管理系統以及網上教學支持系統。 隨著計算機網絡技術的發展,網絡教學平臺不斷變化,更好地服務于教學。早期的網絡教學主要是點播式的教學平臺,教學內容顯示在教學平臺上,學生可以根據自己的需要,不受時間和空間的限制,進行教學視頻課件、電子教案等的點播,并且一般在網絡上完成作業。它以課件為中心,需要 管理 者做好教學資源的管理。之后發展為交互式的教學平臺,它可以提供虛擬的教室系統、會議系統、聊天工具以及討論系統等,教師可以與學生進行線上互動。學生在線學習課程,討論或者提出自己的問題,進行自我測試等,它以學生為中心,可以提供有效的學習服務。隨著現代教育的發展, 社會化教學平臺提供了新的教學資源 , 社會化教學平臺主要利用社會化軟件,建立起學生的學習網絡,進行集體的分享和創造, 注重學習的社會化
一個簡單的端口掃描器,它通過與目標主機TCP/IP端口建立連接并請求某些服務,記錄目標主機的應答,分析目標主機相關信息,從而發現目標主機某些內在的安全弱點。掃描器通常分兩類:漏洞掃描器和端口掃描器。端口掃描器用來掃描目標機開放的服務端口以及端口相關信息,漏洞掃描器檢查目標中可能包含的大量已知的漏洞,如果發現潛在的漏洞可能性,就報告給掃描者。本文就端口掃描器的基本理論進行展開的詳細闡述。

目錄
1掃描器概述 5
2端口掃描器功能簡介 6
3 TCP簡介 6
3.1概述 6
3.2報文格式 8
4 常用端口掃描技術 9
4.1 TCP connect()掃描 9
4.2 TCP SYN掃描 11
4.3 TCP FIN 掃描 11
4.4 IP段掃描 11
4.5 TCP反向 ident掃描 12
4.6 FTP 返回攻擊 12
5 算法設計與實現 12
5.1 基本函數 12
5.2 主要數據結構及主要函數說明 14
5.3用戶使用手冊 15
5.4項目分析 15
6 收獲和體會 17
7 參考文獻 17
附錄 源程序代碼文件說明 18

課程設計任務書

1.使學生進一步鞏固課堂學習內容,進一步了解計算機網絡構成及配置細節,掌握計算機網絡的基本理論和實踐操作技能,提高學生的系統配置、平臺搭建、網絡組網以及完成特定的技術實現的能力。
2.分析、設計和端口掃描。具體實現以下功能:
(1)實現一個掃描器,必須能夠完成以下所有功能:使用 TCP connect 、 TCP SYN 和 TCP FIN 進行端口掃描。
(2)使用 ICMP echo 掃描實現 IP 掃描。并把掃描得知的結果記錄下來。
3.提交成果:
(1)課程設計報告;

指導教師(簽名):

1掃描器概述

一個簡單的端口掃描器,它通過與目標主機TCP/IP端口建立連接并請求某些服務,記錄目標主機的應答,分析目標主機相關信息,從而發現目標主機某些內在的安全弱點。掃描器通常分兩類:漏洞掃描器和端口掃描器。端口掃描器用來掃描目標機開放的服務端口以及端口相關信息,漏洞掃描器檢查目標中可能包含的大量已知的漏洞,如果發現潛在的漏洞可能性,就報告給掃描者。
網絡漏洞端口掃描器對目標系統進行檢測時,首先探測目標系統的存活主機,對存活主機進行端口掃描,確定系統開放的端口,然后掃描器對開放的端口進行網絡服務類型的識別,確定其提供的網絡服務。漏洞掃描器根據目標系統的操作系統平臺和提供的網絡服務,調用漏洞資料庫中已知的各種漏洞進行逐一檢測,通過對探測響應數據包的分析判斷是否存在漏洞。在分析總結目前現有的掃描軟件,掌握掃描器的原理基礎上,首先設計、實現一種端口掃描程序,存儲掃描結果。突然回體和土壤和肉體和肉體和認同突然間肉湯截圖軟件他家人
服務器可以向外提供多種服務,一臺服務器可以同時提供很多的服務呢其中一個很主要的原因,就是各種服務采用不同的端口分別提供不同的服務。 根據提供服務類型的不同,端口分為兩種,一種是tcp端口,一種是udp端口。計算機之間相互通信的時候,分為兩種方式:一種是發送信息以后,可以確認信息是否到達,也就是有應答的方式,這種方式大多采用tcp協議;一種是發送以后就不管了,不去確認信息是否到達,這種方式大多采用udp協議。對應這兩種協議服務提供的端口,也就分為tcp端口和udp端口。那么,如果攻擊者使用軟件掃描目標計算機,得到目標計算機打開的端口,也就了解了目標計算機提供了那些服務。
計算機信息網絡的發展加速了信息化時代的進程,但是隨著社會網絡化程度的增加,對計算機網絡的依賴也越來越大,網絡安全問題也日益明顯,端口掃描技術是發現安全問題的重要手段之一。一個端口就是一個潛在的通信通道,也就是一個入侵通道。網絡安全從其本質來講就是網絡上信息安全,它涉及的領域相當廣泛,這是因為目前的公用通信網絡中存在著各式各樣的安全漏洞和威脅。對目標計算機進行端口掃描,能得到許多有用的信息。掃描器通過選用遠程TCP/IP不同的端口的服務,并記錄目標給予的回答,通過這種方法,可以搜集到很多關于目標主機的各種有用的信息,從而發現目標機的某些內在的弱點。高房價和人體肌肉調節人體肌肉體積突然間天然乳膠如同家人團聚天然乳膠突然就讓他調節人體
交通集團
集團然后加入天涯會讓他突然就突然就突然進入調節人體肌肉
2端口掃描器功能簡介
端口分為源端口和目的端口,源端口是本機打開的,目的端口是在和本機通信的另一臺計算機的端口。端口是由計算機的通信協議TCP/IP協議定義的。其中規定,用IP地址和端口作為套接字,它代表TCP連接的一個連接端,一般稱為Socket。具體來說,就是用IP端口來定位一臺主機中的進程。可以做這樣的比喻,端口相當于兩臺計算機進程間的大門,可以隨便定義,其目的只是為了讓兩臺計算機能夠找到對方的進程。計算機就像一座大樓,這個大樓有好多入口(端口),進到不同的入口中就可以找到不同的公司(進程)。如果要和遠程主機A的程序通信,那么只要把數據發向A端口就可以實現通信了。可見,端口與進程是一一對應的,如果某個進程正在等待連接,稱之為該進程正在監聽,那么就會出現與它相對應的端口。由此可見,通過掃描端口,便可以判斷出目標計算機有哪些通信進程正在等待連接。服務器上所開放的端口就是潛在的通信通道,也就是一個入侵通道。對目標計算機進行端口掃描[5],能得到許多有用的信息,進行端口掃描的方法很多,可以是手工進行掃描、也可以用端口掃描軟件進行。
掃描器通過選用遠程TCP/IP不同的端口的服務,并記錄目標給予的回答,通過這種方法可以搜集到很多關于目標主機的各種有用的信息,例如遠程系統是否支持匿名登陸、是否存在可寫的FTP目錄、是否開放TELNET服務和HTTPD服務等。
意圖哭越痛苦與痛苦優衣庫口語酷酷酷愉快u又哭又痛苦同意開題有空調遙結合臺燃放工會結果如何讓他忽然太皇太后提貨人挺好挺好挺好讓他合同他會
3 TCP簡介
3.1概述
TCP協議為面向連接、可靠的、基于字節流的通信協議,其在通信中要實現三次握手連接,我們可以通過向目標主機發送連接請求的方式來確定目標主機是否存活。當然實現TCP掃描的方式有很多種,例如:簡單的端口掃描(即:逐一測試主機存活),多線程connect掃描,半開發式的SYN掃描。和個人呵呵如何如何
TCP SYN 掃描是使用最為廣泛的掃描方式,其原理就是向待掃描端口發送SYN 數據包,如果能夠收到SYN+ACK 數據包,則代表此端口開放,如收到RST數據包,則證明此端口關閉,如未收到任何數據包,且確定該主機存在,則證明該端口被防火墻等安全設備過濾。由于SYN掃描并不會完成TCP連接的三次握手過程,所以SYN 掃描又叫做半開放掃描。SYN 掃描的最大優點就是速度,在Internet上,如果不存在防火墻,SYN掃描每秒鐘可以掃描數千個端口,但是SYN 掃描由于其掃描行為較為明顯,容易被入侵檢測系統發現,也容易被防火墻屏蔽,且構造原始數據包需要較高系統權限。 隔熱隔熱隔熱隔熱隔熱隔熱隔熱隔熱Greg熱
Connect掃描也叫做全連接方式的掃描,他完成TCP連接三次握手的整個過程,當然他的掃描原理也是利用測試連接目標主機的端口號是否處于監聽狀態,如果處于監聽狀態就會接收到目標主機發回來的回應包,就可以知道目標主機該端口是否開發。郵件回復他九月九日他會突然和他忽然她和他和他任何人容忍他
Transmission Control Protocol (傳輸控制協議),簡稱TCP,是面向連接的、可靠的、基于字節流的通信協議,它位于運輸層(Transport layer)中。在簡化的OSI計算機網絡模型中,它負責完成第四層(傳輸層)所指定的功能,UDP則為同一層內另一個重要的傳輸協議。很艱苦愉快愉快愉快欲哭也可以根據
涉及到TCP掃描,我們就有必要分析一下TCP與UDP之間的聯系與區別。
TCP是基于連接的協議,在正式收發數據之前,必須首先和對方建立可靠的連接。一個TCP連接要通過三次“對話”機制才可以建立起來,其過程十分復雜。TCP的目的是提供可靠數據傳輸,并且在相互進行通信的服務或設備之間保持一個虛擬連接。在數據包接收丟失、無序或交付期間被破壞時,TCP負責數據恢復的工作,即通過為其發送的每個數據包提供一個序號來完成恢復工作。戶籍科天
UDP(User Data Protocol),即是用戶數據報協議,是與TCP相對應的協議。它是面向非連接的,通信時它不是與對方建立連接,而是直接把數據包發送過去。UDP適用的應用環境是每次只傳送少量數據且對可靠性要求不高的環境。例如,使用“PING”命令來探測兩臺主機之間TCP/IP通信是否正常,實際上“PING”命令原理就是向對方主機發送UDP數據包,等待對方主機確認收到數據包,若數據包是否到達的消息可以及時反饋回來,那么這個網絡就是通的。以上充分說明了UDP協議是面向非連接的,沒有建立連接的。正因為如此,所以它的通信效率高;但也正因為如此,它的可靠性比TCP協議低。銀行借款天宇集團以及一條具有有
connect掃描原理,掃描主機通過TCP/IP協議的三次握手與目標主機的指定端口建立一次完整的連接,如果目標主機對該端口有回復,則說明該端口開放。利用多線程技術實現了對單個目標IP進行設定數目的端口掃描,對多IP段的特定端口進行掃描。此外,還利用委托技術實現對界面元素的刷新。②SYN掃描,也叫半開發式掃描,應用發送TCP的SYN請求包(指定端口),當對方收到SYN請求時,并且該端口打開時就會發送回應包:ACK =1,SYN =1, 這樣就可以知道對方主機開發了哪些端口。

retgreghergergeryh然后個員工和任何人和任何如何如何和任何人好熱好熱和任何人和任何如何如何熱火個任何人和任何反對和任天堂就如同他和特會讓她好帖好帖和肉體和任何人提及而和人家讓他話題兒童和讓他

3.2報文格式

CP源端口(Source Port)號是16位,用于標識主機上面傳送的應用程序;目的端口(Destination Port)是16位,定義傳輸目的。該端口指明接收方計算機上的應用接口。源端端口號和目的端的端口號,用來尋找發端與收端應用進程。這兩個數值加上IP首部中的源端IP地址和目的端IP地址可以唯一確定一個TCP連接。一個I P地址與一個端口號有些時候也稱為插口(socket),插口對(socket pair)(包含客戶端口號、客戶IP地址、服務器 IP地址與服務器端口號的四元組 )可以唯一確定互聯網絡中的每個TCP連接的雙方。同樣,IP+TCP端口可以唯一確定一個TCP連接。一條具有調節太原街太原街太原街太原街他以及他今天已
序號字段(Sequence Number):該字段占32比特。用來標識TCP源端設備發送的字節流,表示在這個報文段中的第幾個數據字節。將遺體將于今天已經郵件
確認號字段(Acknowledge Number):該字段占32比特。TCP使用32位的確認號字段表示期望收到的下一個字段的第一個字節,聲明在此之前的所有數據已經正確無誤地被接收到了,所以,確認號應當是上次已經成功接收到的數據字節序列加1。只有ACK標志為1時,確認號字段才有效。和今天已經好幾天已經同意
數據偏移(Data Offset):該字段包括TCP頭大小,為4位字段。因為首部可能含有選項內容,所以首部長度不可確定。首部長度的單位是32比特或者4個八位組。實際上也表明了數據區在報文段中的起始偏移值。與家庭教育投入教育以
預留(Reserved):由跟在數據偏移字段后的6位組成,預留位通常為0字段。
控制位(Control Bits):6位置0的字段,用作將來定義新的用途。
SYN: 標志位用來表示建立連接,使連接雙方同步的序列號。若SYN=1且ACK=0,表示該數據包是連接請求,假若SYN=1且ACK=1就表示接受連接。
FIN: 表示發送端已沒有數據需要傳輸,希望釋放該連接。
RST: 其用來復位一個連接。RST標志置位的數據包被稱為復位包。一般情況下,若TCP收到的一個分段明顯不是屬于該主機的任何一個連接,則向遠端發送復位包。u苦呀苦呀口語苦呀苦呀口語哭一哭愉快u苦苦天涯可以統一集團研究于
URG: 是緊急數據標志。假若為1,表示本數據包中包含緊急數據,緊急數據指針有效。苦苦有酷酷酷也可與哭一哭與苦又酷酷酷酷u烤魚烤魚烤魚u烤魚烤魚
ACK: 是確認標志位。假若為1,表示包中的確認號是有效的。否則,包中確認號無效。i空間里留言路口與苦與樂泰禾集團然后突然回頭如火如荼何讓他忽
PSH: 假若置位,接收端應該盡快把數據傳送給應用層。

4 常用端口掃描技術

4.1 TCP connect()掃描
這是最基本的TCP掃描,操作系統提供的connect()系統調用可以用來與每一個感興趣的目標計算機的端口進行連接。如果端口處于偵聽狀態,那么connect()就能成功。否則,這個端口是不能用的,即沒有提供服務。這個技術的一個最大的優點是,你不需要任何權限。優點:穩定可靠,不需要特殊的權限。系統中的任何用戶都有權利使用這個調用。另一個好處就是速度快。如果對每個目標端口以線性的方式,使用單獨的connects調用,那么將花費相當長的時間,你可以通過同時打開多個套接字,從而加速掃描。缺點是掃描方式不隱蔽。韓國美國海軍
下面是TCP connect()掃描具體實現方式:就已經投影機投影機投影機天涯
①設置一個全局變量看是否有其他掃描器已經開啟或者本身已經開始掃描了,如果已經開始掃描了不做任何處理,如果沒開始掃描或者掃描已經結束的話那么就可以進行掃描。 已經很感激肉體和投入和突然回頭拖孩特人特人和肉體和
②從界面中獲取相關的IP號和起始端口號,以便下面的掃描填寫參數。主要利用的函數為:恒天然恒天然恒天然和肉體和讓他和肉體和突然回頭然后讓他和
GetWindowsText(&PORT);Getaddress(IP);
將PORT轉化為int類型;合同和肉體和談話人體如火如荼和肉體和人他和肉體
③判斷用戶選擇了哪項功能。當用戶選擇一個功能時,那么就對變量m_funtion進行賦值,利用一個switch來判斷,用戶選擇了哪項功能,然后完成相應的功能,如果用戶沒有選擇那么就顯示“you do not select any funtion”提醒用戶選擇功能。(如果用戶選擇了connect,進行以下程序)就要看與恐懼統一口
④判斷端口號是否小于1或者大于65535,因為系統所能開發的端口號是在1-65535之間所以要進行錯誤判斷。風格的恢復鬼畫符和然后突然和肉體和和
⑤因為每一個線程都共用了一個int seq變量,所以創建線程互斥量,不讓線程在進行同步的時候,seq出現錯誤。央行將于今天已經同意給予推薦研究院一條
⑥為每一個connect創建一個線程,將端口號和IP地址傳到線程中去,利用結構體information_des來傳遞,因為線程傳遞參數的時候不能直接傳遞多個參數只能傳遞一個結構體。和就業機會繞太陽和肉體和他任何人他和肉體和讓他他會
⑦線程內部:獲得主窗口的指針為將信息輸出在列表控件中用。創建套接字為connet連接用填寫套接字中的IP地址和指定阻塞或非阻塞,連接connet()。
⑧利用select函數判斷連接是否正確,select()有一個int類型的返回值,如果連接失敗,就返回 0,如果連接成功就返回其他值,那么就利用這個返回值來判斷是否連接成功,如果連接成功就說明該IP的該端口是打開的,如果連接不成功就說明該IP的該端口是關閉的,不能連接。將打開的端口的信息輸入到主窗口的列表控件中去。讓用戶知道掃描結果。黃金太陽就要他今天研究研究
⑨結束所有套接字closesocket()函數完成,無論是超時的還是連接成功的都結束套接字讓程序釋放資源。將所有變量清空。果連接成功就返回其他值,那么就利用這個返回值來判斷是否連接成功,如果連接成功就說明該IP的該端口是打開的,如果連接不成功就說明該IP的該端口是關閉的,不能連接。將果連接成功就返回其他值,那么就利用這個返回值來判斷是否連接成功,如果連接成口是打開的,如果連接不成功就說明該IP的該端口是關閉的,不能連接。將果連接成功就返回其他值,那么就利用這個返回值來判斷是否連接。

4.2 TCP SYN掃描
下面是TCP SYN掃描具體實現方式:
①設置一個全局變量看是否有其他掃描器已經開啟或者本身已經開始掃描了,如果已經開始掃描了不做任何處理,如果沒開始掃描或者掃描已經結束的話那么就可以進行掃描。已經有有有有有有有由于它具有今天又今天研究郵件已經踏入一
②界面中獲取相關的IP號和起始端口號,以便下面的掃描填寫參數。主要利用的函數為:GetWindowsText(&PORT);Getaddress(IP);
③判斷用戶選擇了哪項功能,當用戶選擇一個功能時,那么就對變量m_funtion進行賦值,利用一個switch來判斷,用戶選擇了哪項功能,然后完成相應的功能,如果用戶沒有選擇那么就顯示“you no select any funtion”提醒用戶選擇功能。(如果用戶選擇了SYN進行一下程序);規劃分局云天化集團已經有
④首先獲得要進行掃描的主機的MAC然后填寫TCP包上的目的地址eh_dst上。第二獲得本機的MAC,函數GetHostMAC()然后填寫協議為:0x0800。

4.3 TCP FIN 掃描
有的時候有可能SYN掃描都不夠秘密。一些防火墻和包過濾器會對一些指定的端口進行監視,有的程序能檢測到這些掃描。如果目標主機該端口是“關”狀態,則返回一個TCP RST數據包;否則不回復。根據這一原理可以判斷對方端口是處于“開”還是“關”狀態。相反,FIN數據包可能會沒有任何麻煩的通過。這種掃描方法的思想是關閉的端口會用適當的RST來回復FIN數據包。另一方面,打開的端口會忽略對FIN數據包的回復。FIN 掃描具有較好的隱蔽性,不會留下日志,但是其應用具有很大局限性:由于不同系統實現網絡協議棧的細節不同,FIN 掃描只能掃描Linux/UNIX 系統,如果是Windows 系統,無論端口開放與否都會直接返回RST 數據包,無法對端口狀態進行判斷。
YN掃描又叫做半開發式掃描,他沒有完成TCP連接的三次握手(三次握手在第二章基礎知識部分),當掃描器利用TCP協議向目標主機發送SYN請求信號,目標主機接收到請求信號給予回復,掃描器接收到回復信號后立即釋放,并不再給目標主機發送回應數據包了。這樣就只是完成了三次握手的前兩次就可以完成整個掃描的過程,比起Connect掃描速度更加快捷。但是其實現復雜度要比connect難得很多。研究人員具體研究研究研究佛經研發加油機油加油加油加油研究院

4.4 IP段掃描
這種掃描方式并不是新技術,它并不是直接發送TCP探測數據包,而是將數據包分成兩個較小的IP段。這樣就將一個TCP頭分成好幾個數據包,從而過濾器就很難探測到。但必須小心:一些程序在處理這些小數據包時會有些麻煩。

4.5 TCP反向 ident掃描
ident 協議允許(rfc1413)看到通過TCP連接的任何進程的擁有者的用戶名,即使這個連接不是由這個進程開始的,該服務就會讀取指定TCP連接的查詢數據,將擁有指定TCP連接的用戶信息反饋給對方,。例如掃描者可以連接到http端口,然后用identd來發現服務器是否正在以root權限運行。這種方法只能在和目標端口建立了一個完整的TCP連接后才能看到。要截圖發郵件同意
4.6 FTP 返回攻擊
FTP協議的一個有趣的特點是它支持代理(proxy)FTP連接,即入侵者可以從自己的計算機self.com和目標主機target.com 的FTP server-PI(協議解釋器)連接,建立一個控制通信連接。然后請求這個server-PI激活一個有效的server-DTP(數據傳輸進程)來給Internet上任何地方發送文件。對于一個User-DTP,盡管RFC明確地定義請求一個服務器發送文件到另一個服務器是可以的,但是現在這個方法并不是非常有效。這種方法的優點很明顯,它不容易被追蹤,并可能穿過防火墻。這個協議的缺點是“能用來發送不能跟蹤的郵件和新聞,給許多服務器造成打擊,用盡磁盤,企圖越過防火墻”。已經有他今天已經同意

5 算法設計與實現

5.1 基本函數
(1)測試主機某個端口是否打開的函數 TestConnection ():
BOOL CMyDlg::TestConnection(CString IP,UINT nPort)
{ CSocket* pSocket; pSocket=new CSocket;
ASSERT(pSocket);
if (!pSocket->Create())
{ delete pSocket; pSocket=NULL; return false;
}
while (!pSocket->Connect(IP,nPort))
{ delete pSocket; pSocket=NULL; return false;
}
pSocket->Close();
delete pSocket;
return true;
}
(2)響應單選按鈕“掃描單個端口”和“掃描多個端口”的單擊消息:
void CMyDlg::OnRadio1Single()
{ m_bSinglePort=true;
m_cSinglePort.EnableWindow();
m_cPortFrom.EnableWindow(false);
m_cPortTo.EnableWindow(false);
m_cBtnStop.EnableWindow(false);
}
void CMyDlg::OnRadio2Range()
{ m_bSinglePort=false;
m_cSinglePort.EnableWindow(false);
m_cPortFrom.EnableWindow();
m_cPortTo.EnableWindow();
m_cBtnStop.EnableWindow(false);
}
(3)顯示列表框標題欄的成員函數:
//增加列表框標題欄的某一列
BOOLCMyDlg::AddColumn(LPCTSTR strItem,int nItem,int nSubItem,int nMask,int nFmt)
{ LV_COLUMN lvc;
lvc.mask=nMask;
lvc.fmt=nFmt;
lvc.pszText=(LPTSTR) strItem;
lvc.cx=m_cResult.GetStringWidth(lvc.pszText)+25;

if(nMask&LVCF_SUBITEM)
{ if(nSubItem!=-1) lvc.iSubItem=nSubItem;
else
lvc.iSubItem=nItem;
}
return m_cResult.InsertColumn(nItem,&lvc);
}
//在列表框中加一條
BOOL CMyDlg::AddItem(int nItem,int nSubItem,LPCTSTR strItem ,int nImageIndex)
{ LV_ITEM lvItem; lvItem.mask=LVIF_TEXT; lvItem.iItem=nItem;
lvItem.iSubItem=nSubItem;
lvItem.pszText=(LPTSTR)strItem;
if(nImageIndex!=-1)
{ lvItem.mask|=LVIF_IMAGE; lvItem.iImage|=LVIF_IMAGE;
}
if(nSubItem==0)
return m_cResult.InsertItem(&lvItem);
return m_cResult.SetItem(&lvItem);
}
//加一列標題欄字符
void CMyDlg::AddHeader(LPTSTR hdr)
{ if (m_pColumns)
m_pColumns->AddTail(hdr);
}
//顯示列表框標題欄

void CMyDlg::ShowHeaders()
{ int nIndex=0;
POSITION pos=m_pColumns->GetHeadPosition();
while(pos)
{CString hdr=(CString)m_pColumns->GetNext(pos); AddColumn(hdr,nIndex++);
}
}
(4)“掃描”,“停止”,“保存”按鈕,見附錄程序。

5.2 主要數據結構及主要函數說明

(1)測試主機某個端口是否打開—— TestConnection 函數;
(2)“掃描結果”標題欄成員函數—— AddHeader,AddColumn,ShowHeaders;在列表框中添加字符串的函數—— AddItem;
(3)掃 描 單 個 或 多 個 端 口 的 單 選 按 鈕 — — OnRadioSingle() 和OnRadioRange();家用投影機投影機投影機一天已經同意給予天津條約有
(4)掃描”“,停止”,“保存”按鈕——“ OnButton1Start() ,OnButton2Stop() , OnButton3Save() ;集團研今天已經有他今天已經同意就已經天涯吉他

5.3用戶使用手冊
輸入要掃描的主機 IP 地址,選擇“掃描單個端口”或“掃描多個端口” ,若選擇前者,則輸入單個端口號;若選擇后者,則輸入端口范圍。再輸入掃描次數(默認值為 1),單擊“掃描”按鈕,掃描結果列表框中將會顯示所輸入端口的掃描結果。單擊“停止”時停在那一刻的狀態,并顯示已掃描的結果。單擊“保存”時,可將結果保存在文本文件中。房管局恢復工具如果房價已經有條件

5.4項目分析

掃描單個端口的結果:

掃描多個端口:

通過觀察,主機 IP 為 10.5.104.36 的 25 號端口是打開的。

6 收獲和體會

通過這次實驗, 加深了對端口的理解, 也對 socket 編程有了進一步的認識。實驗中遇到許多函數和定義需要上網查閱資料, 而且調試的過程也比較困難, 需要向同學請教。所以,今后在編程和查閱資料方面的能力有待于進一步去提高。
計算機網絡,是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。
針對于此,有關計算機網絡端口掃描的基礎知識、基本理論、基本方法和結構體系,我都基本掌握了,但這些似乎只是紙上談兵,倘若將這些理論性極強的東西搬上實際上應用,那我想我肯定會是無從下手,一竅不通。自認為已經掌握了一定的計算機網絡理論知識在這里只能成為空談。于是在堅信“實踐是檢驗真理的唯一標準”下,認為只有把從書本上學到的理論應用于實際的網絡端口掃描設計操作中去,才能真正掌握這門知識。
從抽象的理論回到了豐富的實踐創造,細致的了解了端口掃描的全過程,認真學習了各種配置方法,并掌握了利用虛擬環境配置的方法,我利用此次難得的機會,努力完成實驗,嚴格要求自己,認真學習計算機網絡端口掃描的基礎理論,利用空余時間認真學習一些課本內容以外的相關知識,掌握了一些基本的實踐技能。
課程設計是培養我們綜合運用所學知識,發現、提出、分析、解決問題的一個過程,是對我們所學知識及綜合能力的一次考察。隨著科學技術日新月異的不斷發展,計算機網絡也在不斷的變化發展當中,這就要求我們用相應的知識來武裝自己,夯實基礎,為將來走向工作崗位,貢獻社會做好充分的準備。

7 參考文獻

[1]付欣. 計算機網絡中端口掃描技術研究[J]. 硅谷, 2013, 000(019):41-42.
[2]李松源. 計算機網絡中端口掃描技術初步研究[J]. 華章, 2013, 000(017):309-309.
[3]程鹢, 董小國. 端口掃描技術及檢測[J]. 金融科技時代, 2004, 12(007):109-112.
[4]梁劍非. 多線程端口掃描軟件設計與實現[D]. 電子科技大學.
[5]蔡啟先. TCP SYN端口掃描的研究[J]. 廣西工學院學報, 2002(1):25-27.
[6]肖微. 端口掃描技術的原理及應用[J]. 網絡安全技術與應用, 2006.

附錄 源程序代碼文件說明:

(1)端口掃描 Dlg.h :
#if !defined(AFX_DLG_H__37F5060C_6D8B_42F0_90D9_FBA754BAD52B__INCLUDED_)
#define AFX_DLG_H__37F5060C_6D8B_42F0_90D9_FBA754BAD52B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <afxsock.h>
//掃描結果
typedef struct
{ int nAttempts;
TCHAR IPAddress[16];
TCHAR port[5];
BOOL bStatus; //1 = open , 0 = close
}DATA;
// CMyDlg dialog
class CMyDlg : public CDialog
{// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data
//{{AFX_DATA(CMyDlg)
enum { IDD = IDD_MY_DIALOG };
CProgressCtrl m_cProgress;
CListCtrl m_cResult;
CIPAddressCtrl m_cIP;
CEdit m_cAttempts;
CEdit m_cPortTo;
CEdit m_cPortFrom;
CEdit m_cSinglePort;
CButton m_cBtnStop;
CButton m_cBtnScan;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
BOOL TestConnection(CString IP, UINT nPort);// 測試主機某個端口是否打開
void ShowHeaders(void);// 顯示列表框標題欄
void AddHeader(LPTSTR hdr);// 增加一列標題欄字符
AddItem(int nItem,int nSubItem,LPCTSTR strItem,int nImageIndex=-1);// 向m_cResult 輸出一個結果
//向輸出結構列表控件增加一列
BOOL AddColumn(LPCTSTR strItem,int nItem,int nSubItem=-1,
int nMask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM, int nFmt=LVCFMT_LEFT);
// 變量
UINT m_nMaxAttempts; // 試圖連接次數的最大值
BOOL m_bSinglePort; // 是否只掃描單個端口
UINT m_minPort,m_maxPort; // 掃描端口的范圍
UINT m_nCounter; // 端口的個數
CStringList* m_pColumns; // 列表框標題欄
CPtrList* m_pStatusList;// 保存掃描結果的鏈表
//Generated message map functions //{{AFX_MSG(CMyDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnButton1Start();
afx_msg void OnButton2Stop();
afx_msg void OnButton3Save();
afx_msg void OnRadio1Single();
afx_msg void OnRadio2Range();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_DLG_H__37F5060C_6D8B_42F0_90D9_FBA754BAD52B__INCLUDED_)

(2)端口掃描 Dlg.cpp :

#include"stdafx.h"
#include" 端口掃描 .h"
#include" 端口掃描 Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = FILE;
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{ public: CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
//ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

//Implementation protected:
//{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//No message handlers //}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /=NULL/)
: CDialog(CMyDlg::IDD, pParent)// 在對話框的構造函數中初始化成員變量
{
//{{AFX_DATA_INIT(CMyDlg)
//}}AFX_DATA_INIT
//Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pColumns=new CStringList;
ASSERT(m_pColumns);
m_bSinglePort=true;
m_nMaxAttempts=1;
m_pStatusList=new CPtrList;

ASSERT(m_pStatusList);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)

{ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_PROGRESS1, m_cProgress);
DDX_Control(pDX, IDC_LIST1, m_cResult);
DDX_Control(pDX, IDC_IPADDRESS1, m_cIP);
DDX_Control(pDX, IDC_EDIT4_ATTEMPTS, m_cAttempts);
DDX_Control(pDX, IDC_EDIT3_SINGLE_PORT_TO, m_cPortTo);
DDX_Control(pDX, IDC_EDIT2_SINGLE_PORT_FROM, m_cPortFrom);
DDX_Control(pDX, IDC_EDIT1_SINGLE_PORT, m_cSinglePort);
DDX_Control(pDX, IDC_BUTTON2_STOP, m_cBtnStop);
DDX_Control(pDX, IDC_BUTTON1_START, m_cBtnScan);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1_START, OnButton1Start)
ON_BN_CLICKED(IDC_BUTTON2_STOP, OnButton2Stop)
ON_BN_CLICKED(IDC_BUTTON3_SAVE, OnButton3Save)
ON_BN_CLICKED(IDC_RADIO1_SINGLE, OnRadio1Single)
ON_BN_CLICKED(IDC_RADIO2_RANGE, OnRadio2Range)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CMyDlg message handlers
BOOL CMyDlg::OnInitDialog()// 設置按鈕的初始狀態和列表框的風格
{
CDialog::OnInitDialog();
//Add “About…” menu item to system menu.
//IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
//Set the icon for this dialog. The framework does this automatically
//when the application’s main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//TODO: Add extra initialization here
//給列表框加標題欄
AddHeader(_T("IP 地址 “)); // 加一列標題欄字符
AddHeader(_T(” 端口號 “));
AddHeader(_T(” 端口狀態 “));
AddHeader(_T(” 嘗試連接次數 “));
AddHeader(_T(” 標記 "));
ShowHeaders();
//設置掃描單個端口
CheckRadioButton(IDC_RADIO1_SINGLE,IDC_RADIO2_RANGE,IDC_RADIO1_SINGLE);
//設置控件的默認狀態
m_cSinglePort.EnableWindow();
m_cPortFrom.EnableWindow(false);
m_cPortTo.EnableWindow(false);
m_cBtnStop.EnableWindow(false);
m_cAttempts.SetWindowText(_T(“1”));
return TRUE; // return TRUE unless you set the focus to a control
}
void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{ CDialog::OnSysCommand(nID, lParam);
}

}
//If you add a minimize button to your dialog, you will need the code below
//to draw the icon. For MFC applications using the document/view model,
//this is automatically done for you by the framework.
void CMyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
//Draw the icon dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//The system calls this to obtain the cursor to display while the user drags
//the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{ return (HCURSOR) m_hIcon;
}
void CMyDlg::OnButton1Start() // “掃描”按鈕
{ // TODO: Add your control notification handler code here CString btnTxt,IP;
UINT nSinglePort;
BYTE f1,f2,f3,f4;
TCHAR temp[10]="\0";
m_cProgress.SetPos(0);
m_cResult.DeleteAllItems();
POSITION p=m_pStatusList->GetHeadPosition();
while§
{
POSITION temp=p;
DATA* pNode=(DATA*)m_pStatusList->GetNext§;
m_pStatusList->RemoveAt(temp);
if (pNode)//pNode!=null
delete pNode;
}
if(m_cIP.IsBlank())
{ MessageBox("請輸入主機 IP 地址 “); return;
}
if(m_cIP.GetAddress(f1,f2,f3,f4)<4) {
MessageBox(” 請輸入有效的 IP 地址 ");
return;
}
IP=_itoa(f1,temp,10);
IP+=_T(’.’);
IP+=_itoa(f2,temp,10);
IP+=_T(’.’);
IP+=_itoa(f3,temp,10);
IP+=_T(’.’);
IP+=_itoa(f4,temp,10);
m_cBtnStop.EnableWindow();
m_cBtnScan.EnableWindow(false);
if(m_bSinglePort)
{ CString port; m_cSinglePort.GetWindowText(port);
m_minPort=m_maxPort=nSinglePort=atoi(port);
} else
{ CString port1,port2; m_cPortFrom.GetWindowText(port1); m_cPortTo.GetWindowText(port2); m_minPort=atoi(port1); m_maxPort=atoi(port2);
m_cProgress.SetRange32(0,m_maxPort-m_minPort+1);
m_cProgress.SetStep(1);
}
if (!m_bSinglePort&&m_maxPort<m_minPort)

MessageBox(_T(" 您輸入的端口范圍有誤 , 請重新輸入 “)); return;
}
UINT m_nMaxAttempts=GetDlgItemInt(IDC_EDIT4_ATTEMPTS); for(m_nCounter=m_minPort;m_nCounter<=m_maxPort;m_nCounter++)
{
BOOL bIsOpen=false;
UINT nAttempt=1;
while(nAttempt<=m_nMaxAttempts && !bIsOpen)
{
TCHAR temp[10]=”\0";
CString str=_T(" 嘗試連接端口: “);
str+=itoa(m_nCounter,temp,10);
str+=_T(”, IP 地址為 =");
str+=IP;
str+=_T(", 嘗試次數為 =");
str+=itoa(nAttempt,temp,10);
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_STATIC_STATUS); pStatic->SetWindowText(str);
str.Empty();
bIsOpen=TestConnection(IP,m_nCounter);
if(bIsOpen)
{
DATA* pNode=new DATA;
ASSERT(pNode);
strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength()));
strcpy(pNode->port,_itoa(m_nCounter,temp,10));
pNode->bStatus = 1; //open
pNode->nAttempts=nAttempt;
m_pStatusList->AddTail(pNode);
}
nAttempt++;
}

if (!bIsOpen)
{
DATA* pNode=new DATA;
ASSERT(pNode);
strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength()));
strcpy(pNode->port,_itoa(m_nCounter,temp,10));
pNode->bStatus=0; //close
pNode->nAttempts=nAttempt-1;
m_pStatusList->AddTail(pNode);
}
MSG message;
if (::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
m_cProgress.StepIt();
}
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_STATIC_STATUS);
pStatic->SetWindowText((CString)_T(" 當前掃描狀態 “));
m_cBtnScan.EnableWindow();
m_cBtnStop.EnableWindow(false);
UINT nIndex=0;
POSITION pos=m_pStatusList->GetHeadPosition();
while(pos)
{ DATA* pNode=(DATA*)m_pStatusList->GetNext(pos); AddItem(nIndex,0,pNode->IPAddress);
AddItem(nIndex,1,pNode->port); if (pNode->bStatus)
{ AddItem(nIndex,2,_T(“Open”));
AddItem(nIndex,4,_T(”"));
}
else
{ AddItem(nIndex,2,_T(“Close”)); AddItem(nIndex,4,_T(" "));
}
AddItem(nIndex++,3,_itoa(pNode->nAttempts,temp,10));
}
}
void CMyDlg::OnButton2Stop() // “停止”按鈕
{ // TODO: Add your control notification handler code here m_nCounter=m_maxPort+1; m_cBtnStop.EnableWindow(false); m_cBtnScan.EnableWindow();
CStatic pStatic=(CStatic*)GetDlgItem(IDC_STATIC_STATUS);
pStatic->SetWindowText((CString)_T(" 當前掃描狀態 "));
}
void CMyDlg::OnButton3Save() // “保存”按鈕
{// TODO: Add your control notification handler code here
CFileDialog* pDlg=new CFileDialog(FALSE,
_T(“txt”),NULL,
OFN_OVERWRITEPROMPT |
OFN_EXPLORER | OFN_LONGNAMES,
_T("Scanned ports files (.txt)"),this);
ASSERT(pDlg);
if (pDlg->DoModal()IDOK)
{
int nHandle,retVal;
nHandle=_open(pDlg->GetPathName(),_O_BINARY|_O_CREAT|_O_TRUNC|_O_RDWR);
if (nHandle-1)
{
MessageBox(_T(“Unable to open output file to write.”),
_T(“Error”),
MB_OK|MB_ICONEXCLAMATION);
delete pDlg;
return;
}
POSITION pos=m_pStatusList->GetHeadPosition();
while(pos)
{
CString buffer;
DATA pNode=(DATA*)m_pStatusList->GetNext(pos);
buffer=pNode->IPAddress;
buffer+=_T(’,’);
buffer+=pNode->port;
buffer+=_T(’,’);

if (pNode->bStatus)
buffer+=_T(“Open”);
else
buffer+=_T(“Close”);
buffer+=_T("\r\n\0");
retVal=_write(nHandle,
(void*)buffer.GetBuffer(buffer.GetLength()),
buffer.GetLength());
if (retVal!=buffer.GetLength())
{
MessageBox(_T(“An error occured while writing records.”),
_T(“Error”),MB_OK | MB_ICONEXCLAMATION);
delete pDlg;
return;
}
buffer.Empty();
_close(nHandle);
}
delete pDlg;
}
void CMyDlg::OnRadio1Single()
{// TODO: Add your control notification handler code here
m_bSinglePort=true;
m_cSinglePort.EnableWindow();
m_cPortFrom.EnableWindow(false);
m_cPortTo.EnableWindow(false);
m_cBtnStop.EnableWindow(false);
}
void CMyDlg::OnRadio2Range()
{ // TODO: Add your control notification handler code here m_bSinglePort=false;
m_cSinglePort.EnableWindow(false);
m_cPortFrom.EnableWindow();
m_cPortTo.EnableWindow();
m_cBtnStop.EnableWindow(false);

}
//測試主機的某個端口是否打開
BOOL CMyDlg::TestConnection(CString IP,UINT nPort)
{ CSocket* pSocket; pSocket=new CSocket; ASSERT(pSocket);
if (!pSocket->Create())
{
delete pSocket;
pSocket=NULL;
return false;
}
while (!pSocket->Connect(IP,nPort))
{
delete pSocket;
pSocket=NULL;
return false;
}
pSocket->Close();
delete pSocket;
return true;
}
//增加列表框標題欄的某一列
BOOLCMyDlg::AddColumn(LPCTSTR strItem,int nItem,int nSubItem,int nMask,int nFmt)
{ LV_COLUMN lvc; lvc.mask=nMask; lvc.fmt=nFmt; lvc.pszText=(LPTSTR) strItem;
lvc.cx=m_cResult.GetStringWidth(lvc.pszText)+25; if(nMask&LVCF_SUBITEM)
{
if(nSubItem!=-1) lvc.iSubItem=nSubItem;
else
lvc.iSubItem=nItem;
}
return m_cResult.InsertColumn(nItem,&lvc);
}
//在列表框中加一條
BOOL CMyDlg::AddItem(int nItem,int nSubItem,LPCTSTR strItem ,int nImageIndex)
{
LV_ITEM lvItem;
lvItem.mask=LVIF_TEXT;
lvItem.iItem=nItem;
lvItem.iSubItem=nSubItem;
lvItem.pszText=(LPTSTR)strItem;
if(nImageIndex!=-1)
{
lvItem.mask|=LVIF_IMAGE;
lvItem.iImage|=LVIF_IMAGE;
}
if(nSubItem==0)
return m_cResult.InsertItem(&lvItem);
return m_cResult.SetItem(&lvItem);
}
//加一列標題欄字符
void CMyDlg::AddHeader(LPTSTR hdr)
{
if (m_pColumns)
m_pColumns->AddTail(hdr);
}
//顯示列表框標題欄
void CMyDlg::ShowHeaders()
{
int nIndex=0;
POSITION pos=m_pColumns->GetHeadPosition();
while(pos)
{
CString hdr=(CString)m_pColumns->GetNext(pos);
AddColumn(hdr,nIndex++);
}
}

總結

以上是生活随笔為你收集整理的计算机网络端口扫描的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。