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

5

我正在使用重叠IO,我希望能够使用阻塞调用来接受客户端连接,就像我使用普通的accept()一样。我不确定,但我认为AcceptEx()不会阻塞,而WSAAccept()会阻塞。那么,WSAAccept()是否类似于accept()呢?

2个回答

3

accept()WSAAccept() 都会阻塞,除非您使用 ioctlsocket 将侦听器设置为非阻塞模式。因此,在阻塞的情况下,您可以使用其中任何一个接受客户端。

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

然后,您可以在调用 WaitForMultipleObjectsEx 时将此事件与超时或其他事件(例如在应用程序退出时)结合使用以取消监听。


1

为什么你想使用阻塞调用?

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

AcceptEx()的“接受和读取数据”选项可能会让你面临拒绝服务攻击,如果连接并未发送数据,则很难防范,除非添加一个管家线程,但这违背了首先使用AcceptEx()的目的......


“AcceptEx()”的“接受并读取数据”选项可能会使您面临拒绝服务攻击。那我为什么要使用“AcceptEx()”呢? - user4582812
你应该使用它,因为它消除了需要专门的接受线程以及所有由此产生的(无意义的)上下文切换。 - Len Holgate
但是你说过“它可能会让你遭受拒绝服务攻击”。 - user4582812
1
只有在等待数据时才能这样做。您可以使用AcceptEx()并提供一个仅包含地址而不提供数据空间的缓冲区,这将像重叠接受一样工作,并且没有DOS问题。 - Len Holgate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接