http://tangentsoft.net/wskfaq/newbie.html#timeout
2,15 - Làm thế nào tôi có thể thay đổi thời gian chờ cho một hàm Winsock?
Một số chức năng Winsock chặn (ví dụ: connect()) có thời gian chờ được nhúng vào chúng. Lý thuyết đằng sau điều này là chỉ có ngăn xếp có tất cả các thông tin cần thiết để thiết lập một thời gian chờ thích hợp. Tuy nhiên, một số người thấy rằng giá trị mà ngăn xếp sử dụng quá dài đối với ứng dụng của họ; nó có thể là một phút hoặc lâu hơn.
Bạn có thể điều chỉnh thời gian chờ gửi() và recv() bằng tùy chọn SO_SNDTIMEO và SO_RCVTIMEO setsockopt(). .
Đối với các chức năng Winsock khác, giải pháp tốt nhất là tránh khóa toàn bộ ổ cắm. Tất cả các phương pháp ổ cắm non-blocking cung cấp cách để bạn có thể xây dựng timeouts tùy chỉnh:
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.
Lưu ý rằng với ổ cắm không đồng bộ và non-blocking, bạn có thể để tránh xử lý timeouts hoàn toàn. Chương trình của bạn tiếp tục hoạt động ngay cả khi Winsock đang bận. Vì vậy, bạn có thể để người dùng hủy hoạt động mất quá nhiều thời gian hoặc chỉ để thời gian chờ tự nhiên của Winsock hết hạn thay vì tiếp quản chức năng này trong mã của bạn.
Nguồn
2011-07-20 00:19:52