我应该使用 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()
的目的...
我正在使用 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()
的目的...