扫描网络端口代码,全部手打,高手您受累看看
以下为《小小黑客之路》扫描代码,在下原封不动在vs2008打出,好不容易调试得没有bug了,结果ui界面中按钮全部哑火,
任凭怎么点都没一点反应!到底怎么回事,有没有高手能给我这个小白指点一下呢?
源代码:
#include <windows.h>
#include "resource.h"
#include <iostream>
#include <stdio.h>
using namespace std;
#include <commctrl.h>
#include <WinSock.h>
#pragma comment(lib,"WS2_32")
#include <string.h>
BOOL InitPortScan()
{WSADATA WsaData;
WORD WsaVersion=MAKEWORD(2,2);
if(WSAStartup(WsaVersion,&WsaData)!=0)
{MessageBoxA(NULL,"WSAStartup fail;",NULL,NULL);
return FALSE;
}
return TRUE;
}
struct MainThreadParam
{DWORD StartIp;
DWORD EndIp;
DWORD StartPort;
DWORD EndPort;
HANDLE hCopyEvent;
};
struct ThreadParam
{DWORD Ip;
DWORD Port;
HANDLE hCopyOkEvent;
HANDLE hThreadNum;
};
DWORD WINAPI PortScanthread(LPVOID LpParam)
{ThreadParam Param;
MoveMemory(&Param,LpParam,sizeof(Param));
SetEvent(Param.hCopyOkEvent);
SOCKET Sock;
SOCKADDR_IN SockAddr={0};
Sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(Sock==INVALID_SOCKET)
{MessageBoxA(NULL,"INVALID_SOCKET",NULL,NULL);
}
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr=htonl(Param.Ip);
SockAddr.sin_port=htons(Param.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,Param.Port);
}
else
{sprintf_s(str,"%s:%d联接失败\n",IpChar,Param.Port);
}
//InsertInfo(str);
//ReleaseSemaphore(Param.hThreadNum,1,NULL);
closesocket(Sock);
return 0;
}
DWORD WINAPI MainThread(LPVOID LpParam)
{MainThreadParam Param;
MoveMemory(&Param,LpParam,sizeof(Param));
SetEvent(Param.hCopyEvent);
ThreadParam threadparam={0};
HANDLE hThreadCopyOkEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
threadparam.hCopyOkEvent=hThreadCopyOkEvent;
HANDLE hThreadNum=CreateSemaphore(NULL,256,256,NULL);
threadparam.hThreadNum=hThreadNum;
for(DWORD Ip=Param.StartIp;Ip<=Param.EndIp;Ip++)
{for(DWORD Port=Param.StartPort;Ip<=Param.EndPort;Port++)
{DWORD WaitRes=WaitForSingleObject(hThreadNum,200);
if(WaitRes==WAIT_OBJECT_0)
{threadparam.Ip=Ip;
threadparam.Port=Port;
CreateThread(NULL,0,PortScanthread,&threadparam,0,NULL);
WaitForSingleObject(threadparam.hCopyOkEvent,INFINITE);
ResetEvent(threadparam.hCopyOkEvent);
}
else if(WaitRes==WAIT_TIMEOUT)
{Port--;
continue;
}
}
}
return 0;
}
BOOL StartScanner(DWORD StartIp,DWORD EndIp,DWORD StartPort,DWORD EndPort)
{InitPortScan();
MainThreadParam param;
HANDLE hMainCopyEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
param.hCopyEvent=hMainCopyEvent;
param.StartIp=StartIp;
param.EndIp=EndIp;
param.StartPort=StartPort;
param.EndPort=EndPort;
CreateThread(NULL,0,MainThread,(LPVOID *)¶m,0,NULL);
WaitForSingleObject(hMainCopyEvent,INFINITE);
ResetEvent(hMainCopyEvent);
return TRUE;
}
LRESULT CALLBACK DlgProc(HWND hDlgMain,UINT uMsg,WPARAM wParam,LPARAM lParam)
{HWND hDlg=hDlgMain;
DWORD StartIp;
DWORD EndIp;
DWORD StartPort;
DWORD EndPort;
static BOOL Flag=TRUE;
switch(uMsg)
{case WM_INITDIALOG:
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{case IDC_BUTTON_START:
if(Flag)
{//UINT IPM_GETADDRESS;
SendMessage(GetDlgItem(hDlg,IDC_LIST_RST),LB_RESETCONTENT,NULL,NULL);
SendMessage(GetDlgItem(hDlg,IDC_IP_START),IPM_GETADDRESS,0,(LPARAM)&StartIp);
SendMessage(GetDlgItem(hDlg,IDC_IP_END),IPM_GETADDRESS,0,(LPARAM)&EndIp);
StartPort=GetDlgItemInt(hDlg,IDC_EDIT_STARTPORT,NULL,FALSE);
EndPort=GetDlgItemInt(hDlg,IDC_EDIT_ENDPORT,NULL,FALSE);
StartScanner(StartIp,EndIp,StartPort,EndPort);
}
break;
default:
break;
}
break;
case WM_CLOSE:
EndDialog(hDlg,NULL);
DestroyWindow(hDlg);
break;
default:
break;
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG),NULL,(DLGPROC)DlgProc);
return 0;
}
[解决办法]
是不是资源文件有问题
[解决办法]
多线程啊
不错啊 欣赏了
[解决办法]
这只是一部分代码,最基本的消息循环都没有怎么可能响应按钮事件
你先弄明白一个最基本的win32程序的执行流程再整这个吧。
[解决办法]
确实没有消息循环, 怎么getmessage呢?
[解决办法]
不好意思 没看到DoDialog()函数