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 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章