[英]Why does socket.connect() stop working when used within a loop in Python 3.4?
我剛剛開始學習python編程,並且一直在關注創建簡單端口掃描程序的教程,以了解有關套接字編程的知識。 當我手動輸入所有代碼進行一次迭代時,我能夠成功連接到本地主機,但是,如果我使用相同的代碼,並使用try / except將其應用到for循環中,則我會立即獲得每個端口的異常范圍內,即使我知道某些端口已打開。 我相信我已經將問題隔離到socket.connect(),因為我在下面輸入了我永遠都不會執行的代碼。
我可以輸入以下代碼,並獲得成功的回報:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
port = 22
s.connect(('127.0.0.1', port))
s.send(b'test')
banner = s.recv(1024)
print(banner)
s.close()
返回:
b'SSH-2.0-OpenSSH_6.2\r\n'
Process finished with exit code 0
但是,一旦我獲取該代碼並將其移動到以端口號作為迭代器的for循環中,它便停止工作。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
for port in range(1,26):
print("[+]Attempting to connect to : " + str(port))
try:
s.connect(('127.0.0.1', port))
s.send(b'test')
banner = s.recv(1024)
s.close()
if banner:
print("Port " + port + "is Open: " + banner)
except: print("[+]Port " + str(port) + " is closed")
返回:
[+]Attempting to connect to : 1
[+]Port 1 is closed
[+]Attempting to connect to : 2
[+]Port 2 is closed
[+]Attempting to connect to : 3
[+]Port 3 is closed
....ETC....ETC....ETC....
[+]Attempting to connect to : 24
[+]Port 24 is closed
[+]Attempting to connect to : 25
[+]Port 25 is closed
即使我知道端口22已打開並且正在localhost上偵聽。 (即我能夠ssh到127.0.0.1,沒有問題)。 我已經嘗試了所有我能想到的一切,包括使用內部int()函數手動將端口的數據類型更改為int,嘗試了socket.connect_ex對象,等等。我還放置了代碼在socket.connect語句的正下方,只是查看它是否顯示出來,而從未執行過。
Python的禪宗指出:
錯誤絕不能默默傳遞。
除非明確地保持沉默。
只有您沒有使錯誤消失,而只是將其替換為對實際發生的情況沒有描述的消息:
>>> "Port" + 1
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
"Port "+1
TypeError: Can't convert 'int' object to str implicitly
如果打開端口1會得到的結果是,但是在關閉套接字之后,您將無法連接到其他任何設備:
>>> a = socket.socket()
>>> a.close()
>>> a.connect(("www.python.com",80))
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
a.connect(("www.python.com",80))
OSError: [Errno 9] Bad file descriptor
因此,您需要在循環內創建一個新套接字,以使其正常工作,但最重要的是:您需要限制捕獲的錯誤:
try:
#if this is the only line you expect to fail, then it is the only line in the try
s.connect(('127.0.0.1', port))
except ConnectionError:
#if a ConnectionError is the only one you expect, it is the only one you catch
print("[+]Port " + str(port) + " is closed")
else: #if there was no error
s.send(b'test')
banner = s.recv(1024)
s.close()
if banner:
print("Port " + port + "is Open: " + banner)
然后您將看到實際的錯誤,而不是猜測哪里出了問題,這也不利於The Zen of Python :
面對模棱兩可的想法,拒絕猜測的誘惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.