2011-07-20 40 views

回答

9

http://tangentsoft.net/wskfaq/newbie.html#timeout

2.15 - 我怎樣才能改變一個Winsock函數的超時?

一些阻塞的Winsock函數(例如connect())有一個超時嵌入到它們中。這背後的理論是,只有堆棧具有設置適當超時所需的全部信息。然而,有些人發現堆棧使用的價值對於他們的應用來說太長了;它可以是一分鐘或更長時間。

您可以使用SO_SNDTIMEO和SO_RCVTIMEO setsockopt()選項來調整send()和recv()超時。 。

對於其他Winsock函數,最好的解決方案是避免完全阻塞套接字。所有的非阻塞套接字方法提供了一些用於創建自定義的超時:

Non-blocking sockets with select() – The fifth parameter to the select() function is a timeout value. 

Asynchronous sockets – Use the Windows API SetTimer(). 

Event objects – WSAWaitForMultipleEvents() has a timeout parameter. 

Waitable Timers – Call CreateWaitableTimers() to make a waitable timer, which you can then pass to a function like WSAEventSelect() along with your sockets: if none of the sockets is signalled before the timer goes off, the blocking function will return anyway. 

注意,異步和非阻塞套接字,你可以完全避免處理超時。即使在Winsock忙碌的情況下,您的程序也能繼續工作所以,你可以讓用戶取消一個需要很長時間的操作,或者讓Winsock的自然超時過期而不是在你的代碼中接管這個功能。