MFC多线程扫描的实现

tobeSatan 2010-05-14 06:40:10
void **Dlg::Scan()
{
//读输入的IP地址
CString strBeginIP;
m_ctrlBeginIPAddress.GetWindowText(strBeginIP);
CString strEndIP;
m_ctrlEndIPAddress.GetWindowText(strEndIP);

DWORD dwAddr1 = inet_addr(strBeginIP);//inet_addr将点分制的IP地址转换为32位IP地址
DWORD dwAddr2 = inet_addr(strEndIP);
DWORD dwBeginIP = ntohl(dwAddr1);//ntohl将一个32位数由网络字节顺序转换为主机字节顺序
DWORD dwEndIP = ntohl(dwAddr2);
DWORD dwAddr;
int ipNo = dwEndIP - dwBeginIP + 1;
if(ipNo <= 0)
{
CString str;
str.Format("IP范围输入有误");
MessageBox(str);
m_stat = str;
UpdateData(FALSE);
return;
}

struct sockaddr_in local;
local.sin_family = AF_INET;

CString strIP;
int hostNo = 0;

//设置进度条
m_pro.SetRange32(0,ipNo);
m_pro.SetPos(0);
m_pro.SetStep(1);

for(unsigned int i=dwBeginIP;i<=dwEndIP;i++)
{
dwAddr=htonl(i);//htohl将一个32位数由主机字节顺序转换为网络字节顺序
local.sin_addr.s_addr = dwAddr;
strIP = inet_ntoa(local.sin_addr);
CString str;
str.Format("正在探测" + strIP);
m_stat = str;
UpdateData(FALSE);

//此处省去扫描代码
m_pro.StepIt();
}
CString str;
str.Format("探测结束,在%d个目标中,共发现%d个存活主机",ipNo,hostNo);
m_stat = str;
UpdateData(FALSE);
GetDlgItem(IDC_START_TEST)->EnableWindow(true);
GetDlgItem(IDC_STOP_TEST)->EnableWindow(false);
}

用多线程实现这个函数的功能,该怎么写?
帮忙具体写一下吧,我自己写的AfxBeginThread连接出错
如果需要的话可以把代码发去帮我看看
...全文
262 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
尹成 2010-05-15
  • 打赏
  • 举报
回复
看看这个是不是你想要的
#include <stdlib.h>
#include <stdio.h>
#include <Winsock2.h>

#pragma comment(lib,"ws2_32.lib")

typedef struct PortInfo
{
char ip[32];
short fromPort;
short toPort;
short *openedPort;
short openedPortCount;
}PORTINFO,*PPORTINFO;


DWORD WINAPI ThreadProc(LPVOID lpParam)
{
PPORTINFO portinfo=(PPORTINFO)lpParam;

if(portinfo==NULL)
{
return -1;
}

short fromPort=portinfo->fromPort;
short toPort=portinfo->toPort;

while(fromPort<=toPort)
{
SOCKET testsocket;
struct sockaddr_in target_addr;

printf("正在建立socket.............\n");
if ((testsocket=socket (AF_INET,SOCK_STREAM,0) ) == INVALID_SOCKET)
{
printf("Socket建立失败!\n");
return 0;
}

target_addr.sin_family = AF_INET;
target_addr.sin_port = htons(fromPort);
target_addr.sin_addr.s_addr = inet_addr (portinfo->ip);

printf("正在扫描端口 %s:%u \n",portinfo->ip,fromPort);

if (connect (testsocket, (struct sockaddr *) &target_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)
{
printf("端口 %u 关闭!\n",fromPort);
}
else
{
portinfo->openedPort[portinfo->openedPortCount]=fromPort;
portinfo->openedPortCount++;
printf("端口 %u 开放!\n",fromPort);
}

closesocket(testsocket);

fromPort++;

//Sleep(20);
}

return 0;
}

#define THREAD_COUNT 100

int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2,2 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 )
{
printf("WSAStartup error!\n");
return 1;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{

WSACleanup();
return 1;
}

short iportFrom,iportTo;
char IPstr[32];

memset(IPstr,0,sizeof(IPstr));

printf("Please input IP:\n");
scanf("%16s",IPstr);

printf("Please input 开始端口:");
scanf("%hd",&iportFrom);

printf("Please input 截止端口:");
scanf("%hd",&iportTo);

if(iportTo<iportFrom||iportFrom<=0||iportTo<=0)
{
printf("端口号要大于0,并且截止端口要大于或者等于开始端口!\n");
return -1;
}

int threadCount=THREAD_COUNT;

int tmp=(iportTo-iportFrom)/THREAD_COUNT;
if(tmp==0)
{
tmp=1;
threadCount=iportTo-iportFrom+1;
}

//int resver=(iportTo-iportFrom)%5;
PPORTINFO portinfo= new PORTINFO[threadCount];

//PORTINFO portinfo[THREAD_COUNT];
HANDLE* hthread=new HANDLE[threadCount];
DWORD IDThread;

DWORD beginTime=GetTickCount();

for(int i=0;i<threadCount-1;i++)
{
strcpy(portinfo[i].ip,IPstr);
portinfo[i].fromPort=iportFrom+i*tmp;
portinfo[i].toPort=portinfo[i].fromPort+tmp-1;
portinfo[i].openedPortCount=0;
portinfo[i].openedPort = new short[tmp];

hthread[i]=CreateThread(NULL,0,ThreadProc,&portinfo[i],0,&IDThread);
}

strcpy(portinfo[threadCount-1].ip,IPstr);
portinfo[threadCount-1].fromPort=iportFrom+(threadCount-1)*tmp;
portinfo[threadCount-1].toPort=iportTo;
portinfo[threadCount-1].openedPortCount=0;
portinfo[threadCount-1].openedPort = new short[iportTo-portinfo[threadCount-1].fromPort+1];

hthread[threadCount-1]=CreateThread(NULL,0,ThreadProc,&portinfo[threadCount-1],0,&IDThread);

for(int i=0;i<threadCount;i++)
{
WaitForSingleObject(hthread[i],INFINITE);
}

for(int i=0;i<threadCount;i++)
{
CloseHandle(hthread[i]);

}

DWORD endTime=GetTickCount();

printf("开始时间:%d\n结束时间:%d\n花费时间:%d\n",beginTime,endTime,endTime-beginTime);

for(int i=0;i<threadCount;i++)
{
for(int j=0;j<portinfo[i].openedPortCount;j++)
{
printf("IP:%s 开放的端口:%hd\n",portinfo[i].ip,portinfo[i].openedPort[j]);
}
}

for(int i=0;i<threadCount;i++)
{
delete[] portinfo[i].openedPort;
}

delete[] portinfo;
delete[] hthread;

return 0;
}
悟迟 2010-05-15
  • 打赏
  • 举报
回复
使用线程是
这样使用参数可能有问题
CSMParam cParam;
悟迟 2010-05-14
  • 打赏
  • 举报
回复

// 是这个意思吗?
// 给线程的参数
class CSMParam
{
public:
CString m_sIP; // IP
int m_nFW; // 范围
HWND m_hPro; // 进度条窗口句柄
}

// 声明线程函数
**Dlg.h
CWinThread* pThreadForSM;
static UINT ThreadForSM(LPVOID pParam);

// 定义线程函数
**Dlg.cpp
UINT **Dlg::ThreadForSM(LPVOID pParam)
{
// 将参数转成你需要的

//此处省去扫描代码

::PostMessage(((CSMParam)pParam)->m_hPro, WM_PRO, 50);

return 0xdead;
}

// 使用线程函数
CSMParam cParam;
cParam.m_sIP = "192.168.0.1"; // IP
cParam.m_nFW = 200; // 范围
cParam.m_hPro = m_pro.m_hWnd; // 进度条窗口句柄
pThreadForSM = AfxBeginThread((AFX_THREADPROC)ThreadForSM, cParam,
0, 0, THREAD_TERMINATE);

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧