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。
标题也许说明了一切?
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 setO_NONBLOCK
.
它还设置了 SO_REUSEADDR
。
listen()
的 queue 深度为 5。
您需要使用选项 SO_ERROR
在侦听套接字上调用 getsockopt()
。
WSAGetLastError()
中的零指的是 select()
不返回 -1。