问题标签 [iocp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 一些使用 WSASend 的 OVERLAPS 没有使用 GetQueuedCompletionStatus 及时返回?
背景:我正在使用 CreateIoCompletionPort、WSASend/Recv 和 GetQueuedCompletionStatus 在我的服务器上执行重叠套接字 io。对于流控制,当发送到客户端时,我只允许在所有挂起的 OVERLAP 都从 IOCP 弹出时调用几个 WSASend()。
问题:最近,有一些情况是 OVERLAP 没有返回到 IOCP。调用 GetQueuedCompletionStatus 的线程没有得到它们,它们保留在我的本地挂起队列中。我已经验证客户端确实从套接字接收数据并且套接字已连接。进行 WSASend() 调用时没有返回错误。没有外部刺激,重叠只是“永远不会”回来,如下所示:
- 从客户端或服务器断开套接字,立即允许 GetQueuedCompletionStatus 线程检索 OVERLAP
- 在所有 OVERLAP 突然从队列中弹出之前,有时需要多次调用 WSASend()。
问题:有人见过这种行为吗?关于造成这种情况的任何想法?
谢谢,杰弗里
python - IO完成端口key混淆
我正在使用 ctypes 模块在 Python 中使用 Windows DLL API编写基于 IO 完成端口的服务器(此处为源代码)。但这是 API 的一个非常直接的用法,这个问题是针对那些了解 IOCP 而不是 Python 的人。
据我了解 CreateIoCompletionPort 的文档,当您使用与创建的 IOCP 关联的文件句柄(在我的情况下为套接字)调用此函数时,您指定了“用户定义的”完成键。当您开始调用 GetQueuedCompletionStatus 时,您将获得一个完成键值以及一个指向重叠对象的指针。完成键应标识已完成的重叠对象和请求。
但是,假设我在 CreateIoCompletionPort 调用中使用重叠对象传入 100 作为完成键。当同一个重叠对象的 IO 完成并通过 GetQueuedCompletionStatus 返回时,伴随它的完成键要大得多,与原始值 100 没有任何相似之处。
我是否误解了完成键的工作原理,还是我在上面链接的源代码中做错了?
c# - 将 SslStream 与 IOCP 一起使用
我已经使用 Socket 类的异步/IOCP 方法 BeginSend()/BeginRead()/etc 编写了一个 TCP 服务器。我想使用 SslStream 添加 SSL 功能,但从界面看来 Socket 和 SslStream 并不打算一起工作,特别是因为我根本没有使用 Streams 并且 SslStream 似乎依赖于使用 Stream .
这是可能的,还是我找错地方了?我是否需要设计自己的 Stream 子类来输入我的 Socket 实例并指向 SslStream ?由于缩放问题,我的服务器使用 IOCP 对我来说很重要。
c++ - 带有 I/O 完成端口的异步操作返回 0 字节传输
带有 I/O 完成端口的异步操作返回 0 字节传输,尽管 I/O 操作按预期工作(我的读取缓冲区已满)。
在工作线程中:
这两个函数都返回 numBytes 中的 0 个字节,但buffer
正在填充。这是预期的行为吗?
谢谢。
c++ - IO 完成端口:WSARecv() 是如何工作的?
我想使用工作线程池和 IO 完成端口编写服务器。服务器应该在多个客户端之间处理和转发消息。“每个客户端”数据位于 ClientContext 类中。此类实例之间的数据使用工作线程进行交换。我认为这是一个典型的场景。
但是,这些 IO 完成端口有两个问题。
(1)第一个问题是服务器基本上是从客户端接收数据,但我不知道是否接收到完整的消息。事实上 WSAGetLastError() 总是返回 WSARecv() 仍然处于挂起状态。我尝试使用 WaitForMultipleObjects() 等待事件 OVERLAPPED.hEvent。但是,它永远阻塞,即 WSARecv() 在我的程序中永远不会完成。我的目标是绝对确保在进一步处理开始之前已收到整个消息。我的消息在其标题中有一个“消息长度”字段,但我真的不知道如何将它与 IOCP 函数参数一起使用。
(2) 如果WSARecv() 在下面的代码片段中被注释掉了,程序仍然会接收到数据。这意味着什么?这是否意味着我根本不需要调用 WSARecv() ?我无法通过这些 IO 完成端口获得确定性行为。谢谢你的帮助!
.net - .NET 中工作线程和 I/O 线程的简单描述
在 .NET 中很难找到对工作线程和 I/O 线程的详细而简单的描述
我对这个主题很清楚(但在技术上可能并不精确):
- 工作线程是应该使用 CPU 进行工作的线程;
- I/O 线程(也称为“完成端口线程”)应该使用设备驱动程序来完成它们的工作,并且基本上“什么都不做”,只监视非 CPU 操作的完成情况。
什么不清楚:
- 尽管 ThreadPool.GetAvailableThreads 方法返回两种类型的可用线程数,但似乎没有公共 API 来安排 I/O 线程的工作。您只能在 .NET 中手动创建工作线程吗?
- 似乎单个 I/O 线程可以监控多个 I/O 操作。这是真的吗?如果是这样,为什么 ThreadPool 默认有这么多可用的 I/O 线程?
- 在某些文本中,我读到了该回调,它在 I/O 操作完成后由 I/O 线程执行。这是真的吗?考虑到这个回调是CPU操作,这不是工作线程的工作吗?
- 更具体地说——ASP.NET 异步页面是否使用 I/O 线程?将 I/O 工作切换到单独的线程而不是增加工作线程的最大数量究竟有什么性能优势?是因为单个 I/O 线程确实监控多个操作吗?或者 Windows 在使用 I/O 线程时会进行更有效的上下文切换?
delphi - Delphi 是否有基于 I/O 完成端口的组件?
我知道Indy、ICS、Synapse和Clever InetSuite,它们都不支持IOCP。外面还有别的吗?
编辑:我找到了 iocpclasses,它是用 Delphi5 编写的。我想总比没有好。
winapi - 是否可以在 Reactor 式操作中使用 IOCP(或其他 API)?
是否有任何可扩展的 Win32 API(如 IOCP 而不是 select)可以在套接字上为您提供反应器式操作?AFAIK IOCP 允许您接收有关已完成操作的通知,例如读取或写入数据(前摄器),但我正在寻找反应器风格的操作:我需要在套接字可读或可写(反应器)时获得通知。
类似于 epoll、kqueue 的东西/dev/poll
?
Win32中有这样的API吗?如果是这样,我在哪里可以找到它的手册?
** 澄清:** 我需要select
像 IOCP 一样可扩展的套接字 API,或者我正在寻找一种在类似反应器的操作中使用 IOCP 的方法。
更详细的说明: IOCP 允许您在给定操作完成时收到通知。例如:
所以我在手术完成后会收到通知——监考式的操作。
我需要的是这样的:
我怎样才能做到这一点?
c++ - C++ Windows IOCP - HTTP POST 数据丢失
我编写了一个非常简单的 IOCP HTTP 服务器,它适用于 GET 动词,但不适用于 POST。
我创建了一个套接字和一个侦听线程,其中 accept() 正在等待连接。当客户端连接时,我调用 ioctlsocket() 来解除对套接字的阻塞,然后将套接字与 IOCP 相关联,最后调用 WSARecv() 来读取数据。
确实读取了一些数据,当这种情况发生时,IOCP 通过 GetQueuedCompletionStatus() 唤醒一个工作线程,我恢复了请求数据。
当我从任何浏览器发布时,我只会得到请求标头。关于为什么的任何建议?
linux - Linux 和 I/O 完成端口?
使用 winsock,您可以配置套接字或单独的 I/O 操作以“重叠”。这意味着执行 I/O 的调用会立即返回,而实际操作由单独的工作线程异步完成。
Winsock 还提供“完成端口”。据我了解,完成端口充当句柄(套接字)的多路复用器。如果句柄不在 I/O 操作的中间,即如果它的所有 I/O 操作都已完成,则可以对句柄进行解复用。
那么,关于我的问题...... linux 是否支持完成端口,甚至支持套接字的异步 I/O?