下面的代码创建了一个socket对象,然后通过输入的IP地址和端口号范围,循环创建线程,每个线程负责连接指定端口,判断是否能够连接成功,
如果连接成功则输出该端口可用。然后就会关闭socket连接。
这里还加入了多线程,避免了单线程扫描时由于连接超时等问题导致的长时间等待的情况。
import socket
import threading
def duankou():
# 创建一个 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取用户输入的 IP 地址
host = input("请输入需要进行扫描的 IP 地址: ")
# 设置端口范围
ports = range(65535)
# 创建一个线程列表
threads = []
# 定义端口扫描函数
def scan_port(port):
# 尝试连接
result = s.connect_ex((host, port))
try:
sock = socket.socket()
sock.connect((host,port))
print('可用端口:',port)
except:
pass
# 创建线程
for port in ports:
t = threading.Thread(target=scan_port, args=(port,))
threads.append(t)
# 启动线程
for t in threads:
t.start()
# 等待线程结束
for t in threads:
t.join()
# 关闭连接
s.close()
duankou()