2012-02-23 29 views
0

我正在寫一個充當服務器的win32控制檯應用程序。我必須設置一個超時接受函數,就像在10秒內沒有連接端口關閉一樣。據我所知,這裏有一些方法:如何設置winsock接受函數超時?

  1. 異步方式。但是我正在編寫一個控制檯應用程序,所以我不能使用wsaasyncselect函數。

  2. 具有選擇功能。但有一句話,這種方式是不安全的。如果一個客戶端發送了一個RST包,然後它離線,select函數認爲這個套接字仍然可讀,並且accept函數將永遠保留在那裏。

  3. 具有報警功能。首先,我嘗試不使用它,因爲它在這樣的應用程序中是意外的,其次我擔心它是否是線程安全的。

所以在這裏我要問你真誠地找到一種方法,讓接受功能超時,誰必須是線程安全的,更好的一個很好的方式。

+0

使套接字非阻塞,並使用'select'。如果沒有東西可以接受,那麼'accept'應該返回一個錯誤,'WSAGetLastError'應該返回'WSAEWOULDBLOCK'。 – 2012-02-23 08:41:26

+0

另外,根據[accept]的文檔(http://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v = vs.85).aspx),如果連接是在你調用'accept'之前終止,它應該返回錯誤'WSAECONNRESET'。 – 2012-02-23 08:43:08

+2

@JoachimPileborg:即使套接字被阻塞,在調用accept()之前仍然可以使用select()。 – 2012-02-23 19:57:58

回答

0

使套接字非阻塞(如@JoachimPileborg建議)。

使插座非阻塞的呼叫是ioctlsocket與FIONBIO參數。

有一個示例程序here