循环不工作在socket.connect_ex()
人们,我想要一个简单的端口扫描仪来验证端口是否打开或关闭使用socket.connect_ex((192.169.10.1, 80))
它工作正常,但我想通过多个IP和端口,所以我用列表和使用for循环迭代它们。我得到的结果只是列表中的第一个IP,第二个IP没有给出正确的结果而是它总是运行elif块,可能是什么问题?有人能指导我哪里出错。循环不工作在socket.connect_ex()
我的代码:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
iplst = ['193.169.10.100', '193.169.10.101']
ports = [80, 80]
for i,j in zip(iplst,ports):
result = sock.connect_ex((i,j))
if result == 0:
print("open" , i)
elif result != 0:
print("closed", i)
OUTPUT:
open 193.169.10.100
closed 193.169.10.101
但我敢肯定,这两个端口是开放的
您需要创建每个每个(IP一个新的插座,端口):
import socket
ips = ['193.169.10.100', '193.169.10.101']
ports = [80, 80]
for ip, port in zip(ips, ports):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((ip, port))
sock.close()
assert result == 0
另外它一旦完成,关闭套接字是一种很好的做法。
现在我明白了为什么我的代码没有工作,我忘了关闭套接字,你能解释我'assert result == 0'的作用。 – Sundararajan
您的代码无法正常工作,因为您对不同的地址使用相同的套接字。一旦你关闭了套接字,你就不能重用它(调用'connect_ex'会产生一个错误)。检查http://*.com/questions/5142418/what-is-the-use-of-assert-in-python来断言解释。 – matino
哦,非常感谢 – Sundararajan
有一件事是在成功的'connect'('connect_ex')后关闭套接字。检查'connect_ex'返回代码(包含'errno'值),它可能类似_Already connected_。 – CristiFati
我认为你需要每个(IP,端口)一个套接字 - 在'for'循环中移动创建套接字 – matino
@matino是合适的,对于混淆,在关闭套接字后它的描述符变得无效。您需要为每个(成功)连接创建一个新的套接字(不要忘记在完成时关闭它)。 – CristiFati