我可以在 IOCP 中使用 accept() 吗?

Posted

技术标签:

【中文标题】我可以在 IOCP 中使用 accept() 吗?【英文标题】:Can I use accept() with IOCP? 【发布时间】:2015-02-22 10:12:16 【问题描述】:

我想使用 IOCP 来处理数百个客户端连接。使用accept()接受这些连接是否有问题,还是我应该使用WSAAccept()

【问题讨论】:

【参考方案1】:

应该没有问题。但是可能会有,因为不应该混合使用 berkley 和 WSA 接口。我在一个项目中混合了套接字和 WSASelect 没有问题,因为返回的 SOCKET 句柄是相同的,无论您使用哪个命令获取它。

但恕我直言,在不必要的地方混合它是一种糟糕的风格。所以如果你已经用过 WSA 风格,那就坚持下去吧。

您还应该查看AcceptEx() 函数。

【讨论】:

【参考方案2】:

使用AcceptEx() 的一个很好的理由是避免使用另一个只会被唤醒以处理新连接的线程。

请注意AcceptEx(),理想情况下,不要使用可用的“接受和读取数据”选项,因为这样可以很容易地通过打开连接而不发送数据和代码来对服务器进行 DOS避免潜在的 DOS 攻击是相当复杂的。

【讨论】:

以上是关于我可以在 IOCP 中使用 accept() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 IOCP WSARecv 函数中使用 std::string 吗?

IOCP AcceptEx 在连接时未创建完成

我可以使用 std::shared_ptr 在 IOCP 中包装每个 I/O 数据吗?

AIX 无需 smitty 即可启用 IOCP

网络模型之IOCP与扩展函数

通过 IOCP 进行串行通信