加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

recv()windows socket占用无限时间 – 如何超时?

发布时间:2020-12-14 02:53:37 所属栏目:Windows 来源:网络整理
导读:我使用文件描述符来查找可读的套接字并继续阅读.由于某些原因,线路上没有数据的套接字继续读取并且永不返回.有没有办法可以在超时后退出接收? 我正在使用winsock库.. 解决方法 http://tangentsoft.net/wskfaq/newbie.html#timeout 2.15 – 如何更改Winsock
我使用文件描述符来查找可读的套接字并继续阅读.由于某些原因,线路上没有数据的套接字继续读取并且永不返回.有没有办法可以在超时后退出接收?

我正在使用winsock库..

解决方法

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的自然超时到期而不是在代码中接管此功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读