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