vb.net掃描端口程序 掃描端口命令

用vb.net做串口通訊程序要調(diào)用哪些api函數(shù)?

串口API通信函數(shù)編程

創(chuàng)新互聯(lián)公司專注于焦作企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站制作。焦作網(wǎng)站建設(shè)公司,為焦作等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

16位串口應(yīng)用程序中,使用的16位的Windows API通信函數(shù):

①OpenComm()打開串口資源,并指定輸入、輸出緩沖區(qū)的大?。ㄒ宰止?jié)計)

CloseComm() 關(guān)閉串口;

例:int idComDev;

idComDev = OpenComm("COM1", 1024, 128);

CloseComm(idComDev);

②BuildCommDCB() 、setCommState()填寫設(shè)備控制塊DCB,然后對已打開的串口進行參數(shù)配置; 例:DCB dcb;

BuildCommDCB("COM1:2400,n,8,1", dcb);

SetCommState(dcb);

③ ReadComm 、WriteComm()對串口進行讀寫操作,即數(shù)據(jù)的接收和發(fā)送.

例:char *m_pRecieve; int count;

ReadComm(idComDev,m_pRecieve,count);

Char wr[30]; int count2;

WriteComm(idComDev,wr,count2);

16位下的串口通信程序最大的特點就在于:串口等外部設(shè)備的操作有自己特有的API函數(shù);而32位程序則把串口操作(以及并口等)和文件操作統(tǒng)一起來了,使用類似的操作。

在MFC下的32位串口應(yīng)用程序

32位下串口通信程序可以用兩種方法實現(xiàn):利用ActiveX控件;使用API 通信函數(shù)。

使用ActiveX控件,程序?qū)崿F(xiàn)非常簡單,結(jié)構(gòu)清晰,缺點是欠靈活;使用API 通信函數(shù)的優(yōu)缺點則基本上相反。

使用ActiveX控件:

VC++ 6.0提供的MSComm控件通過串行端口發(fā)送和接收數(shù)據(jù),為應(yīng)用程序提供串行通信功能。使用非常方便,但可惜的是,很少有介紹MSComm控件的資料。

⑴.在當前的Workspace中插入MSComm控件。

Project菜單------Add to Project----Components and Controls-----Registered

ActiveX Controls---選擇Components: Microsoft Communications Control,

version 6.0 插入到當前的Workspace中。

結(jié)果添加了類CMSComm(及相應(yīng)文件:mscomm.h和mscomm.cpp )。

⑵.在MainFrm.h中加入MSComm控件。

protected:

CMSComm m_ComPort;

在Mainfrm.cpp::OnCreare()中:

DWORD style=WS_VISIBLE|WS_CHILD;

if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){

TRACE0("Failed to create OLE Communications Control\n");

return -1; // fail to create

}

⑶.初始化串口

m_ComPort.SetCommPort(1); //選擇COM?

m_ComPort. SetInBufferSize(1024); //設(shè)置輸入緩沖區(qū)的大小,Bytes

m_ComPort. SetOutBufferSize(512); //設(shè)置輸入緩沖區(qū)的大小,Bytes//

if(!m_ComPort.GetPortOpen()) //打開串口

m_ComPort.SetPortOpen(TRUE);

m_ComPort.SetInputMode(1); //設(shè)置輸入方式為二進制方式

m_ComPort.SetSettings("9600,n,8,1"); //設(shè)置波特率等參數(shù)

m_ComPort.SetRThreshold(1); //為1表示有一個字符引發(fā)一個事件

m_ComPort.SetInputLen(0);

⑷.捕捉串口事項。MSComm控件可以采用輪詢或事件驅(qū)動的方法從端口獲取數(shù)據(jù)。我們介紹比較使用的事件驅(qū)動方法:有事件(如接收到數(shù)據(jù))時通知程序。在程序中需要捕獲并處理這些通訊事件。

在MainFrm.h中:

protected:

afx_msg void OnCommMscomm();

DECLARE_EVENTSINK_MAP()

在MainFrm.cpp中:

BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )

ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射ActiveX控件事件

END_EVENTSINK_MAP()

⑸.串口讀寫. 完成讀寫的函數(shù)的確很簡單,GetInput()和SetOutput()就可。兩個函數(shù)的原型是:

VARIANT GetInput();及 void SetOutput(const VARIANT newValue);都要使用VARIANT類型(所有Idispatch::Invoke的參數(shù)和返回值在內(nèi)部都是作為VARIANT對象處理的)。

無論是在PC機讀取上傳數(shù)據(jù)時還是在PC機發(fā)送下行命令時,我們都習(xí)慣于使用字符串的形式(也可以說是數(shù)組形式)。查閱VARIANT文檔知道,可以用BSTR表示字符串,但遺憾的是所有的BSTR都是包含寬字符,即使我們沒有定義_UNICODE_UNICODE也是這樣! WinNT支持寬字符, 而Win95并不支持。為解決上述問題,我們在實際工作中使用CbyteArray,給出相應(yīng)的部分程序如下:

void CMainFrame::OnCommMscomm(){

VARIANT vResponse; int k;

if(m_commCtrl.GetCommEvent()==2) {

k=m_commCtrl.GetInBufferCount(); //接收到的字符數(shù)目

if(k0) {

vResponse=m_commCtrl.GetInput(); //read

SaveData(k,(unsigned char*) vResponse.parray-pvData);

} // 接收到字符,MSComm控件發(fā)送事件 }

。。。。。 // 處理其他MSComm控件

}

void CMainFrame::OnCommSend() {

。。。。。。。。 // 準備需要發(fā)送的命令,放在TxData[]中

CByteArray array;

array.RemoveAll();

array.SetSize(Count);

for(i=0;iCount;i++)

array.SetAt(i, TxData[i]);

m_ComPort.SetOutput(COleVariant(array)); // 發(fā)送數(shù)據(jù) }

二 使用32位的API 通信函數(shù):

⑴.在中MainFrm.cpp定義全局變量

HANDLE hCom; // 準備打開的串口的句柄

HANDLE hCommWatchThread ;//輔助線程的全局函數(shù)

⑵.打開串口,設(shè)置串口

hCom =CreateFile( "COM2", GENERIC_READ | GENERIC_WRITE, // 允許讀寫

0, // 此項必須為0

NULL, // no security attrs

OPEN_EXISTING, //設(shè)置產(chǎn)生方式

FILE_FLAG_OVERLAPPED, // 我們準備使用異步通信

NULL );

我使用了FILE_FLAG_OVERLAPPED結(jié)構(gòu)。這正是使用API實現(xiàn)非阻塞通信的關(guān)鍵所在。

ASSERT(hCom!=INVALID_HANDLE_VALUE); //檢測打開串口操作是否成功

SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//設(shè)置事件驅(qū)動的類型

SetupComm( hCom, 1024,512) ; //設(shè)置輸入、輸出緩沖區(qū)的大小

PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR

| PURGE_RXCLEAR ); //清干凈輸入、輸出緩沖區(qū)

COMMTIMEOUTS CommTimeOuts ; //定義超時結(jié)構(gòu),并填寫該結(jié)構(gòu)

…………

SetCommTimeouts( hCom, CommTimeOuts ) ;//設(shè)置讀寫操作所允許的超時

DCB dcb ; // 定義數(shù)據(jù)控制塊結(jié)構(gòu)

GetCommState(hCom, dcb ) ; //讀串口原來的參數(shù)設(shè)置

dcb.BaudRate =9600; dcb.ByteSize =8; dcb.Parity = NOPARITY;

dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;

SetCommState(hCom, dcb ) ; //串口參數(shù)配置

上述的COMMTIMEOUTS結(jié)構(gòu)和DCB都很重要,實際工作中需要仔細選擇參數(shù)。

⑶啟動一個輔助線程,用于串口事件的處理。

Windows提供了兩種線程,輔助線程和用戶界面線程。輔助線程沒有窗口,所以它沒有自己的消息循環(huán)。但是輔助線程很容易編程,通常也很有用。

在次,我們使用輔助線程。主要用它來監(jiān)視串口狀態(tài),看有無數(shù)據(jù)到達、通信有無錯誤;而主線程則可專心進行數(shù)據(jù)處理、提供友好的用戶界面等重要的工作。

hCommWatchThread=

CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全屬性

0,//初始化線程棧的大小,缺省為與主線程大小相同

(LPTHREAD_START_ROUTINE)CommWatchProc, //線程的全局函數(shù)

GetSafeHwnd(), //此處傳入了主框架的句柄

0, dwThreadID );

ASSERT(hCommWatchThread!=NULL);

⑷為輔助線程寫一個全局函數(shù),主要完成數(shù)據(jù)接收的工作。請注意OVERLAPPED結(jié)構(gòu)的使用,以及怎樣實現(xiàn)了非阻塞通信。

UINT CommWatchProc(HWND hSendWnd){

DWORD dwEvtMask=0 ;

SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要監(jiān)視?

WaitCommEvent( hCom, dwEvtMask, os );// 等待串口通信事件的發(fā)生

檢測返回的dwEvtMask,知道發(fā)生了什么串口事件:

if ((dwEvtMask EV_RXCHAR) == EV_RXCHAR){ // 緩沖區(qū)中有數(shù)據(jù)到達

COMSTAT ComStat ; DWORD dwLength;

ClearCommError(hCom, dwErrorFlags, ComStat ) ;

dwLength = ComStat.cbInQue ; //輸入緩沖區(qū)有多少數(shù)據(jù)?

if (dwLength 0) { BOOL fReadStat ;

fReadStat = ReadFile( hCom, lpBuffer,dwLength, dwBytesRead,READ_OS( npTTYInfo ) ); //讀數(shù)據(jù)

注:我們在CreareFile()時使用了FILE_FLAG_OVERLAPPED,現(xiàn)在ReadFile()也必須使用

LPOVERLAPPED結(jié)構(gòu).否則,函數(shù)會不正確地報告讀操作已完成了.

使用LPOVERLAPPED結(jié)構(gòu), ReadFile()立即返回,不必等待讀操作完成,實現(xiàn)非阻塞

通信.此時, ReadFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.

if (!fReadStat){

if (GetLastError() == ERROR_IO_PENDING){

while(!GetOverlappedResult(hCom,READ_OS( npTTYInfo ), dwBytesRead, TRUE )){

dwError = GetLastError();

if(dwError == ERROR_IO_INCOMPLETE) continue;//緩沖區(qū)數(shù)據(jù)沒有讀完,繼續(xù)

…… ……

::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主線程,串口收到數(shù)據(jù)}

所謂的非阻塞通信,也即異步通信。是指在進行需要花費大量時間的數(shù)據(jù)讀寫操作(不僅僅是指串行通信操作)時,一旦調(diào)用ReadFile()、WriteFile(), 就能立即返回,而讓實際的讀寫操作在后臺運行;相反,如使用阻塞通信,則必須在讀或?qū)懖僮魅客瓿珊蟛拍芊祷?。由于操作可能需要任意長的時間才能完成,于是問題就出現(xiàn)了。

非常阻塞操作還允許讀、寫操作能同時進行(即重疊操作?),在實際工作中非常有用。

要使用非阻塞通信,首先在CreateFile()時必須使用FILE_FLAG_OVERLAPPED;然后在 ReadFile()時lpOverlapped參數(shù)一定不能為NULL,接著檢查函數(shù)調(diào)用的返回值,調(diào)用GetLastError(),看是否返回ERROR_IO_PENDING。如是,最后調(diào)用GetOverlappedResult()返回重疊操作(overlapped operation)的結(jié)果;WriteFile()的使用類似。

⑸.在主線程中發(fā)送下行命令。

BOOL fWriteStat ; char szBuffer[count];

…………//準備好發(fā)送的數(shù)據(jù),放在szBuffer[]中

fWriteStat = WriteFile(hCom, szBuffer, dwBytesToWrite,

dwBytesWritten, WRITE_OS( npTTYInfo ) ); //寫數(shù)據(jù)

//我在CreareFile()時使用了FILE_FLAG_OVERLAPPED,現(xiàn)在WriteFile()也必須使用LPOVERLAPPED結(jié)構(gòu).否則,函數(shù)會不正確地報告寫操作已完成了.

使用LPOVERLAPPED結(jié)構(gòu),WriteFile()立即返回,不必等待寫操作完成,實現(xiàn)非阻塞 通信.此時, WriteFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.

int err=GetLastError();

if (!fWriteStat) {

if(GetLastError() == ERROR_IO_PENDING){

while(!GetOverlappedResult(hCom, WRITE_OS( npTTYInfo ),

dwBytesWritten, TRUE )) {

dwError = GetLastError();

if(dwError == ERROR_IO_INCOMPLETE){// normal result if not finished

dwBytesSent += dwBytesWritten; continue; }

......................

//我使用了多線程技術(shù),在輔助線程中監(jiān)視串口,有數(shù)據(jù)到達時依靠事件驅(qū)動,讀入數(shù)據(jù)并向主線程報告(發(fā)送數(shù)據(jù)在主線程中,相對說來,下行命令的數(shù)據(jù)總是少得多);并且,WaitCommEvent()、ReadFile()、WriteFile()都使用了非阻塞通信技術(shù),依靠重疊(overlapped)讀寫操作,讓串口讀寫操作在后臺運行。

求助高手vb6.0用winsock的TCP/UDP進行端口掃描和一對多通訊的問題怎么解決

Private Sub Form_Load()

'將 LocalPort 屬性設(shè)置為一個整數(shù)。然后調(diào)用 Listen 方法。

tcpServer.LocalPort = 1001

tcpServer.Listen

frmClient.Show '顯示客戶端的窗體。

End Sub

Private Sub tcpServer_ConnectionRequest _

(ByVal requestID As Long)

'檢查控件的 State 屬性是否為關(guān)閉的。如果不是,在接受新的連接之前先關(guān)閉此連接。

If tcpServer.State sckClosed Then

tcpServer.Close

End If

'接受具有 requestID 參數(shù)的連接。

tcpServer.Accept requestID

End Sub

Private Sub txtSendData_Change()

'名為 txtSendData 的 TextBox 控件中

'包含了要發(fā)送的數(shù)據(jù)。當用戶往文本框中鍵入數(shù)據(jù)時,使用 SendData 方法發(fā)送輸入的字符串。

tcpServer.SendData txtSendData.Text

End Sub

Private Sub tcpServer_DataArrival _

(ByVal bytesTotal As Long)

'為進入的數(shù)據(jù)聲明一個變量。

'調(diào)用 GetData 方法,并將數(shù)據(jù)賦予名為 txtOutput的 TextBox 的 Text 屬性。

Dim strData As String

tcpServer.GetData strData

txtOutPut.Text = strData

End Sub

frmClient:

Private Sub Form_Load()

'Winsock 控件的名字為 tcpClient。

'注意:要指定遠程主機,可以使用

' IP 地址(例如:"121.111.1.1"),也可以使用

'計算機的“好聽的名字”如下所示。

tcpClient.RemoteHost = "127.0.0.1"

tcpClient.RemotePort = 1001

End Sub

Private Sub cmdConnect_Click()

'調(diào)用 Connect 方法,初始化連接。

tcpClient.Connect

End Sub

Private Sub txtSend_Change()

tcpClient.SendData txtSend.Text

End Sub

Private Sub tcpClient_DataArrival _

(ByVal bytesTotal As Long)

Dim strData As String

tcpClient.GetData strData

txtOutPut.Text = strData

End Sub

VB6.0 掃描端口

計算機網(wǎng)絡(luò)技術(shù)的日益發(fā)展和普及,為信息共享提供了一條全球性的高速通道,但目前采用的TCP/IP協(xié)議族潛在著安全漏洞,其安全機制并不健全,如何保護企業(yè)內(nèi)部網(wǎng)絡(luò)中的資源及信息不受外部攻擊者肆意破壞或盜竊,是企業(yè)網(wǎng)絡(luò)安全需要解決的重要問題。當我們擔心被黑客攻擊或懷疑電腦被植入木馬時,我們往往求助于防火墻,本系統(tǒng)即通過實時監(jiān)控全部TCP連接的方法來實現(xiàn)防黑客攻擊。同時網(wǎng)絡(luò)管理人員在整個網(wǎng)絡(luò)運行期間,能否實時監(jiān)控聯(lián)網(wǎng)計算機的運行狀態(tài)和操作對網(wǎng)絡(luò)安全具有極其重要的作用.下面就以Visual Basic 6.0作為開發(fā)工具講述兩個主要模塊的設(shè)計和實現(xiàn)。

系統(tǒng)概述

該系統(tǒng)由兩個子系統(tǒng)組成:服務(wù)器端系統(tǒng)和客戶端(工作站)系統(tǒng)。服務(wù)器端系統(tǒng)安裝在網(wǎng)絡(luò)管理人員的計算機上,用于實施各種對聯(lián)網(wǎng)計算機的監(jiān)控操作;客戶端系統(tǒng)安裝在每臺聯(lián)網(wǎng)的計算機上,它運行后以圖標的方式出現(xiàn)在系統(tǒng)任務(wù)欄的提示區(qū)中,不影響工作站的其他操作,只用于響應(yīng)服務(wù)器端的監(jiān)控命令,并根據(jù)服務(wù)的需要,及時采樣工作站的相應(yīng)數(shù)據(jù)返回給服務(wù)器端。該系統(tǒng)的運行環(huán)境可以運行于Win98、Win95或WinNT、Win2000下。在系統(tǒng)的開發(fā)中,引入了WINSOCK通訊控件,除此之外,為較好地實現(xiàn)各項監(jiān)控操作,還用到了幾個API函數(shù)。

系統(tǒng)功能

1、監(jiān)控全部TCP連接:實時監(jiān)控所有服務(wù)器端口的連接情況、及時對異常連接發(fā)出警告并提示用戶刪除異常連接;

2、屏幕監(jiān)控:該功能允許服務(wù)器隨時把被監(jiān)控工作站的屏幕畫面抓取到服務(wù)器中,網(wǎng)絡(luò)管理人員對相應(yīng)工作站所進行的操作一目了然,若發(fā)現(xiàn)有非法操作即可采取發(fā)送警告或強制措施,強迫其停止相應(yīng)操作;

3、對工作站進行鎖機、關(guān)機、限制鼠標活動等;

4、服務(wù)器和工作站之間的信息互送。

功能的實現(xiàn)

1、監(jiān)控全部TCP連接

TCP/IP(Transmission Control Protocol/Internet Protocol:傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)是一個包括TCP、IP、 UDP、ARP、RARP和ICMP等在內(nèi)的網(wǎng)絡(luò)協(xié)議集。TCP/IP經(jīng)常被稱為“將Internet綁定在一起的粘合劑”,它允許在空間上分離的多個信息網(wǎng)絡(luò)連接在一起形成一個巨大的虛擬網(wǎng)絡(luò)。TCP和UDP(用戶數(shù)據(jù)報協(xié)議)是兩個最常用的數(shù)據(jù)傳輸協(xié)議,它們都使用設(shè)置監(jiān)聽端口的方法來完成數(shù)據(jù)傳輸。

在本文中討論TCP連接。通過使用TCP, Internet客戶機可以打開到另一個Internet客戶機的虛擬連接并傳送數(shù)據(jù)流。與UDP不同,TCP協(xié)議通過重傳丟失的數(shù)據(jù)報保證傳輸?shù)目煽啃?。它也保證在接收端的應(yīng)用程序按發(fā)送的順序?qū)⒔邮盏降奈缓妥止?jié)重新組裝起來以獲取完整的數(shù)據(jù)。

要獲得與服務(wù)器系統(tǒng)中全部有效的TCP連接,用到GetTcpTable這個API函數(shù),它定義如下:

Private Declare Function GetTcpTable Lib "iphlpapi.

dll" (ByRef pTcpTable As MIB_TCPTABLE, ByRef

pdwSize As Long, ByVal bOrder As Long) As Long

其中參數(shù)pPcpTable是已生成的 TCP連接表緩沖區(qū)的指針,參數(shù)pdwsize是緩沖區(qū)大小(當緩沖區(qū)不夠大時,該參數(shù)返回實際需要的大小),參數(shù)bOrder指示連接表是否需要按“Local IP”、“Localport”、“Remote IP”、“Remote port”依次進行排序,1為按此順序。

通過一個TIMEER控件的TIMER的事件來比較前后兩個TCP連接表,我們可以立即發(fā)現(xiàn)異常并發(fā)出警告。本系統(tǒng)用聲音和報警標志提醒用戶注意可能的外界入侵。收到警告信號后,我們應(yīng)首先將可疑連接刪除掉,SetTcpEntry函數(shù)可以幫助我們刪除可疑連接。其定義為:

Private Declare Function SetTcpEntry Lib "iphlpapi.

dll" (ByRef pTcpTable As MIB_TCPROW) As Long

其中參數(shù)pTcptable為指向tcp表行的指針。然后將欲刪連接的狀態(tài)置為MIB_TCP_STATE_DELETE_TCB(值為12)即可刪除該連接。

TIMER事件源代碼:

Private Sub Timer1_Timer()

Dim Return1 As Long, i As Long

Dim Tmp1 As Long, Tmp2 As Long

Dim Ip_Buf(1 To 4) As Byte

Dim Win_Path As String, Tmp3 As String

Return1 = GetTcpTable(TCP1, Len(TCP1), 1)

If Last_Num_Of_Entries 0 And _

Last_Num_Of_Entries TCP1.dwNum_Of_Entries Then

'異常時發(fā)出警告

Picture1.Visible = True '警告標志

On Error Resume Next

Win_Path = String(145, 0)

'利用API函數(shù)GetWindowsDirectory獲得當前系統(tǒng)目錄

i = GetWindowsDirectory(Win_Path, 145)

Win_Path = Left(Win_Path, i)

'利用API函數(shù)sndPlaySound發(fā)出報警聲音

i = sndPlaySound(Win_Path + "\Media\Ding.wav", H1)

On Error GoTo 0

Else

If Picture1.Visible = True Then

Picture1.Visible = False

End If

End If

Last_Num_Of_Entries = TCP1.dwNum_Of_Entries

Select Case Return1

Case 0:

Text1 = "": Combo1.Clear

For i = 0 To TCP1.dwNum_Of_Entries - 1

Tmp3 = Str(i + 1) + " "

Select Case TCP1.TCP_Table(i).dwState

' 顯示連接狀態(tài)

Case 1: Tmp3 = Tmp3 + "CLOSED"

Case 2: Tmp3 = Tmp3 + "LISTENING"

Case 3: Tmp3 = Tmp3 + "SYN_SENT"

Case 4: Tmp3 = Tmp3 + "SYN_RCVD"

Case 5: Tmp3 = Tmp3 + "ESTABLISHED"

Case 6: Tmp3 = Tmp3 + "FIN_WAIT1"

Case 7: Tmp3 = Tmp3 + "FIN_WAIT2"

Case 8: Tmp3 = Tmp3 + "CLOSE_WAIT"

Case 9: Tmp3 = Tmp3 + "CLOSING"

Case 10: Tmp3 = Tmp3 + "LAST_ACK"

Case 11: Tmp3 = Tmp3 + "TIME_WAIT"

Case 12: Tmp3 = Tmp3 + "DELETE_TCB"

End Select

Combo1.AddItem Tmp3 ' 填充列表以供用戶刪除

' 本地IP

Tmp3 = Tmp3 + ":" + vbCrLf + vbTab + "Local: "

'CopyMemory為API函數(shù)

CopyMemory Ip_Buf(1), TCP1.TCP_Table(i).dwLocalAddr, 4

Tmp3 = Tmp3 + CStr(Ip_Buf(1)) + "." + _

CStr(Ip_Buf(2)) + "."+ CStr(Ip_Buf(3)) _

+"." + CStr(Ip_Buf(4))

Tmp1 = TCP1.TCP_Table(i).dwLocalPort

' 本地端口

Tmp2 = Tmp1 / 256 + (Tmp1 Mod 256) * 256

' 遠程IP

Tmp3 = Tmp3 + ":" + Str(Tmp2) + vbTab + "Remote: "

CopyMemory Ip_Buf(1), TCP1.TCP_Table(i).dwRemoteAddr, 4

Tmp3 = Tmp3 + CStr(Ip_Buf(1)) + "." + CStr(Ip_Buf(2)) _

+ "."+ CStr(Ip_Buf(3)) + "." + CStr(Ip_Buf(4))

' 遠程端口

Tmp1 = TCP1.TCP_Table(i).dwRemotePort

Tmp2 = Tmp1 / 256 + (Tmp1 Mod 256) * 256

Tmp3 = Tmp3 + ":" + Str(Tmp2) + vbCrLf

Text1 = Text1 + Tmp3

Next i

Case 50:

MsgBox "系統(tǒng)不支持該API函數(shù)": End

Case 87:

MsgBox "無效的參數(shù)": End

Case 111:

MsgBox "緩沖區(qū)溢出": End

Case 232:

MsgBox "無數(shù)據(jù)": End

End Select

End Sub

用于刪除連接的CLICK事件源代碼:

Private Sub delete_Click()

Dim Return1 As Long

If Combo1.ListIndex 0 Then Exit Sub

' 將欲刪連接的狀態(tài)置為值為12

TCP1.TCP_Table(Combo1.ListIndex).dwState = 12

' 執(zhí)行刪除

Return1 = SetTcpEntry(TCP1.TCP_Table(Combo1.ListIndex))

If Return1 = 0 Then

MsgBox "刪除成功"

Else

MsgBox "刪除失敗"

End If

Timer1_Timer

End Sub

2、屏幕監(jiān)控

當服務(wù)器系統(tǒng)發(fā)現(xiàn)TCP異常連接時,可通過屏幕監(jiān)控功能將局域網(wǎng)中被監(jiān)控工作站的屏幕畫面抓取到服務(wù)器中并實施相應(yīng)措施,如對工作站鎖機或關(guān)機等。此處用到WINSOCK控件,其通訊原理請參閱相關(guān)資料,屏幕監(jiān)控功能用到TCP協(xié)議,為了達到更好的效果,可在窗體中加入TIMER控件,設(shè)定TIMER事件。

(1) 工作站端

偵聽并響應(yīng)服務(wù)器端發(fā)出的連接請求和屏幕抓取。其中屏幕抓取功能可通過API函數(shù)實現(xiàn):

Dim a As String

Winsock1.GetData a, vbString

Select Case a

Case "zp"

Picture1.AutoRedraw = True

Picture1.ScaleMode = 1

lDesktop = GetDesktopWindow()

lDC = GetDC(lDesktop)

BitBlt Picture1.hdc, 0, 0, Screen.Width, _

Screen.Height, lDC,0, 0, vbSrcCopy

'獲取圖像數(shù)組

SavePicture Picture1.Image, filename

Winsock1.SendData "okm"

Dim myfile() As Byte

Case "fir" '傳第一塊圖

Open filename For Binary As #1

filelen = LOF(1)

ReDim myfile(1 To blocksize) As Byte

'(const blocksize=3072)

Get #1, , myfile

Winsock1.SendData myfile

curpos = blocksize

Case "next" ‘傳其它塊

If curpos = filelen Then

Winsock1.SendData "end"

Close #1

Exit Sub

End If

j = curpos + blocksize

If j filelen Then

j = filelen - curpos

Else

j = blocksize

End If

ReDim myfile(1 To j) As Byte

Get #1, , myfile

Winsock1.SendData myfile

curpos = curpos + j

End Select

注意:以上功能在WINSOCK的DataArrival事件中實現(xiàn)。抓取的圖象數(shù)據(jù)量較大,所以需要分塊傳輸。

(2) 服務(wù)器端

DataArrival 事件代碼:

Dim receivefile() As Byte

ReDim receivefile(bytesTotal) As Byte

Winsock1.GetData receivefile, vbArray + vbByte

'告訴Winsock控件收到的是字節(jié)數(shù)組類型的數(shù)據(jù)

If Chr(receivefile(0)) = "o" And _

Chr(receivefile(1)) = "k" And _

Chr(receivefile(2)) = "m" Then

If Dir$(filename) "" Then Kill filename

' 打開文件,準備存儲圖像

Open filename For Binary As #1

filelen = 0

Winsock1.SendData "fir"

Exit Sub

End If

If Chr(receivefile(0)) = "e" And _

Chr(receivefile(1)) = "n" And _

Chr(receivefile(2)) = "d" Then

Label1.Caption = "end"

Close #1

Picture1.Picture = LoadPicture(filename) '顯示圖象

Exit Sub

End If

Put #1, , receivefile

Winsock1.SendData "next"

3、其它功能

主要用到一些API函數(shù),如實現(xiàn)屏幕鎖定和解鎖操作可使用Enable Window,實現(xiàn)關(guān)機功能用ExitWindowsEx, 服務(wù)器和工作站之間的信息互送用到WINSOCK控件的UDP協(xié)議,具體用法請參閱有關(guān)資料。

結(jié)束語

通過在基本的網(wǎng)絡(luò)監(jiān)控系統(tǒng)增加入侵檢測,就能夠極大提高網(wǎng)絡(luò)的整體安全性,使之更靈敏、更智能,大大降低入侵的成功率。

怎樣在vb中自動檢測到可用串口號的具體程序代碼

vb.net的話

For

Each

sp

As

String

In

My.Computer.Ports.SerialPortNames

cbxport.Items.Add(sp)

Next

vb6.0的話要調(diào)用API查看串口相關(guān)信息存在的注冊表。

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

通過讀注冊表的方法獲得串口數(shù)量,當然也可以獲得串口號了。

Option

Explicit

Private

Declare

Function

RegOpenKey

Lib

"advapi32.dll

"

Alias

"RegOpenKeyA

"

(ByVal

hKey

As

Long,

ByVal

lpSubKey

As

String,

phkResult

As

Long)

As

Long

Private

Declare

Function

RegQueryInfoKey

Lib

"advapi32.dll

"

Alias

"RegQueryInfoKeyA

"

(ByVal

hKey

As

Long,

ByVal

lpClass

As

String,

lpcbClass

As

Long,

ByVal

lpReserved

As

Long,

lpcSubKeys

As

Long,

lpcbMaxSubKeyLen

As

Long,

lpcbMaxClassLen

As

Long,

lpcValues

As

Long,

lpcbMaxValueNameLen

As

Long,

lpcbMaxValueLen

As

Long,

lpcbSecurityDescriptor

As

Long,

lpftLastWriteTime

As

Long)

As

Long

Private

Const

HKEY_LOCAL_MACHINE

=

H80000002

'

獲得當前系統(tǒng)的

COM

口的數(shù)量

Function

GetCOMCount()

As

Integer

Dim

ret

As

Long,

cntCOM

As

Long

RegOpenKey

HKEY_LOCAL_MACHINE,

"HARDWARE\DEVICEMAP\SERIALCOMM

",

ret

RegQueryInfoKey

ret,

"

",

0,

0,

0,

0,

0,

cntCOM,

0,

0,

0,

GetCOMCount

=

cntCOM

End

Function

Private

Sub

Command1_Click()

MsgBox

"您的機器有

"

GetCOMCount

"

個串口。

",

vbOKOnly,

"串口數(shù)量

"

End

Sub

當前標題:vb.net掃描端口程序 掃描端口命令
網(wǎng)站地址:http://www.muchs.cn/article14/ddcshge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站設(shè)計公司、微信小程序定制網(wǎng)站、App開發(fā)、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化