2009-09-10 169 views
0

現在我已經有了一個簡單的TCP服務器/客戶端。我建立了這樣的連接,當客戶端連接時它會被分叉(),並且連接本身被置於一個無限循環中,以便連接保持打開狀態。服務器正在接收來自客戶端的信息,我有一個檢查以確保接收到的字節數大於0.到目前爲止,在確定客戶端是否已斷開連接方面,這一直運行良好。但是,如果服務器斷開連接,客戶端也會關閉,但不會設置errno。我該如何檢查以確保服務器仍然連接?如何處理服務器關閉TCP

+0

你的Q不是很清楚。您想確保服務器在向客戶端傳輸信息時保持連接狀態嗎? – chutsu

+0

您是否在問如何判斷TCP連接的遠端是否已關閉? –

+0

是的,如果服務器隨機斷開連接,我想知道如何處理客戶端。 – whatWhat

回答

1

當另一端斷開連接時,套接字將變爲可讀(讀取套接字將不會阻塞)並且read()將返回0。這是通常檢測到斷開連接的方式(聽起來您已經在服務器端執行此操作)。

如果你封鎖在write()或嘗試write由另一方封閉的插座上,你的過程將免費獲贈SIGPIPE信號和write將與errno集中返回-1EPIPE

SIGPIPE的默認操作是終止進程,所以如果你沒有改變這個過程,你的客戶端會在它試圖寫入已經消失的服務器時死掉。

+0

就在我讀這個答案之前,我記得通過gdb運行它,看到它是sigpipe。我會給你信貸信用雖然到期。謝謝! – whatWhat