2017-04-27 123 views
1

人们,我想要一个简单的端口扫描仪来验证端口是否打开或关闭使用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 

但我敢肯定,这两个端口是开放的

+1

有一件事是在成功的'connect'('connect_ex')后关闭套接字。检查'connect_ex'返回代码(包含'errno'值),它可能类似_Already connected_。 – CristiFati

+1

我认为你需要每个(IP,端口)一个套接字 - 在'for'循环中移动创建套接字 – matino

+1

@matino是合适的,对于混淆,在关闭套接字后它的描述符变得无效。您需要为每个(成功)连接创建一个新的套接字(不要忘记在完成时关闭它)。 – CristiFati

回答

3

您需要创建每个每个(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 

另外它一旦完成,关闭套接字是一种很好的做法。

+0

现在我明白了为什么我的代码没有工作,我忘了关闭套接字,你能解释我'assert result == 0'的作用。 – Sundararajan

+0

您的代码无法正常工作,因为您对不同的地址使用相同的套接字。一旦你关闭了套接字,你就不能重用它(调用'connect_ex'会产生一个错误)。检查http://stackoverflow.com/questions/5142418/what-is-the-use-of-assert-in-python来断言解释。 – matino

+0

哦,非常感谢 – Sundararajan