如果我的問題重複,我真的很抱歉,但我沒有在網站中找到有用的信息。檢測非阻塞套接字上的關閉連接
我使用非阻塞套接字和select()。如何檢測客戶端是否關閉了非阻塞套接字上的連接?當沒有數據可用於讀取並且連接關閉時,我發現read()返回-1時,errno = EWOULDBLOCK。
如何區分上述情況?
如果我的問題重複,我真的很抱歉,但我沒有在網站中找到有用的信息。檢測非阻塞套接字上的關閉連接
我使用非阻塞套接字和select()。如何檢測客戶端是否關閉了非阻塞套接字上的連接?當沒有數據可用於讀取並且連接關閉時,我發現read()返回-1時,errno = EWOULDBLOCK。
如何區分上述情況?
當同伴關閉連接時:
select()
將返回可讀的套接字。recv()
或read()
在套接字上將返回零。我看到一個read()返回-1,並將errno = EWOULDBLOCK時沒有的數據都是可被讀取
正確,但連接不會關閉。
以及連接關閉時。
不,你沒有。這是不正確的。它返回零。
如何區分上述情況?
他們是不一樣的,他們不以相同的方式表現自己。
你是對的!我剛做了一個玩具客戶端 - 服務器應用程序,它和你一樣工作,並解釋了alk。在我的原始應用程序中,我收集來自瀏覽器的連接,並且我已經看到創建了一個線程來從服務器獲取每個圖像。是否有可能當線程得到圖像時,它不關閉套接字/連接? –
是的,這是HTTP保持活着的效果。但是,如果你正在發送,你不需要擔心接收時會發生什麼。發送圖像時請關閉套接字。 – EJP
nope,我的應用程序位於服務器端和客戶端之間。它的工作原理類似於貨運代理商,即它必須收集從一側到達的數據,然後將數據轉發到另一側。我的轉發器應用程序應該能夠檢測客戶端何時關閉連接,因爲我需要關閉無用的套接字和無用的線程(我的意思是線程完成了他們的工作)。 因此,如果我使用HTTP保持活動,是否沒有辦法檢測線程工作的結束? –