TCP connect端口扫描C++简单程序

///////////////////////////////////////////////////////////

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

}

发布了5 篇原创文章 · 获赞 0 · 访问量 1476

猜你喜欢

转载自blog.csdn.net/qq_32562005/article/details/52204350
今日推荐