TCP 연결 포트 스캔 간단한 C ++ 프로그램

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

프라 그마 한 번

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

}

출시 다섯 개 원래 기사 · 원의 칭찬 0 · 조회수 1476

추천

출처blog.csdn.net/qq_32562005/article/details/52204350