我使用文件描述符来查找可读套接字并继续阅读。由于某些原因,线路上没有数据的套接字继续读取并且永不返回。有没有办法可以在超时后退出接收?
我正在使用winsock库..
答案 0 :(得分:10)
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的自然超时到期而不是在代码中接管此功能。