head.h文件
#include <iostream>
#include <Windows.h>
using namespace std;
struct MainThreadParam
{
DWORD StartIp;
DWORD EndIp;
DWORD StartPort;
DWORD EndPort;
HANDLE hCopyEvent;
};
struct SubThreadParam
{
DWORD Ip;
DWORD Port;
HANDLE hThreadNum;
HANDLE hParamEvent;
};
//int StartScanner(DWORD StartIp, DWORD StartPort, DWORD EndIp, DWORD EndPort);
DWORD WINAPI PortScanThread(LPVOID LpParam);
BOOL InitPortScan();
BOOL InsertInfo(char *buff);
DWORD WINAPI StartScanner(LPVOID LpParam);
resource.h文件
这个是对gui界面控件的定义构建界面时候自动的
#define IDD_DIALOG1 101
#define IDC_BUTTON1 1001
#define IDC_IPADDRESS1 1002
#define IDC_IPADDRESS2 1003
#define IDC_EDIT1 1004
#define IDC_EDIT2 1005
#define IDC_LIST1 1006
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1007
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
PortScanner.cpp文件
#include <winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")
#include <CommCtrl.h>
#include <Windows.h>
#include "resource.h"
#include "head.h"
HWND hDlg;
SubThreadParam SParam;
MainThreadParam MParam;
int CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wparam, LPARAM lparam);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
NULL,
DlgProc
);
return 0;
//建立一个模态的对话框
}
int CALLBACK DlgProc(HWND hDlgMain,
UINT uMsg, WPARAM wparam, LPARAM lparam)
{
hDlg = hDlgMain;
DWORD StartIp;
DWORD StartPort;
DWORD EndIp;
DWORD EndPort;
switch (uMsg)
{
case WM_COMMAND:
switch (LOWORD(wparam))
{
case IDC_BUTTON1:
{
SendMessage(GetDlgItem(hDlg, IDC_LIST1), LB_RESETCONTENT, NULL, NULL);
SendMessage(GetDlgItem(hDlg, IDC_IPADDRESS1), IPM_GETADDRESS, NULL, (LPARAM)&StartIp);
SendMessage(GetDlgItem(hDlg, IDC_IPADDRESS2), IPM_GETADDRESS, NULL, (LPARAM)&EndIp);
StartPort = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, FALSE);
EndPort = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, FALSE);
MParam.StartIp = StartIp;
MParam.EndIp = EndIp;
MParam.StartPort = StartPort;
MParam.EndPort = EndPort;
CreateThread(NULL, 0, StartScanner, NULL, 0, NULL);
}
break;
default:
break;
}
break;
case WM_CLOSE:
{
EndDialog(hDlg, 0);
DestroyWindow(hDlg);
}
break;
default:
break;
}
return 0;
}
//程序中的主线程
DWORD WINAPI StartScanner(LPVOID LpParam)
{
HANDLE hParamEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE hThreadNum = CreateSemaphore(NULL, 256, 256, NULL);
SParam.hParamEvent = hParamEvent;
SParam.hThreadNum = hThreadNum;
for (DWORD Ip = MParam.StartIp; Ip <= MParam.EndIp; Ip++)
{
for (DWORD Port = MParam.StartPort; Port <= MParam.EndPort; Port++)
{
DWORD WaitResult = WaitForSingleObject(hThreadNum, 200);
if (WaitResult == WAIT_OBJECT_0)
{
SParam.Ip = Ip;
SParam.Port = Port;
CreateThread(NULL, 0, PortScanThread, &SParam, 0, NULL);
WaitForSingleObject(hParamEvent, INFINITE);
ResetEvent(hParamEvent);
}
else if (WaitResult == WAIT_TIMEOUT)
{
Port--;
continue;
}
}
}
return 1;
}
//端口扫描子线程
DWORD WINAPI PortScanThread(LPVOID LpParam)
{
SubThreadParam SParam;
MoveMemory(&SParam, LpParam, sizeof(SParam));
SetEvent(SParam.hParamEvent); //唤醒事件
if (!InitPortScan())
{
return 0;
}
SOCKET Sock;
SOCKADDR_IN SockAddr;
Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Sock == INVALID_SOCKET)
{
MessageBoxA(NULL, "INVALID_SOCKET", NULL, NULL);
}
SockAddr.sin_addr.S_un.S_addr = htonl(SParam.Ip);
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = htons(SParam.Port);
char* Ipchar = inet_ntoa(SockAddr.sin_addr);
char str[200];
if (connect(Sock, (SOCKADDR*)&SockAddr, sizeof(SockAddr)) == 0)
{
sprintf_s(str, "%s:%d-----------连接成功\n", Ipchar, SParam.Port);
InsertInfo(str);
}
else
{
sprintf_s(str, "%s:%d 连接失败\n", Ipchar, SParam.Port);
}
closesocket(Sock);
ReleaseSemaphore(SParam.hThreadNum, 1, NULL); //释放一个信号量
return 0;
}
BOOL InitPortScan()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return 0;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 0;
}
else
printf("The Winsock 2.2 dll was found okay\n");
return 1;
}
BOOL InsertInfo(char *buff)
{
SendMessage(GetDlgItem(hDlg, IDC_LIST1), LB_ADDSTRING, NULL, (LPARAM)buff);
return TRUE;
}
最后的还有个文件PortScanner.rc
这是对话框框体的设计。。。
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_DIALOG1 DIALOGEX 0, 0, 309, 177
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
PUSHBUTTON "开始扫描",IDC_BUTTON1,94,154,107,16
LTEXT "开始IP",IDC_STATIC,34,19,23,8
LTEXT "结束IP",IDC_STATIC,34,39,23,8
LTEXT "开始PORT",IDC_STATIC,193,18,35,8
LTEXT "结束PORT",IDC_STATIC,193,39,35,8
CONTROL "",IDC_IPADDRESS1,"SysIPAddress32",WS_TABSTOP,65,18,95,14
CONTROL "",IDC_IPADDRESS2,"SysIPAddress32",WS_TABSTOP,65,37,95,14
EDITTEXT IDC_EDIT1,232,16,54,16,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT2,231,36,54,16,ES_AUTOHSCROLL
LISTBOX IDC_LIST1,40,60,223,90,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_DIALOG1, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 302
TOPMARGIN, 7
BOTTOMMARGIN, 170
END
END
#endif // APSTUDIO_INVOKED
#endif // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
最后的整个工程: 链接:https://pan.baidu.com/s/14K3nKvKY2LofCQIsGKNqsA 密码:p2uf