埠掃瞄小程式與單執行緒多執行緒對比(C 實現)

2021-10-10 16:02:22 字數 3267 閱讀 3156

visual studio 2015中新建乙個工程,選擇windows窗體應用程式。

老師提供了乙個完整的多執行緒版本的埠掃瞄器,於是我就自己寫了乙個單執行緒版本的埠掃瞄器,圖形介面模仿了老師的給出的設計

老師的版本在progerssbox下方還用了三個隱藏的lable來顯示埠號和當前掃瞄的埠,我這裡沒有放。

**如下

using system;

using system.windows.forms;

using system.net.sockets;

private

void

button1_click

(object sender,

eventargs e)

private

void

portscan()

while

(!ok)}}

listbox1.items.

add(

"掃瞄結束!");

}else

}//連線埠

private

void

scan()

catch}}

}

執行效果如下

可以看到是很慢的,我特意只掃瞄了五個埠,花了七秒左右的時間。

執行緒(thread)是程序中的基本執行單元,是作業系統分配cpu時間的基本單位,乙個程序可以包含若干個執行緒,在程序入口執行的第乙個執行緒被視為這個程序的主線程。

多執行緒程式設計的第一步,建立執行緒。建立執行緒其實是增加了乙個控制流程,使得同一程序中存在多個控制流程併發或者並行執行。有時候我們需要多個執行緒相互協作來執行,這時需要執行緒間同步。詳見多執行緒程式設計

建立多執行緒的步驟:

1、編寫執行緒所要執行的方法

2、例項化thread類,並傳入乙個指向執行緒所要執行方法的委託。(這時執行緒已經產生,但還沒有執行)

3、呼叫thread例項的start方法,標記該執行緒可以被cpu執行了,但具體執行時間由cpu決定,詳見c#多執行緒

//建立無參的執行緒

thread thread1 =

newthread

(new

threadstart

(thread1));

//呼叫start方法執行執行緒

thread1.

start()

;

/// 建立無參的方法

///

static

void

thread1()

老師給的**是用老版本的vs寫的,自動生成的** 放在了program.cs裡,使**顯得冗長,我這裡就放各部分核心**展示一下。

這裡有三個隱藏的lable,用來在執行後顯示數字

1、視窗初始化

private

void

lbresult_selectedindexchanged

(object sender,

eventargs e)

[stathread

]static

void

main()

private

void

txtstart_textchanged

(object sender,

system.eventargs e)

private

void

txtend_textchanged

(object sender,

system.eventargs e)

2、button 按鈕 click 事件(建立執行緒,並建立threadstart委託物件)

private

void

btnscan_click

(object sender,

system.eventargs e)

3、執行緒委託物件的無引數方法portscan

private

void

portscan()

//未完成時情況

while

(!ok)

} system.threading.thread.

sleep

(1000);

} lbresult.items.

add(

"掃瞄結束!");

}else

}

4、執行緒委託物件的無參方法scan

private

void

scan()

catch

}

那麼解決辦法之一就是不再捕獲對錯誤執行緒的呼叫,不安全但是比較簡單(主要是我們這個程式簡單,沒那麼容易出安全性問題)

向public form1()中新增一句

checkforillegalcrossthreadcalls =

false

;

this

.invoke

(new

eventhandler

(delegate))

;

運**況如下

可以看到執行起來快了很多。

多執行緒是乙個程式設計師的基本功吧,還要多練習運用。程式設計師應該追求用各種方法優化**。

多執行緒埠掃瞄程式

實現乙個多執行緒埠掃瞄程式 要求 1 能至少掃瞄5個ip位址 2 針對每個ip位址,開設100個執行緒同時對其進行掃瞄 3 如果埠開啟,使用函式getservbyport獲取其服務名,在螢幕上列印 ip port servername,如果是未知服務,則螢幕顯示 ip port unkonown 注...

基於C 實現埠掃瞄器 單執行緒和多執行緒

目錄 新建專案 選擇windows窗體專案應用 net framework 設定專案名和路徑 新建專案如下 設定介面 將tbshow設定為唯讀 雙擊按鈕,編寫其點選事件 using system using system.collections.generic using system.compon...

實現多執行緒埠掃瞄

實驗要求 能至少掃瞄5個ip位址 針對每個ip位址,開設100個執行緒同時對其進行掃瞄 如果埠開啟,使用函式getservbyport獲取其服務名,在螢幕上列印 ip port servername,如果是未知服務,則螢幕顯示 ip port unkonown 實驗環境 red hat 9 thre...