?? 123.txt
字號:
HWND g_hWnd = NULL; //處理消息的窗口句柄
unsigned long g_ulAddr = INADDR_NONE; //掃描的主機地址
DWORD g_dwTimeOut = 1000; //連接超時時間,以ms計
bool g_bTerminate = false; //是否用戶發出結束掃描的標志
short g_nMaxThread = 200; //最大答應的掃描線程數,經試驗不宜大于200
short g_nThreadCount = 0; //當前正在掃描的進程數
DWORD WINAPI StartScan(LPVOID lpParam);
{
tag_PORTS* pScanParam = (tag_PORTS*)lpParam;
DWORD dwThreadId;
unsigned short i;
if (pScanParam->bSepecifiedPort)
{
for(i=0; i<=pScanParam->nCount; i )
{
if (g_bTerminate)
{
break; //用戶已發出結束掃描命令
}
while(g_nThreadCount >= g_nMaxThread)
{
Sleep(10);
}
if (CreateThread(NULL,
0,
DoScanPort,
(LPVOID)new short(pScanParam->nArrOfPorts<i>),
0,
&dwThreadId) != NULL)
{
g_nThreadCount ;
}
}
}
else
{
for(i=pScanParam->iStartPort; i<=pScanParam->iEndPort; i )
{
if (g_bTerminate)
{
break; //用戶已發出結束掃描命令
}
while(g_nThreadCount >= g_nMaxThread)
{
Sleep(10);
}
if (CreateThread(NULL, 0, DoScanPort, (LPVOID)new short(i), 0, &dwThreadId) != NULL)
{
g_nThreadCount ;
}
}
}
//等待各端口掃描線程結束
while (g_nThreadCount > 0)
{
Sleep(50);
}
::SendMessage(g_hWnd, SCAN_THREAD, STARTSCAN_COMPLETE, 0);
delete pScanParam;
return ERROR_SUCCESS;
}
3、DoScanPort 線程:
這個線程負責具體掃描指定的端口,并將結果SendMessage給主對話框。下面是其代碼:
DWORD WINAPI DoScanPort(LPVOID lpParam)
{
DWORD dwRet;
short nPort = *(short*) lpParam;
delete lpParam;
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET)
{
AfxMessageBox("創建套接字失敗!");
dwRet = ERROR_CREATE_SOCKET;
}
else
{
unsigned long flag = 1;
if [1]
{
AfxMessageBox("未能改為非阻塞模式!");
dwRet = ERROR_MODIFY_FIONBIO;
}
else
{
sockaddr_in severAddr;
severAddr.sin_family = AF_INET;
severAddr.sin_port = htons(nPort);
severAddr.sin_addr.S_un.S_addr = g_ulAddr;
connect(sock, (sockaddr*)&severAddr, sizeof(severAddr));
struct fd_set mask;
FD_ZERO(&mask);
FD_SET(sock, &mask);
struct timeval timeout;
timeout.tv_sec = g_dwTimeOut / 1000;
timeout.tv_usec = g_dwTimeOut % 1000;
switch(select(0, NULL, &mask, NULL, &timeout))
{
case -1:
dwRet = ERROR_SELECT;
break;
case 0:
dwRet = ERROR_SELECT_TIMEOUT;
break;
default:
dwRet = ERROR_SUCCESS;
};
}
closesocket(sock);
}
g_nThreadCount --;
if (dwRet == ERROR_SUCCESS)
{
::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_FIND_PORT, nPort);
}
else
{
::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_END_PORT, nPort);
}
return dwRet;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -