TCP控制扫码

浪尽此生 提交于 2019-12-15 12:32:01

#TCP控制扫码 IVYSUN

# -*- coding: utf-8 -*-
"""
tcp control IVYSUN scanner gun scan 
"""
from socketserver import socket
import struct
import ctypes
import time
import logging
import traceback


class ScanNow(object):
    def __init__(self, ip='192.168.250.233', port=10001, timeout=2):
        self.smq_ip = ip
        self.smq_port = int(port)
        self.timeout = float(timeout)
        self.smq = None
        self.connect_status = False
        logging.basicConfig(level=logging.INFO, format="%(name)s %(asctime)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
        self.logger = logging.getLogger(__name__)

    def __del__(self):
        """
        clear connect
        :return:
        """
        self.scanner_disconnect()

    def scanner_connect(self):
        """
        connect
        :return: bool
        """
        self.smq = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.smq.settimeout(self.timeout)
        self.logger.info('start connect')
        ref = self.smq.connect_ex((self.smq_ip, self.smq_port))
        if ref == 0:
            self.connect_status = True
            self.logger.info('connect successfully')
            return True
        else:
            self.logger.error('connect failed')
            return False

    def scanner_disconnect(self):
        """
        disconnect
        :return: bool
        """
        if self.connect_status:
            self.smq.close()
        self.connect_status = False
        self.logger.info('disconnect')
        return True

    def scanner_start(self, cycle=3, times=1):
        """
        :param cycle: 连续尝试扫描次数
        :param times:  连续扫描时间间隔
        :return:
        """
        for i in range(3):
            if not self.connect_status:
                if self.scanner_connect():
                    break
            else:
                break
        else:
            self.logger.error('scan connect failed')
            return False
        data_pack = struct.Struct('!1l')
        pre_buffer = ctypes.create_string_buffer(data_pack.size)
        data_pack.pack_into(pre_buffer, 0, 1)
        for j in range(cycle):
            self.smq.send(pre_buffer)
            try:
                ref = self.smq.recv(1024)
                if ref and cycle >= 2:
                    self.logger.info(ref)
                    return ref
            except TimeoutError:
                self.logger.error(traceback.format_exc())
                return False
            time.sleep(times)


if __name__ == '__main__':
    smq = ScanNow(ip='139.189.1.34')
    smq.scanner_connect()
    smq.scanner_start()


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!