一、socket.connect卡住
當使用socket.connect連接目標IP和端口的時候,如果連接不上,socket.connect會一直卡在那裡,阻塞其它進程的執行。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setblocking(0) try: s.connect(("www.baidu.com", 80)) except Exception as e: print(e)
在這個例子中,如果連接不上百度的80端口,s.connect將一直阻塞在這裡,代碼將不再向下執行。可以通過為socket設置非阻塞模式來解決此問題。
二、socket.connect 丟失c
在某些情況下,socket.connect連接的時候可能會出現“no route to host”錯誤或者“connection reset by peer”錯誤。這一般是由於缺失了TCP的三次握手的其中一次,導致連接無法建立。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.bbc.c", 80))
在這個例子中,在百度網址中,我們將c地址刪去,導致無法建立連接。當我們使用上述代碼連接時,我們將會看到如下的錯誤:
socket.gaierror: [Errno 11001] getaddrinfo failed
三、socket.connect 丟失
在某些情況下,socket.connect連接時不會出現任何錯誤提示或者異常,但是連接卻沒有建立成功。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.google.com", 80)) print(s.getpeername())
在這個例子中,當我們使用socket.connect連接谷歌網站的時候,並沒有拋出任何錯誤或者異常。但是獲取其連接的對端地址時,我們會發現並沒有返回任何連接的對端地址。
四、socket.connect默認超時時間
默認情況下,socket.connect的超時時間是永久的,也就是說連接會一直等待直到連接成功或者出現錯誤。 這可能會導致程序長時間阻塞,不予響應。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) #設置超時時間為5秒 try: s.connect(("www.baidu.com", 80)) except Exception as e: print(e)
在這個例子中,我們使用s.settimeout()方法為socket設置超時時間,如果我們在5秒內沒有成功連接到百度的80端口,將會拋出socket.timeout異常。
五、socket.connect模擬超時
如果我們想要模擬一個socket.connect的超時,可以通過在連接前關閉目標端口來實現。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) #設置超時時間為5秒 try: s.connect(("127.0.0.1", 8000)) #先啟動一個監聽8000端口的socket服務端 except Exception as e: print(e) s.close() #手動關閉socket連接
在這個例子中,我們使用s.connect嘗試連接一個不存在的端口,然後手動關閉了連接。這將導致s.connect拋出socket.timeout異常。
六、socket.connect做了哪些事情
socket.connect函數做了兩件事情:發送一個數據包(表示需要連接到某個目標IP的某個端口)和等待一個數據包(來自目標IP表示連接是否成功)。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.baidu.com", 80))
在這個例子中,我們使用socket.connect連接百度網站的80端口。當連接成功建立時,socket.connect會返回一個值表示連接已經建立成功。
七、socket.connect超時
當連接的目標IP和端口不可用時,socket.connect將會發生超時。超時的時長取決於系統的超時設置。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) try: s.connect(("www.bing.com", 80)) except socket.error as e: print("Connect error:", e) except socket.timeout as e: print("Connect timeout:", e)
在這個例子中,我們使用socket.connect連接必應網站的80端口,然後手動設置了超時時間為5秒。當連接超過5秒仍然沒有建立成功時,socket.connect將會拋出一個socket.timeout異常。
八、socket connection refused
當目標IP和端口正在被佔用或者沒有被正確配置時,socket.connect將會拋出一個socket.error異常,表示連接被拒絕。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect(("127.0.0.1", 9999)) #嘗試連接一個不存在的地址 except socket.error as e: print("Connect error:", e)
在這個例子中,我們使用socket.connect嘗試連接一個不存在的地址。這將會導致socket.connect拋出一個socket.error異常,表示連接被拒絕。
九、socket connect error
當連接建立失敗,socket.connect將會拋出socket.error異常。
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect(("www.google", 80)) #注意google地址的錯誤格式 except socket.error as e: print("Connect error:", e)
在這個例子中,我們使用socket.connect連接一個錯誤的地址。這將導致socket.connect拋出socket.error異常,表示連接建立失敗。
十、socket connection reset
when the socket’s peer abruptly closed the connection while the data was still being sent, the recv function ran out of data to return and returned a null bytes object b”.
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.google.com", 80)) try: s.sendall(b'GET / HTTP/1.1\r\n\r\n') data = s.recv(1024) except socket.error as e: print("Socket error:", e) else: print(data)
在這個例子中,我們使用socket.connect連接谷歌網站的80端口,然後通過s.sendall方法向服務器發送了一個HTTP請求。但是在數據還沒有接收完成之前,服務器主動關閉了連接,這將導致socket.recv()拋出一個socket.error錯誤,表示連接被強制重置。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/200592.html