2015-05-09 106 views
4

如果我的問題重複,我真的很抱歉,但我沒有在網站中找到有用的信息。檢測非阻塞套接字上的關閉連接

我使用非阻塞套接字和select()。如何檢測客戶端是否關閉了非阻塞套接字上的連接?當沒有數據可用於讀取並且連接關閉時,我發現read()返回-1時,errno = EWOULDBLOCK。

如何區分上述情況?

回答

2

當同伴關閉連接時:

  1. select()將返回可讀的套接字。
  2. A recv()read()在套接字上將返回零。

我看到一個read()返回-1,並將errno = EWOULDBLOCK時沒有的數據都是可被讀取

正確,但連接不會關閉。

以及連接關閉時。

不,你沒有。這是不正確的。它返回零。

如何區分上述情況?

他們是不一樣的,他們不以相同的方式表現自己。

+0

你是對的!我剛做了一個玩具客戶端 - 服務器應用程序,它和你一樣工作,並解釋了alk。在我的原始應用程序中,我收集來自瀏覽器的連接,並且我已經看到創建了一個線程來從服務器獲取每個圖像。是否有可能當線程得到圖像時,它不關閉套接字/連接? –

+0

是的,這是HTTP保持活着的效果。但是,如果你正在發送,你不需要擔心接收時會發生什麼。發送圖像時請關閉套接字。 – EJP

+0

nope,我的應用程序位於服務器端和客戶端之間。它的工作原理類似於貨運代理商,即它必須收集從一側到達的數據,然後將數據轉發到另一側。我的轉發器應用程序應該能夠檢測客戶端何時關閉連接,因爲我需要關閉無用的套接字和無用的線程(我的意思是線程完成了他們的工作)。 因此,如果我使用HTTP保持活動,是否沒有辦法檢測線程工作的結束? –

0

當對端已關閉特定套接字的連接時,在此套接字上調用read()將返回0。這種行爲與套接字的阻塞狀態無關。

man 2 read斜體由我):

返回值

如果成功,則返回的字節數讀(零表示文件末)

+0

*任何*呼叫返回零。如果第一次調用返回零,它將表示非常不尋常的情況下關閉而不發送任何東西。一旦零返回,它將繼續返回。 – EJP

+0

刪除了刪除。沒有人關心之前的錯誤,如果他們確實在編輯歷史記錄中可用。 – EJP

+0

@EJP:謝謝,我只是把它留在避免懸而未決的評論。 :-)因此,讓我們清理註釋... – alk