////////////////////////////////////////////////// /////////
프라 그마 한 번
ifndef가 PORTSCAN_H
정의 PORTSCAN_H를
포함
포함
포함
포함
포함
프라 그마 코멘트 (LIB, "ws2_32.lib")
네임 스페이스를 사용하여 표준;
클래스 CPortScan
{
공개 :
CPortScan ();
~ CPortScan ();
공개 :
무효 ScanPort ();
공극은 showInfo ();
void Init();
void UnInit();
int Scan(char *Ip,int StartPort,int EndPort);
공공 :
SOCKET m_conn;
목록 m_connInfo;
긴 m_Ip;
};
ENDIF
////////////////////////////////////////////////// /////////////////
포함 "PortScan.h"
CPortScan :: CPortScan ()
{
m_conn = NULL;
m_Ip = 0;
초기화 ();
}
CPortScan :: ~ (무효) CPortScan
{
) (UNINIT;
}
:: Scanport CPortScan 무효 ()
{
INT RET;
INT는 끝을 시작,
하며 = 0 시작
종료 = 0;
숯불 szip [16] = "";
(프로, IP 주소를 입력 : \ N-을 ")에의 printf를";
(가) 취득 ( szIp);
printf("亲,请输入端口范围 :\n");
scanf("%d %d",&begin,&end);
ret=Scan(szIp,begin,end);
if(ret)
printf("Scan OK\n");
}
무효 CPortScan : 초기화 ()
{
//打开库
WORD wVersion = MAKEWORD (2, 2);
WSADATA WSADATA;
:: WSAStartup에 (wVersion, WSADATA);
//校验库
if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
{
return ;
}
}
공극 CPortScan :: UNINIT ()
{
목록 :: 반복자 ITE m_connInfo.begin = ();
반면 (ITE = m_connInfo.end (!))
{
ITE = m_connInfo.erase (ITE);
}
::WSACleanup();
}
INT CPortScan :: 검사 (* CHAR IP, StartPort, INT EndPort INT)
{
상영 시간, 종료 시각 clock_t는;
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;
}
보이드 CPortScan ::은 showInfo ()
{
목록 :: 반복자 ITE m_connInfo.begin = ();
i가 1 = int로;
요지 in_addr를;
addr.S_un.S_addr는 m_Ip를 =;
while(ite!=m_connInfo.end())
{
printf("[%d] %s \n",*ite,inet_ntoa(addr));
i++;
ite++;
}
}