TCP Connect半连接扫描源码

头文件声明:

class ScanTCPConnect 
{

public:

    /* @接口 默认构造函数
     * @邮箱 575814050@qq.com
     * @时间 2018年12月21号
     */
    ScanTCPConnect();

    /* @接口 默认析构函数
     * @邮箱 575814050@qq.com
     * @时间 2018年12月21号
     */
    ~ScanTCPConnect();
    
    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    virtual bool beginScan(ulong);

    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    virtual bool beginScan(const QString &);

    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    virtual BoolArr beginScan(ulong, ulong);

    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    virtual BoolArr beginScan(const ULongArr &);

    /* @接口 
     * @参数
     * @返回 bool 成功返回值为true,否则返回值为false
     * @作者 杨发荷
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    virtual BoolArr beginScan(const QStringList &);
    
    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    virtual void setPortVisable(DoxPortVisable);

    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年12月18号
     */
    virtual void setDoxExtraFunc(const DoxExtraFunc &);

private:

    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年10月26号
     */
    ulong getTickCountCalibrate();

    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    bool scanConnect(sockaddr_in &);

    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    void printfInfo(const QString &);

    /* @接口 
     * @返回 bool 成功返回值为true,否则返回值为false
     * @邮箱 575814050@qq.com
     * @时间 2018年2018月12号
     */
    void initSockAddr_in(sockaddr_in &, ulong, int);

private:

    DoxExtraFunc *m_extraFunc;

};

源文件定义:


ScanTCPConnect::ScanTCPConnect()
    : IScanTCPConnect()
    , m_extraFunc(NULL)
{
    WSADATA WSAData;
    if(0 != WSAStartup(MAKEWORD(2, 2), &WSAData))
    {
        DoxLogger("初始化套接字失败");
    }
    else { DoxLogger("初始化套接字成功"); }
}

ScanTCPConnect::~ScanTCPConnect()
{
    if(m_extraFunc) delete m_extraFunc;
    m_extraFunc = NULL; WSACleanup();
}

bool ScanTCPConnect::beginScan(ulong ip)
{
    sockaddr_in addr; QString strIP;
    Object<IDoxPointer> info(NIL);
    for(int idx = 0; idx < 65536; ++idx)
    {
        if(m_extraFunc && m_extraFunc->pfnProgress)
        {
            info->setLong(idx);
            m_extraFunc->pfnProgress(info);
        }
        initSockAddr_in(addr, htonl(ip), idx);
        if(!scanConnect(addr)) continue;
        if(NULL == m_extraFunc) return true;
        if(NULL == m_extraFunc->pfnMessage) return true;
        in_addr inaddr; inaddr.s_addr = ip;
        strIP = QS("%1").arg(inet_ntoa(inaddr));
        info->setString(strIP); m_extraFunc->pfnMessage(info);
        return true;
    }
    return false;
}

ulong ScanTCPConnect::getTickCountCalibrate()
{
    static ULONG s_ulFirstCallTick = 0;
    static LONGLONG s_ullFirstCallTickMS = 0;
    SYSTEMTIME systemtime;
    FILETIME filetime;
    GetLocalTime(&systemtime);
    SystemTimeToFileTime(&systemtime, &filetime);
    LARGE_INTEGER liCurrentTime;
    liCurrentTime.HighPart = filetime.dwHighDateTime;
    liCurrentTime.LowPart = filetime.dwLowDateTime;
    LONGLONG llCurrentTimeMS = liCurrentTime.QuadPart / 10000;
    if(s_ulFirstCallTick == 0)
        s_ulFirstCallTick = GetTickCount();
    if(s_ullFirstCallTickMS == 0)
        s_ullFirstCallTickMS = llCurrentTimeMS;
    return s_ulFirstCallTick + (ULONG)(llCurrentTimeMS - s_ullFirstCallTickMS);
}

bool ScanTCPConnect::beginScan(const QString &ip)
{
    ulong lip = inet_addr(ip.toLocal8Bit().constData());
    return beginScan(lip);
}

bool ScanTCPConnect::scanConnect(sockaddr_in &addr)
{
    SOCKET sock;
    if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
    {
        QString str = QS("%1").arg(inet_ntoa(addr.sin_addr));
        printfInfo(str); return false;
    }
    int retVal = connect(sock, (LPSOCKADDR)&addr, sizeof(addr));
    closesocket(sock); return retVal != SOCKET_ERROR;
}

void ScanTCPConnect::printfInfo(const QString &info)
{
    if(m_extraFunc && m_extraFunc->pfnMessage)
    {
        Object<IDoxPointer> ptr(NIL);
        ptr->setString(info);
        m_extraFunc->pfnMessage(ptr);
    }
}

BoolArr ScanTCPConnect::beginScan(const ULongArr &ips)
{
    BoolArr flags; Object<IDoxPointer> ptr(NIL);
    for(ulong idx = 0; idx < ips.length(); ++idx)
    {
        if(m_extraFunc && m_extraFunc->pfnProgress)
        {
            ptr->setLong(idx);
            m_extraFunc->pfnProgress(ptr);
        }
        flags.append(beginScan(ips[idx]));
    }
    return flags;
}

void ScanTCPConnect::setPortVisable(DoxPortVisable port)
{

}

BoolArr ScanTCPConnect::beginScan(ulong sip, ulong eip)
{
    ULongArr ips;
    while(sip <= eip) ips.append(sip++);
    return beginScan(ips);
}

BoolArr ScanTCPConnect::beginScan(const QStringList &ips)
{
    ULongArr lips;
    for(int idx = 0; idx < ips.length(); ++idx)
    {
        QString ip = ips[idx];
        ulong lip = inet_addr(ip.toLocal8Bit().constData());
        lips.append(lip);
    }
    return beginScan(lips);
}

void ScanTCPConnect::setDoxExtraFunc(const DoxExtraFunc &syntony)
{
    m_extraFunc = new DoxExtraFunc;
    m_extraFunc->pfnMessage = syntony.pfnMessage;
    m_extraFunc->pfnProgress = syntony.pfnProgress;
}

void ScanTCPConnect::initSockAddr_in(sockaddr_in &addr, ulong ip, int port)
{
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = ip;
}

源程序下载地址:https://download.csdn.net/download/yangfahe1/10909507

示例程序运行方式:https://blog.csdn.net/yangfahe1/article/details/84028318

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值