http://tangentsoft.net/wskfaq/newbie.html#timeout
2.15 - Как изменить время ожидания для функции Winsock?
В некоторые блокирующие функции Winsock (например, connect ()) встроен тайм-аут. Теория, лежащая в основе этого, состоит в том, что только стек имеет всю информацию, необходимую для установки правильного времени ожидания. Тем не менее, некоторые люди считают, что значение, которое использует стек, слишком велико для их приложения; это может быть минутой или дольше.
Вы можете настроить таймауты send () и recv () с помощью параметров setsockopt () SO_SNDTIMEO и SO_RCVTIMEO. .
Для других функций 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 вместо того, чтобы использовать эту функцию в своем коде.