///
pragma once
ifndef PORTSCAN_H
define PORTSCAN_H
include
include
include
include
include
pragma comment(lib,”ws2_32.lib”)
using namespace std;
class CPortScan
{
public:
CPortScan();
~CPortScan();
public:
void ScanPort();
void ShowInfo();
void Init();
void UnInit();
int Scan(char *Ip,int StartPort,int EndPort);
public:
SOCKET m_conn;
list m_connInfo;
long m_Ip ;
};
endif
///
include “PortScan.h”
CPortScan::CPortScan()
{
m_conn=NULL;
m_Ip=0;
Init();
}
CPortScan::~CPortScan(void)
{
UnInit();
}
void CPortScan::ScanPort()
{
int ret;
int begin,end;
begin=0;
end = 0;
char szIp[16]=” “;
printf(“亲,请输入IP地址 :\n”);
gets(szIp);
printf("亲,请输入端口范围 :\n");
scanf("%d %d",&begin,&end);
ret=Scan(szIp,begin,end);
if(ret)
printf("Scan OK\n");
}
void CPortScan::Init()
{
//打开库
WORD wVersion = MAKEWORD(2, 2);
WSADATA wsaData;
::WSAStartup(wVersion, &wsaData);
//校验库
if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
{
return ;
}
}
void CPortScan::UnInit()
{
list::iterator ite = m_connInfo.begin();
while(ite!=m_connInfo.end())
{
ite= m_connInfo.erase(ite);
}
::WSACleanup();
}
int CPortScan::Scan(char *Ip,int StartPort,int EndPort)
{
clock_t StartTime,EndTime;
float CostTime;
TIMEVAL TimeOut;
FD_SET mask;
struct sockaddr_in server;
int CurrPort;
int ret;
unsigned long mode=1; //ioctlsocket函数的最后一个参数
TimeOut.tv_sec=0;
TimeOut.tv_usec=50; //超时为50ms
FD_ZERO(&mask);
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr(Ip);
m_Ip= inet_addr(Ip);
int i=0;
StartTime=clock();
for(CurrPort=StartPort;CurrPort<=EndPort;CurrPort++)
{
m_conn=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_conn<0)
{
::closesocket(m_conn);
break;
}
FD_SET(m_conn,&mask);
::ioctlsocket(m_conn,FIONBIO,&mode); //设置为非阻塞模式
server.sin_port=htons(CurrPort);
::connect(m_conn,(struct sockaddr *)&server,sizeof(server));
ret=::select(0,NULL,&mask,NULL,&TimeOut); //查询可写入状态
if(0==ret || -1==ret)
{
//printf("[%d] Failed\n",i);
::closesocket(m_conn);
}
else
{
//存储连接结构
m_connInfo.push_back(CurrPort);
::closesocket(m_conn);
}
}
EndTime=clock();
CostTime=(float)(EndTime-StartTime)/CLOCKS_PER_SEC;
printf("Cost time:%f second\n",CostTime);
return 1;
}
void CPortScan::ShowInfo()
{
list ::iterator ite = m_connInfo.begin();
int i=1;
in_addr addr;
addr.S_un.S_addr=m_Ip;
while(ite!=m_connInfo.end())
{
printf("[%d] %s \n",*ite,inet_ntoa(addr));
i++;
ite++;
}
}