2010-03-10 64 views
22

我知道read()是一個阻塞調用,除非我使套接字非阻塞。所以我期望read()調用請求4K數據應該返回一個正值(讀取的字節數)或錯誤-1(可能的連接重置由客戶端等)。我的問題是:可以在任何情況下read()返回'0'嗎?可以在連接的套接字上讀取()函數返回零字節嗎?

我處理read()方法是這樣的:

if ((readval = read(acceptfd, buf, sizeof(buf) - 1)) < 0) 
    { 

    } 
    else 
    { 
     buf[readval] = 0; 
     //Do some thing with data 
    } 

該代碼炸彈如果閱讀()返回零,我知道如何解決它。但是read()可能返回零嗎?

+0

您是否考慮閱讀* man *頁面? – EJP 2016-01-25 11:23:04

回答

41

當TCP連接在一端關閉時,read()會在另一端返回0字節。

+3

不應該將讀取返回-1並將errno設置爲ECONNRESET?這實際上是一個錯誤條件,如果另一方關閉了連接。我們是否應該考慮返回零也作爲錯誤條件? – kumar 2010-03-10 12:59:47

+6

+1連接關閉時,read()返回零。 – 2010-03-10 13:01:42

+1

@kumar:返回零允許您確定發生有序關閉,而不是真正的錯誤。 – 2010-03-10 13:03:40

相關問題