python - Python socket 检测在代码的不同部分打开和关闭的相同端口
问题描述
何时choice == 6
,socket
扫描 IP 中的某个端口并打印它是否打开。
When choice == 9
, socket
扫描特定 IP 的一系列端口并打印哪些端口是开放的,哪些不是。
但是,当扫描相同的 IP 和端口时,这两个扫描显示不同的结果:如果我在选项 9 中扫描 1 到 99 的端口,则只有端口 98 显示为关闭,其余端口是打开的,但在选项 6 中,所有端口都显示为关闭。为什么会这样?
import socket
import os
import time
#you must have figlet install in your system
while True :
print("\033[1;33;40m")
os.system('figlet Socket')
time.sleep(0.1)
print("1-Get ip by Host Name")
time.sleep(0.1)
print("2-Get port number By Name User Enter")
time.sleep(0.1)
print("3-GEt Name By Port Number User Enter")
time.sleep(0.1)
print("4-Get Host Name For Your Device")
time.sleep(0.1)
print("5-Get Internal Ip Address For Your Device")
time.sleep(0.1)
print("6-Check If Port Open Or not For Host You Enter")
time.sleep(0.1)
print("7-Convert Host Data To Network Short")
time.sleep(0.1)
print("8-convert Host Data To Network Long ")
time.sleep(0.1)
print("Enter Any Other Key To Exit")
time.sleep(0.1)
print("-----------------------------------------------")
time.sleep(0.1)
choice = input('Enter Your Choice : ')
if choice == "1":
host = input("Enter Host Name : ")
ip = (socket.gethostbyname(host))
print(ip)
elif choice == "2":
name = input("Enter The Name Of Port YOu Want To know It's Number : ")
port = socket.getservbyname(name)
print(port)
elif choice == "3":
port1 = input("Enter Port Number To Get Name Of Port : ")
name = socket.getservbyport(int(port1))
print(name)
elif choice == "4":
print("Host Name For Your Devise Is : ", socket.gethostname())
elif choice == "5":
print("Internal IP Is : ", socket.gethostbyname(socket.gethostname()))
elif choice == "6":
ip = input("Enter The IP : ")
port = int(input("Enter Port To Check If it Open : "))
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip_port = (str(ip), port)
result = sock.connect_ex(ip_port)
if result == 0:
print("Port Is Closed")
else:
print("port Is Open")
sock.close()
elif choice == "7":
short = input("Please Enter The data you want to Transfare : ")
rshort = socket.htons(int(short)) #Host To Network Short
print(rshort)
elif choice == "8":
long = input("Please Enter The data you want to Transfare : ")
rlong = socket.htonl(int(long)) #Host To Network Short
print(rlong)
elif choice == "9" :
ip=input("Enter The ip You Want To scan ")
rang=int(input("Enter Range You want To scan "))
x=0
while x<rang :
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port = (str(ip), x)
result = sock.connect_ex(ip_port)
if result == 0 :
print("port ",x,"is closed ")
x=x+1
else :
print("Port ",x,"is opend")
x=x+1
else:
os.system('figlet GoodBye')
time.sleep(1)
os.system('clear')
time.sleep(0.5)
break
解决方案
来自socket
的文档:
socket.connect_ex(address)
...返回错误指示符 ...如果操作成功,则错误指示符为 0
但是,您的代码将返回值零视为连接失败的指标,而它实际上是成功的指标- 端口正在打开:
result = sock.connect_ex(ip_port)
if result == 0: # port OPEN!
print("Port Is Closed")
else:
print("port Is Open")
推荐阅读
- python - Numpy 已安装但出现错误:AttributeError:模块“numpy”没有属性“__version__”
- sql - 为什么我没有创建分区的选项?
- windows - 如何在 MSYS2 中使用 SYSVIPC?
- javascript - 子组件的道具没有更新
- azure - 机器人频道注册确实移动到其他资源组
- javascript - 如何让数组中的对象将其读取为 toUpperCase?
- dax - Power BI - 计算前一天交易量和第二天交易量之间的差异
- javascript - 如何在两个条件下使用 Javascript array.find()?
- c# - 如何在 groupBox 控件之间添加间隙?
- javascript - Javascript:循环中的 element.click()