Socket 連線錯誤及原因

2022-06-16 04:03:09 字數 1792 閱讀 2542

econnaborted

該錯誤被描述為「software caused connection abort」,即「軟體引起的連線中止」。原因在於當服務和客戶程序在完成用於 tcp 連線的「三次握手」後,客戶 tcp 卻傳送了乙個 rst (復位)分節,

在服務程序看來,就在該連線已由 tcp 排隊,等著服務程序呼叫 accept 的時候 rst 卻到達了。posix 規定此時的 errno 值必須 econnaborted。

源自 berkeley 的實現完全在核心中處理中止的連線,服務程序將永遠不知道該中止的發生。伺服器程序一般可以忽略該錯誤,直接再次呼叫accept。

econnreset

該錯誤被描述為「connection reset by peer」,即「對方復位連線」,這種情況一般發生在服務程序較客戶程序提前終止。

當服務程序終止時會向客戶 tcp 傳送 fin 分節,客戶 tcp 回應 ack,服務 tcp 將轉入 fin_wait2 狀態。此時如果客戶程序沒有處理該 fin (如阻塞在其它呼叫上而沒有關閉 socket 時),

則客戶 tcp 將處於 close_wait 狀態。當客戶程序再次向 fin_wait2 狀態的服務 tcp 傳送資料時,則服務 tcp 將立刻響應 rst。

一般來說,這種情況還可以會引發另外的應用程式異常,客戶程序在傳送完資料後,往往會等待從網路io接收資料,很典型的如 read 或 readline 呼叫,

此時由於執行時序的原因,如果該呼叫發生在 rst 分節收到前執行的話,那麼結果是客戶程序會得到乙個非預期的 eof 錯誤。

此時一般會輸出「server terminated prematurely」-「伺服器過早終止」錯誤。

epipe

錯誤被描述為「broken pipe」,即「管道破裂」,這種情況一般發生在客戶程序不理會(或未及時處理)socket 錯誤,繼續向服務 tcp 寫入更多資料時,核心將向客戶程序傳送 sigpipe 訊號,

該訊號缺省會使程序終止(此時該前台程序未進行 core dump)。結合上邊的 econnreset 錯誤可知,向乙個 fin_wait2 狀態的服務 tcp(已 ack 響應 fin 分節)寫入資料不成問題,

但是寫乙個已接收了 rst 的 socket 則是乙個錯誤。

etimedout

錯誤被描述為「connect time out」,即「連線超時」,這種情況一般發生在伺服器主機崩潰。此時客戶 tcp 將在一定時間內(依具體實現)持續重發資料分節,

試圖從服務 tcp 獲得乙個 ack 分節。當最終放棄嘗試後(此時伺服器未重新啟動),核心將會向客戶程序返回 etimedout 錯誤。

如果某個中間路由器判定該伺服器主機已經不可達,則一般會響應「destination unreachable」-「目的地不可達」的icmp訊息,

相應的客戶程序返回的錯誤是 ehostunreach 或enetunreach。當伺服器重新啟動後,由於 tcp 狀態丟失,之前所有的連線資訊也不存在了,

此時對於客戶端發來請求將回應 rst。如果客戶程序對檢測伺服器主機是否崩潰很有必要,要求即使客戶程序不主動傳送資料也能檢測出來,

那麼需要使用其它技術,如配置 so_keepalive socket 選項,或實現某些心跳函式。

enoprotoopt

該錯誤不是乙個 socket 連線相關的錯誤。errno 給出該值可能由於,

通過 getsockopt 系統呼叫來獲得乙個套接字的當前選項狀態時,如果發現了系統不支援的選項引數就會引發該錯誤。

幾個常見的 Socket 連線錯誤及原因

下面列出了幾個在客戶與服務程序連線中常見的幾個 socket 錯誤,並分析了原因。後續再逐漸補充吧。該錯誤被描述為 software caused connection abort 即 軟體引起的連線中止 原因在於當服務和客戶程序在完成用於 tcp 連線的 三次握手 後,客戶 tcp 卻傳送了乙個 ...

寬頻連線錯誤769產生原因

通常,如果存在下列情況之一,您將收到錯誤769的資訊 1.網路電纜已斷開。2.數據機已禁用。3.數據機驅動程式已損壞。4.計算機上正在執行間諜軟體,它妨礙了連線。5.winsock 需要得到修復。6.第三方防火牆軟體阻止了連線。解決方案 要查詢問題的原因,請按照下列步驟操作。步驟 1 確保網路電纜已...

oj上常見錯誤及錯誤原因總結!

很顯然,就是這幾種情況 錯多了,我比誰都清楚,害!1.正確 啥也別說了,請再接再厲!2.格式錯誤 答案基本正確,但格式不對!沒有換行,沒有空格,多輸出了東西都是有可能的。3.答案錯誤 千萬不要覺得你在你的 自家 編譯器上執行的很好,而且試了一下示例全部和oj上一樣你就對了,其實你想多了。當然出現這種...