Windows 在插座后处理timout';s(Winsock)阻止接收呼叫

Windows 在插座后处理timout';s(Winsock)阻止接收呼叫,windows,winsock,Windows,Winsock,关于 所以 阻止接收呼叫的超时(以毫秒为单位)。默认值 此选项的值为零,表示接收操作将 没有暂停。如果阻塞接收呼叫超时,则连接将中断 处于不确定状态,应关闭 这是否意味着如果某个套接字的recv调用超时,我将丢弃该套接字(无零SO_RCVTIMEO) 有没有解释为什么连接处于不确定状态? 没有数据可以从发送方接收,不是吗?这意味着状态是不确定的。也许根本没有数据。也许套接字正处于接收/解析尚未准备好的数据包的中间。您不知道在超时时套接字在内部做什么。因此,是的,国家是不确定的。处理超时的一种更安

关于

所以

阻止接收呼叫的超时(以毫秒为单位)。默认值 此选项的值为零,表示接收操作将 没有暂停。如果阻塞接收呼叫超时,则连接将中断 处于不确定状态,应关闭

这是否意味着如果某个套接字的
recv
调用超时,我将丢弃该套接字(无零SO_RCVTIMEO)

有没有解释为什么连接处于不确定状态?
没有数据可以从发送方接收,不是吗?

这意味着状态是不确定的。也许根本没有数据。也许套接字正处于接收/解析尚未准备好的数据包的中间。您不知道在超时时套接字在内部做什么。因此,是的,国家是不确定的。处理超时的一种更安全的方法是使用
select()
(或等效工具),在您尝试读取数据之前检测数据的存在。@RemyLebeau谢谢,“连接……应该关闭。”这句话让我很困惑。听起来,如果我在超时后不关闭连接,它将有未定义的行为。这意味着状态是不确定的。也许根本没有数据。也许套接字正处于接收/解析尚未准备好的数据包的中间。您不知道在超时时套接字在内部做什么。因此,是的,国家是不确定的。处理超时的一种更安全的方法是使用
select()
(或等效工具),在您尝试读取数据之前检测数据的存在。@RemyLebeau谢谢,“连接……应该关闭。”这句话让我很困惑。听起来,如果我在超时后不关闭连接,它将有未定义的行为。