15,471
社区成员
发帖
与我相关
我的任务
分享
#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;
}
// 是这个意思吗?
// 给线程的参数
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);