2011-08-26 46 views
4

我有客戶端代碼,它使用UDP和recvfrom()從服務器獲取響應。這在服務器開啓時工作正常,但是一旦我停止服務器,我的客戶端程序掛起;我懷疑recvfrom()正在等待來自服務器的響應。Recvfrom()掛起 - 服務器關閉時如何處理此問題

如果服務器和客戶端都安裝在同一個系統上,他們在服務器關閉時從recvfrom()得到錯誤,但是當服務器和客戶端在不同的系統上時,客戶端在recvfrom()處掛起,自OFF以來服務器沒有響應。

請有人可以給我想法我怎麼能處理這種情況,也許一個定時器信號interuption可以解決這個問題..任何人都可以拋出一些光?

我使用Visual Studio 2005

回答

4

您的來電阻塞,因爲此套接字沒有數據現在。當服務器打開時,發送數據的速度足夠快,以便recvfrom呼叫獲得並快速返回。當服務器關閉時,沒有人發送數據和recvfrom永遠等待。無論服務器是打開還是關閉都沒關係,recvfrom在兩種情況下都做同樣的事情;你只是沒有注意到第一種情況下的延遲。

您需要使用非阻塞插座。在非阻塞模式下,recvfrom將在沒有數據時返回錯誤,而不是等待。然後您可以使用select呼叫進入休眠狀態,直到發生超時或數據到達。

+0

謝謝,非阻塞模式爲我工作 –

+0

供未來用戶使用。有關如何製作套接字非阻塞的示例,請參閱以下ioctlsocket函數的MSDN文檔:http://msdn.microsoft.com/en-us/library/windows/desktop/ms738573%28v=vs.85%29。 ASPX – Ian