Linux SIGPIPE訊號
在 TCP 通訊雙方中,為了描述方便,以下將通訊雙方以 A 和 B 取代。
根據TCP協定規定,如果A關閉連線後B繼續發送數據,B會收到A的RST回應。若B繼續發送數據,系統會發出SIGPIPE訊號告知連接已斷開,停止發送。
系統對 SIGPIPE 訊號的預設處理行為是讓 B 進程退出。
作業系統對 SIGPIPE 訊號的這種預設處理行為非常不友好,讓我們來分析一下。
#TCP通訊是全雙工頻道,相當於兩條單工頻道,連接兩端各負責一條。
當對端「關閉」時, 雖然本意是關閉整個兩個頻道,但本端只是收到 FIN 包。
根據TCP協定的規定,當一端關閉其負責的單向通道時,仍可接收資料但不再發送資料。
也就是說,因為 TCP 協定的限制,通訊一方無法獲知對端的 socket 是呼叫了 close 還是 shutdown。
int shutdown(int socket, int how);
shutdown 函數的參數 how 可設定為關閉 SHUT_RD、SHUT_WR 或 SHUT_RDWR 用於表示關閉收、發送單一通道或同時關閉收發通道。
對一個已經收到 FIN 套件的 socket 呼叫 read/recv 方法, 如果接收緩衝已空,則傳回 0,這就是常說的表示連線關閉。但第一次對其呼叫 write/send 方法時,如果發送緩衝沒問題,會傳回正確寫入(即 write/send 函數傳回值大於 0),但發送的封包會導致對端回應 RST 封包。因為上一次程式呼叫 write/send 是正常的,再次嘗試呼叫 write/send 函數時因產生 SIGPIPE 訊號導致進程退出。
這種預設行為對於我們開發程序,尤其是對於後端服務,需要同時對許多客戶端服務,不能因為與某一個客戶端的連接出問題了而導致整個進程退出不能繼續為其他客戶端服務。
為了避免這種現像出現, 可以捕獲 SIGPIPE 訊號並對其進行處理或忽略該訊號, 忽略該訊號代碼如下:
signal(SIGPIPE, SIG_IGN);
這樣設定後,第二次呼叫 write/send 方法時,會回傳 -1,同時 errno 錯誤碼被置為 SIGPIPE,程式便能知道對端已經關閉。
以上是Linux SIGPIPE訊號的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

win10如何重置tcp/ip協定?其實方法很簡單的,使用者可以直接的進入到命令提示符,然後按下ctrl shift enter的組合鍵來進行操作就可以了或者是直接的執行重置命令來進行設置,下面就讓本站來為使用者來仔細的介紹一下windows10重置tcp/ip協定棧的方法吧。 windows10重置tcp/ip協定棧的方法一、管理員權限1、我們使用快捷鍵win R直接開啟運行窗口,然後輸入cmd並按住ctrl shift enter的組合鍵。 2、或者我們可以直接在開始選單中搜尋命令提示符,右鍵點

TCP客戶端一個使用TCP協定實現可連續對話的客戶端範例程式碼:importsocket#客戶端設定HOST='localhost'PORT=12345#建立TCP套接字並連接伺服器client_socket=socket.socket(socket.AF_INET,socket .SOCK_STREAM)client_socket.connect((HOST,PORT))whileTrue:#取得使用者輸入message=input("請輸入要傳送的訊息:&

假設Kubernetes叢集已經配置好,我們將基於CentOS為Nginx建立一個虛擬機器。以下是實驗中設定的詳細資訊:Nginx(CenOS8Minimal)–192.168.1.50KubeMaster–192.168.1.40KubeWorker1–192.168.1.41KubeWorker2–192.168.192.168.1.41KubeWorker2–192.168.1.421)所以需要安裝e

那這裡面提到的"面向連接",意味著需要 建立連接,使用連接,釋放連接。建立連線是指我們熟知的TCP三次握手。而使用連接,則是透過一發送、一確認的形式,進行資料傳輸。還有就是釋放連接,也就是我們常見的TCP四次揮手。

使用一個TCP連線發送多個檔案為什麼會有這篇部落格?最近在看一些相關方面的東西,簡單的使用一下Socket進行程式設計是沒有的問題的,但是這樣只是建立了一些基本概念。對於真正的問題,還是無能為力。當我需要進行檔案的傳輸時,我發現我好像只是發送過去了資料(二進位資料),但是關於檔案的一些資訊卻遺失了(檔案的副檔名)。而且每次我只能使用一個Socket發送一個文件,沒有辦法做到連續發送文件(因為我是依靠關閉流來完成發送文件的,也就是說我其實是不知道文件的長度,所以只能以一個Socket連接代表一個檔案)。

曾經有這麼一道經典面試題:從 URL 在瀏覽器被輸入到頁面展現的過程中發生了什麼事?相信大多數準備過的同學都能回答出來,但如果繼續問:收到的HTML 如果包含幾十個圖片標籤,這些圖片是以什麼方式、什麼順序、建立了多少連接、使用什麼協議被下載下來的呢?

在TCP通信雙方中,為了描述方便,以下將通信雙方用A和B代替。根據TCP協定規定,如果A關閉連線後B繼續發送數據,B會收到A的RST回應。若B繼續發送數據,系統會發出SIGPIPE訊號告知連接已斷開,停止發送。系統對SIGPIPE訊號的預設處理行為是讓B進程退出。作業系統對SIGPIPE訊號的這種預設處理行為非常不友好,讓我們來分析一下。 TCP通訊是全雙工頻道,相當於兩條單工頻道,連線兩端各負責一條。當對端「關閉」時,雖然本意是關閉整個兩條頻道,但本端只是收到FIN包。依TCP協議的規定,當一

資料通訊中的頻道傳輸速率單位是bps,它表示“位元/秒”或“位元/秒”,即資料傳輸速率在數值上等於每秒鐘傳輸構成資料代碼的二進位位元數,也稱為“位元率」。比特率表示單位時間內傳送比特的數目,用於衡量數位資訊的傳送速度;根據每幀影像儲存時所佔的比特數和傳輸比特率,可以計算數位影像資訊傳輸的速度。
