import socket,time,re,sys,os,threading
import gevent
from gevent import monkey
monkey.patch_all() socket.setdefaulttimeout(2) #该方法用来处理用户数据的port范围,并计算范围内的port,将其添加到列表中,将列表返回
def handle_port(input_ports):
try:
pattern = re.compile('(^\d{1,5})-(\d{1,5}$)')
match = pattern.match(input_ports)
if match:
start_port = int(match.group(1))
end_port = int(match.group(2))
if end_port <=65535 :
if start_port < end_port:
list =[]
for i in range(start_port, end_port+1):
list.append(i)
return list
else:
print("端口范围输入有误")
exit(0)
else:
print("端口格式输入格式有误。")
exit(0)
except Exception as err:
print(err)
exit(0) #该方法用来处理用户数据的IP地址范围,并计算范围内的IP地址,将其添加到列表中,将列表返回
def handle_ip(input_addrs): try:
pattern = re.compile('(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})-(\d{1,3})') # 匹配标准点进制的IP
match = pattern.match(input_addrs)
if match:
list = []
for i in range(int(match.group(2)),int(match.group(3))+1):
addr = match.group(1)+str(i)
list.append(addr)
return list
else:
print("ip地址格式输入有误")
exit(0)
except Exception as err:
print(err)
exit(0) #调用socket方法进行tcp端口扫描,client.connect()方法的返回值如果为None,则说明端口开放,若无返回值,说明连接超时,就没有返回值
def scaner(ip,port):
try:
client = socket.socket()
res = client.connect((ip,port))
if not res:
open_port = []
print(ip,":",port," is open")
open_port.append((ip,port))
return open_port except Exception as e:
pass finally:
client.close() #本方法对传递来的列表ports进行循环,每次循环启动一个协程,在协程内部将port和addr进行配对,并调用scaner方法进行扫描
def coroutine_scan(addr,ports):
list = []
for port in ports:
eve = gevent.spawn(scaner, addr, port)
list.append(eve)
gevent.joinall(list) #本方法对传递来的列表addrs进行循环,每一次循环启动一个进程,并将addrs循环出来的数据和ports列表传递给coroutine_scan方法
def thread_scan(addrs,ports):
for addr in addrs:
t = threading.Thread(target=coroutine_scan, args=(addr, ports))
t.start() #本方法用来接收参数,并调用handle_port,handle_ip对输入的内容进行处理,然后将返回的列表数据传递给thread_scan
def main(): input_addrs = input("输入IP地址范围:如'192.168.0.1-45'\n>>").strip()
input_ports = input("输入端口范围:如'1000-1005'\n>>").strip() if len(input_addrs) and len(input_addrs)> 0: ports = handle_port(input_ports)
addrs = handle_ip(input_addrs) print("开始扫描.......")
thread_scan(addrs,ports) else:
print("请输入正确的IP地址范围和端口。")
main() if __name__ == "__main__":
main()

portscaner 多线程、多协程并发端口扫描的更多相关文章

  1. Python并发编程——多线程与协程

    Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...

  2. python单线程,多线程和协程速度对比

    在某些应用场景下,想要提高python的并发能力,可以使用多线程,或者协程.比如网络爬虫,数据库操作等一些IO密集型的操作.下面对比python单线程,多线程和协程在网络爬虫场景下的速度. 一,单线程 ...

  3. python 多进程,多线程,协程

    在我们实际编码中,会遇到一些并行的任务,因为单个任务无法最大限度的使用计算机资源.使用并行任务,可以提高代码效率,最大限度的发挥计算机的性能.python实现并行任务可以有多进程,多线程,协程等方式. ...

  4. python3 - 多线程和协程速率测试对比

    多线程和协程都属于IO密集型,我通过以下用例测试多线程和协程的实际速率对比. 实例:通过socket客户端以多线程并发模式请求不同服务器端(这里服务器端分2种写法:第一种服务器通过协程实现,第二种服务 ...

  5. 深入浅析python中的多进程、多线程、协程

    深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...

  6. 多线程 多进程 协程 Queue(爬虫代码)

    快速理解多进程与多线程以及协程的使用场合和特点 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运 ...

  7. python3通过gevent.pool限制协程并发数量

    协程虽然是轻量级的线程,但到达一定数量后,仍然会造成服务器崩溃出错.最好的方法通过限制协程并发数量来解决此类问题. server代码: #!/usr/bin/env python # -*- codi ...

  8. windows下多进程加协程并发模式

    好久没更新博客了.正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得.如标题所示,今天就来说说windows下多进程加协程并发模式.其实网上还是蛮多在linux下的多进程加协程并发 ...

  9. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

随机推荐

  1. UE3多参数函数实现

    基础宏定义 #define VARARG_EXTRA(A) A, #define VARARG_NONE #define VARARG_PURE =0 static inline DWORD Chec ...

  2. MySQL 5.7开启二进制日志注意事项

    最近才开始将部分MySQL 5.6升级到MySQL 5.7, 在开启MySQL的二进制日志时,发现MySQL 5.7 与MySQL 5.6已有细微区别.如果在my.cnf配置文件中,只设置了全局系统变 ...

  3. 想起以前写的一个爬虫,然后就用C#WinForm写了一个下载小说的软件,比较简单

    本软件本是练习.讨论爬虫技术所用.如果侵犯了您的利益请联系我,我会立即删除! 小工具安装包: 百度网盘链接:https://pan.baidu.com/s/1m_OuEBOEE47kYaXq5fwpI ...

  4. Failed to decrypt protected XML node "DTS:Password" with error 0x8009000B "Key not valid for use in specified state.". You may not be authorized to access this information. This error occurs when t

    Question SSIS包从A服务器搬迁到B服务器,运行报错 Description: Failed to decrypt protected XML node "DTS:Password ...

  5. C# DBHelper类 参考

    using System;using System.Collections.Generic;using System.Text;using System.Configuration;using Sys ...

  6. SQL Server 索引重建手册

    注意: 索引重建前建议把数据库切换为完整模式,否则索引复制会在数据文件中进行,导致数据文件很大,而数据文件的收缩比日志文件的收缩要困难的多,且会对业务造成影响. 步骤一: 查询索引碎片,脚本如下,库比 ...

  7. python3 之视频抽针

    import cv2 import os Path = "C:/Users/zl3269/Desktop/test/video/" # 视频的格式 /aisg-server/Dat ...

  8. 百度地图和高德地图结合在web中的使用(二)

    百度地图在web中的使用(二) 背景:在做一个关于地理位置字段时,初始位置使用百度地图获取时失败,获取的位置信息不准确,奈何产品说友商好使的啊,F12看后是采用的高德,所以在这采用高德地图获取初始位置 ...

  9. 04.Python网络爬虫之requests模块(1)

    引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症.冗余代码症.重新发明轮子症.啃文档 ...

  10. linux历史命令查找快捷方式

      一.回到上次操作的目录# cd -进入上次访问目录 二.历史命令搜索操作快捷键:[Ctrl + r], [Ctrl + p], [Ctrl + n] 在终端中按捉 [Ctrl] 键的同时 [r] ...