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

时间:2015-02-25 13:06:42

标签: c++ sockets winapi network-programming overlapped-io

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

2 个答案:

答案 0 :(得分:1)

除非您使用accept()将侦听器设置为非阻止模式,否则

WSAAccept()ioctlsocket都会阻止。所以你可以使用其中任何一个来阻止客户端。

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

然后,您可以将此事件与超时或其他事件相结合,如果要在WaitForMultipleObjectsEx的调用中取消侦听(例如,在应用程序退出时),则可以发出信号。

答案 1 :(得分:1)

为什么要使用阻止呼叫?

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

如果连接连接并且不发送数据,AcceptEx()的'接受和读取数据'选项可以打开你的拒绝服务攻击,除非你添加一个内务处理线程,否则很难防范它首先违背了使用AcceptEx()的目的......