///
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 ; };
///
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++; }}