是否格制化FD_CLOSE事件仅在套接字中没有缓冲数据时才会发布?

问题描述 投票:1回答:1

我们使用WSAEventSelect将socket与事件绑定在一起。并从MSDN

当接收到对应于套接字的虚拟电路的关闭指示时,记录FD_CLOSE网络事件。在TCP术语中,这意味着当连接进入TIME WAIT或CLOSE WAIT状态时会记录FD_CLOSE。这是由于远程端在发送端或关闭插槽上执行关闭。从套接字读取所有数据后发布FD_CLOSE。应用程序应在收到FD_CLOSE时检查剩余数据,以避免丢失数据的可能性。有关更多信息,请参阅“正常关闭”,“延迟选项”和“套接字关闭”部分以及关闭功能。

接缝第一个突出显示句子意味着只有在从套接字读取所有数据后才会发布FD_CLOSE。但第二句要求应用程序需要在收到FD_CLOSE时检查套接字中是否有数据。这不是冲突吗?怎么理解呢?

windows sockets winapi network-programming
1个回答
0
投票

不幸的是,有很多猜测和很少的官方消息。我的理解如下:

从套接字读取所有数据后发布FD_CLOSE。

编辑:我在这里的原始回答似乎是错误的。我相信这个陈述是指一种特定类型的套接字闭包,但似乎并没有就究竟是什么达成一致。预计这应该是真的,但经验表明它并不总是如此。

应用程序应在收到FD_CLOSE时检查剩余数据,以避免丢失数据的可能性。

在您的应用程序代码收到FD_CLOSE事件时,可能仍有数据可用。事实上,四处阅读表明收到FD_CLOSE后,套接字上可能会有新数据可用。您应检查此数据以避免丢失。我见过一些人实现recv循环,直到recv调用失败(表明套接字实际上已关闭),甚至重启事件循环等待更多的FD_READ。我认为在一般情况下你可以简单地尝试一个具有足够大的缓冲区的recv,并假设没有更多的东西会到达。

© www.soinside.com 2019 - 2024. All rights reserved.