我应该使用 AcceptEx() 还是 WSAAccept()?

Should I use AcceptEx() or WSAAccept()?

我正在使用 Overlapped IO,我想使用阻塞调用来接受客户端连接,就像我处理普通 accept() 一样。我不确定,但我认为 AcceptEx() 不会阻塞,而 WSAAccept() 会。那么 WSAAccept()accept() 相似吗?

accept()WSAAccept() 都会阻塞,除非您使用 ioctlsocket 将侦听器设置为非阻塞模式。因此,您可以使用其中任何一个在阻塞时接受客户端。

但是,如果您使用 WSAEventSelect 在您的侦听器上针对 FD_ACCEPT 注册事件,您将获得更多控制权。当客户端准备好被接受而不阻塞时,您的事件将被设置。

然后您可以将此事件与超时或其他事件结合起来,如果您想在 WaitForMultipleObjectsEx.[=16 的调用中取消监听(例如在应用程序退出时),您可以发出信号=]

为什么要使用阻塞调用?

如果您正在使用 I/O 完成端口,那么处理连接建立的最佳方法是使用 AcceptEx() 而不是在连接时等待数据。这样做的原因是使用 AcceptEx() 意味着您不需要单独的线程来处理连接建立(即正常的 "accept loop"),从而减少了不必要的上下文切换。

如果连接已连接但不发送数据,AcceptEx() 的 'accept and read data' 选项可能会使您面临拒绝服务攻击,除非添加管家线程,否则很难防范这种情况这首先违背了使用 AcceptEx() 的目的...