我正在使用重叠IO,我希望能够使用阻塞调用来接受客户端连接,就像我使用普通的accept()
一样。我不确定,但我认为AcceptEx()
不会阻塞,而WSAAccept()
会阻塞。那么,WSAAccept()
是否类似于accept()
呢?
我正在使用重叠IO,我希望能够使用阻塞调用来接受客户端连接,就像我使用普通的accept()
一样。我不确定,但我认为AcceptEx()
不会阻塞,而WSAAccept()
会阻塞。那么,WSAAccept()
是否类似于accept()
呢?
accept()
和 WSAAccept()
都会阻塞,除非您使用 ioctlsocket
将侦听器设置为非阻塞模式。因此,在阻塞的情况下,您可以使用其中任何一个接受客户端。
但是,如果您使用 WSAEventSelect
对监听器上的 FD_ACCEPT
注册事件,您将获得更多控制权。当客户端准备好被接受时,您的事件将被设置而不会阻塞。
然后,您可以在调用 WaitForMultipleObjectsEx
时将此事件与超时或其他事件(例如在应用程序退出时)结合使用以取消监听。
为什么你想使用阻塞调用?
如果你正在使用I/O完成端口,处理连接建立的最佳方式是使用AcceptEx()
而不是等待连接及数据。原因在于使用AcceptEx()
意味着你不需要一个单独的线程来处理连接建立(即正常的“接受循环”),这减少了不必要的上下文切换。
AcceptEx()
的“接受和读取数据”选项可能会让你面临拒绝服务攻击,如果连接并未发送数据,则很难防范,除非添加一个管家线程,但这违背了首先使用AcceptEx()
的目的......