WIN32 select() 报告 listen() 套接字异常; WSAGetLastError() = 0?

WIN32 select() reports exception on listen() socket; WSAGetLastError() = 0?

标题也许说明了一切?

Windows 10,Visual Studio 社区 2017。

C++ 服务器侦听一个端口,并将生成的 FD 放入一个 fd_set 用于输入,一个用于异常。 select() 被调用。

它 returns,并且连接 accept()ed。它的 FD 也被添加到那两个 fd_sets.

连接正常,结束。然后从两个 fd_sets.

中删除它的 FD

在下次调用 select() 时,我被告知侦听套接字出现异常,但 WSAGetLastError() 为零。

根据我的笔记,监听 FD 已设置 O_NONBLOCK,因为:

There may not always be a connection waiting after select or poll return a readability event, because there might be a subsequent network error. To prevent accept() from blocking we must set O_NONBLOCK.

它还设置了 SO_REUSEADDR

listen() 的 queue 深度为 5。

您需要使用选项 SO_ERROR 在侦听套接字上调用 getsockopt()

WSAGetLastError() 中的零指的是 select() 不返回 -1。