WSASocket() 应该与 IOCP 一起使用吗?

Posted

技术标签:

【中文标题】WSASocket() 应该与 IOCP 一起使用吗?【英文标题】:Should WSASocket() be used with IOCP? 【发布时间】:2015-03-09 13:25:17 【问题描述】:

我知道在创建 IOCP 应用程序时建议使用WSAAccept() 而不是accept()。但是我不确定WSASocket()是否属于Overlapped I/O函数,还是只是另一个Winsock函数?

【问题讨论】:

【参考方案1】:

我一直认为您可以通过查看 socket()WSASocket() 的 MSDN 文档来回答这个问题,特别是您无法创建可用于重叠 I/O(和 IOCP)的套接字仅将socket() 用作WSASocket() 允许您在创建套接字时指定WSA_FLAG_OVERLAPPED 标志。但这是不正确的,因为socket() 创建的套接字设置了WSA_FLAG_OVERLAPPED

但是,一般来说,Windows 中的 berkeley/POSIX 套接字函数只是为了方便想要使用该 API 进行编程的人。使用它们的理由很少,应该首选原生 Windows API。

【讨论】:

实际上,socket() 的文档说:“创建的套接字默认具有重叠属性”。 做到了。我从来没有注意到这一点。谢谢你告诉我!我调整了答案 所以不存在只属于 Overlapped I/O 的函数,而是有 WSAxxx() 函数可以用于 Overlapped I/O,但也可以用于非重叠 I/O。还有一些不支持重叠 I/O 的 berkeley/POSIX 函数。我的假设正确吗? 需要使用正确的标志设置来创建套接字,以便以导致重叠 I/O 发生的方式与重叠 I/O 功能一起使用。您可以创建一个没有重叠标志的套接字并将其传递给 WSASend() 并将其用于同步、非重叠发送。同样,您可以将重叠标志设置为 WSASend() 的套接字传递,并且还可以请求同步发送而不是重叠发送。你不能做的是传递一个没有设置标志的套接字并请求重叠发送。 POSIX 函数不支持重叠 I/O 和 IOCP,因为它们是仅限 Windows 的概念。

以上是关于WSASocket() 应该与 IOCP 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过 IOCP 进行串行通信

Mono 和 C# IOCP:这是个好主意吗?

IOCP 是不是创建自己的线程?

我应该为 IOCP 创建多少线程?

WSASocket与socket

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