4

我正在使用 Overlapped IO,我想使用阻塞调用来接受客户端连接,就像我使用普通的accept(). 我不确定,但我认为这AcceptEx()不会阻塞,而WSAAccept()会阻塞。那么WSAAccept()类似于accept()?

4

2 回答 2

3

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

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

然后,您可以将此事件与超时或其他事件结合起来,如果您想在调用WaitForMultipleObjectsEx.

于 2015-02-25T14:44:14.633 回答
1

为什么要使用阻塞呼叫?

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

如果连接连接但不发送数据,则“接受和读取数据”选项AcceptEx()可能会使您面临拒绝服务攻击,除非您添加一个破坏了使用目的的管家线程,否则很难防范它AcceptEx()。地方...

于 2015-02-25T22:26:58.783 回答