2017-04-27 118 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