socket.connect詳細闡述

一、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-tw/n/200592.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-05 20:01
下一篇 2024-12-05 20:01

相關推薦

  • Python中使用socket傳輸圖片

    本文將從多個方面介紹如何使用Python中的socket模塊傳輸圖片,涉及到準備工作、發送方部分和接收方部分的詳細代碼實現。 一、準備工作 在使用Python中的socket模塊進…

    編程 2025-04-28
  • Taro使用Connect實現數據流管理

    本文將詳細介紹如何使用Taro和Connect,實現數據流管理,便於開發人員在創建React應用時維護它們的數據流。Connect是Redux提供的一個應用於React組件的輔助工…

    編程 2025-04-28
  • Python Socket阻塞問題的解析

    本文將從多個方面對Python socket阻塞問題進行詳細闡述,包括阻塞的原因、影響、解決方法等等。 一、阻塞的原因 阻塞是指在等待某個事件的過程中,該進程無法處理其他任務,直到…

    編程 2025-04-27
  • C# Socket關閉後客戶端仍可連接的解決方法

    對於C# Socket通信中的一些問題,多數人可能已經熟知,但是有些問題仍然困擾著一部分人,例如Socket關閉後,客戶端仍然可以連接。本篇文章將在此問題為中心,圍繞該問題的原因和…

    編程 2025-04-27
  • index.html怎麼打開 – 詳細解析

    一、index.html怎麼打開看 1、如果你已經擁有了index.html文件,那麼你可以直接使用任何一個現代瀏覽器打開index.html文件,比如Google Chrome、…

    編程 2025-04-25
  • Resetful API的詳細闡述

    一、Resetful API簡介 Resetful(REpresentational State Transfer)是一種基於HTTP協議的Web API設計風格,它是一種輕量級的…

    編程 2025-04-25
  • neo4j菜鳥教程詳細闡述

    一、neo4j介紹 neo4j是一種圖形資料庫,以實現高效的圖操作為設計目標。neo4j使用圖形模型來存儲數據,數據的表述方式類似於實際世界中的網路。neo4j具有高效的讀和寫操作…

    編程 2025-04-25
  • 關鍵路徑的詳細闡述

    關鍵路徑是項目管理中非常重要的一個概念,它通常指的是項目中最長的一條路徑,它決定了整個項目的完成時間。在這篇文章中,我們將從多個方面對關鍵路徑做詳細的闡述。 一、概念 關鍵路徑是指…

    編程 2025-04-25
  • AXI DMA的詳細闡述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基於AMBA…

    編程 2025-04-25
  • c++ explicit的詳細闡述

    一、explicit的作用 在C++中,explicit關鍵字可以在構造函數聲明前加上,防止編譯器進行自動類型轉換,強制要求調用者必須強制類型轉換才能調用該函數,避免了將一個參數類…

    編程 2025-04-25

發表回復

登錄後才能評論