常見socket讀寫異常及錯誤

2021-07-04 11:29:43 字數 2097 閱讀 4175

eagain的錯誤:一般是對非阻塞埠讀寫產生的錯誤。

1、傳送產生:傳送緩衝區剩餘空間小於傳送包大小。可以通過修改 tcp_sendspace,使之大於send中的size引數   ---no -p -o tcp_sendspace=65536 

2、接收產生:errno**為11,算是異常,等待再次觸發讀取。

eintr:errno=4,錯誤描述interrupted system call,操作也應該繼續。

econnaborted

該錯誤被描述為「software caused connection abort」,即「軟體引起的連線中止」。原因在於當服務和客戶程序在完成用於 tcp 連線的「三次握手」後,客戶 tcp 卻傳送了乙個 rst (復位)分節,在服務程序看來,就在該連線已由 tcp 排隊,等著服務程序呼叫 accept 的時候 rst 卻到達了。posix 規定此時的 errno 值必須 econnaborted。源自 berkeley 的實現完全在核心中處理中止的連線,服務程序將永遠不知道該中止的發生。伺服器程序一般可以忽略該錯誤,直接再次呼叫accept。

econnreset 不在tcp_syn_sent狀態收到的rst

該錯誤被描述為「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 則是乙個錯誤。

econnrefused

在tcp_syn_sent狀態收到的rst,一般說明對方沒有對應的監聽服務。

etimedout

錯誤被描述為「connect time out」,即「連線超時」,這種情況一般發生在伺服器主機崩潰。此時客戶 tcp 將在一定時間內(依具體實現)持續重發資料分節,試圖從服務 tcp 獲得乙個 ack 分節。當最終放棄嘗試後(此時伺服器未重新啟動),核心將會向客戶程序返回 etimedout 錯誤。如果某個中間路由器判定該伺服器主機已經不可達,則一般會響應「destination unreachable」-「目的地不可達」的icmp訊息,相應的客戶程序返回的錯誤是 ehostunreach 或enetunreach。當伺服器重新啟動後,由於 tcp 狀態丟失,之前所有的連線資訊也不存在了,此時對於客戶端發來請求將回應 rst。如果客戶程序對檢測伺服器主機是否崩潰很有必要,要求即使客戶程序不主動傳送資料也能檢測出來,那麼需要使用其它技術,如配置 so_keepalive socket 選項,或實現某些心跳函式。

ehosttunreach   enetunreach

no route to host(軟錯)路由上引發了乙個目的地不可達的icmp錯誤 其中(1)(3),客戶端會進行定時多次重試,一定次數後才返回錯誤。

rst:產生條件

:1、伺服器收到syn,但沒有對應監聽服務,返回rst。這時客戶端返回 econnrefused,三次握手失敗。

2、tcp想取消乙個已有連線。收到方返回 econnreset 。

3、tcp收到乙個根本不存在連線的分節。可能是伺服器重啟了,丟失之前已經連線資訊。收到方返回 econnreset 。

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

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

pl sql常見錯誤異常

1.錯 誤 名 稱 錯誤 錯 誤 含 義 2.cursor already open ora 06511 試圖開啟已經開啟的游標 3.invalid cursor ora 01001 試圖使用沒有開啟的游標 4.dup val on index ora 00001 儲存重複值到惟一索引約束的列中 5...

csdn讀寫分離常見錯誤

關閉所有伺服器防火牆selinux 啟動時出現錯誤,沒有辦法啟動兩個程序 檢查配置檔案,建議直接使用我的配置檔案,成功啟動後再自行修改,這樣可以排除其他環節有錯 在第八步登入時無法登入,檢測網路是否通暢,可以使用ping命令,檢測防火牆 登入後無法use到庫中,檢查主從兩個庫是否有建立配置檔案中對應...