问题标签 [overlapped-io]

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.

0 投票
1 回答
1490 浏览

c++ - 使用 ReadFile 时是否更新了重叠结构?

我正在学习有关 win32 编程的知识。我阅读了参考手册(此处:https ://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx )

如果 lpOverlapped 不为 NULL,则读取操作从 OVERLAPPED 结构中指定的偏移量开始,并且 ReadFile 在读取操作完成之前不会返回。系统会在 ReadFile 返回之前更新 OVERLAPPED 偏移量。

但是,如果我打电话ReadFile(hmyFile, &myrecord, sizeof(record_t), &n, &ov);,我会看到该值ov.offset保持不变。怎么会这样?我在哪里误解了参考手册中的内容?

更多详细信息:
文件处理程序在hmyFile = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
我不使用时打开FILE_FLAG_OVERLAPPED

0 投票
1 回答
650 浏览

c++ - WSASend 完成例程从未被调用过

我正在玩 Overlapped IO,突然发现我是唯一一个不能鼓励 Completion 回调工作的人(所有声明都是关于:它有效,但我不喜欢它)。

我的应用程序的想法是:客户端(telnet localhost 27015)连接到服务器,服务器开始向客户端推送大量数据。而且我从来没有调用过 CompletionCallback 。

这是代码:

谢谢你。

0 投票
2 回答
2473 浏览

c - 为什么使用 IOCP?

我试图了解为什么使用 IOCP。我可以想到两个原因:

  • 由于WSARecv()不会阻塞,所以我可以处理 1000 个客户端,而不必为每个客户端创建一个新线程(此外,您可以创建的线程数量是有限的,因此您可以处理的客户端数量也会受到限制) .
  • 既然WSASend()不会阻塞,那么当我要发送一个大文件时,我不必创建一个新线程来发送它(如果我没有创建一个新线程那么UI线程当然会阻塞)。

使用 IOCP 还有哪些其他原因?

0 投票
1 回答
8514 浏览

c++ - 使用 WINAPI ReadFile 从文件异步读取行

我需要同时从文件中读取几行,即异步。文件中的行大小相同。

例如,我需要读取文件的第二行和第四行来分隔变量或数组。

我更习惯于 c# 的 async/await 并且所有这些OVERLAPPED东西对我来说有点难以理解。

使用 msdn 示例,我实现了这一点,它只是从文件中读取数据作为一个字符串(这甚至是异步读取吗?):

你能帮我从文件中异步读取两行吗?

我应该用SetFilePointer它来移动吗?

0 投票
0 回答
173 浏览

windows - WaitForMultipleObjectsEx 如何在 ReadTotalTimeoutConstant 之前超时?

我有一个从串行端口读取的程序,这是通过重叠 IO 完成的。当我在 SetCommTimeouts (100 ms) 调用中的超时时间较低时,我无法理解 WaitForMultipleObjects 如何超时 (200 ms)。它只是很少发生。但是当它发生时,它经常同时发生在多个不同的串行端口上。有时也是在不同的应用程序中使用相同的源代码在不同的 COM 端口上进行通信。

该程序将首先使用以下命令打开 com 端口:

打开后它会调用 GetCommProperties 和 PurgeComm 然后:

它还在循环中开始读取端口之前调用 SetCommState 和 SetCommMask:

dwRequestedSize 是从 ClearCommError 用 cbInQue 初始化的。所以这是缓冲区中的字节数。该代码还将使用重叠的 IO 调用 WaitCommEvent,然后开始等待:

我在这里做错了吗?感谢您对此的任何意见。

一些额外的信息。

我知道分页可能是一个问题。但我还是有点不愿意接受,有两个原因。

1) 计算机只运行所描述的软件,没有用户与 PC 的交互,它有大量的 RAM(4 Giga 字节),应用程序只使用大约 50 MB 的内存。因此,PC 始终至少有 2 Giga 字节的空闲内存。

2) 应用程序 24/7 全天候运行,围绕此代码的活动非常繁重,它将发送数据或接收数据。所以我假设windows不会选择代码或内存作为分页的候选者。

也许有一些关于寻呼的东西我不完全理解,在这种情况下你能解释一下吗?

我想我会添加一个检查来查看实际等待的时间。我假设如果等待大约 200 毫秒。然后可以排除分页或其他窗口锁定的东西。因为不太可能是完全相同的 200 毫秒。同意?我认为 GetTickCount 对此将具有显着的精度,并且会增加最少的开销。

0 投票
1 回答
1382 浏览

c++ - 如何用 WaitForSingleObject 发出文件句柄等待的信号

我无法控制的这段代码使用重叠 I/O 读取文件:

在另一个线程中(实际上是在 ReadFile 的 API 挂钩中),我需要发出信号hFile来解除对WaitForSingleObject. 通常 Windows(或处理 的设备驱动程序ReadFile)会这样做,但我需要模拟它。

我发现没有一个 API 通常可以与 . 一起使用hFile,包括ReleaseMutexReleaseSemaphoreSetEvent. 它们都返回错误 6(句柄无效)。是否有适用于文件、命名管道或通信设备的 API?

我知道不建议这样做WaitForSingleObject(hFile),但上面的代码是给定的,我需要使用它。谢谢!

0 投票
1 回答
443 浏览

c++ - IO完成端口中的业务逻辑

我对 IO Completion Port 以及 winsock2 中的 AcceptEx 有一些疑问

如果我错了,请纠正我。

  1. AcceptEx 是一种接受请求或连接的重叠方式。但是,正如该站点上的多个帖子所指出的那样,AcceptEx如果 AcceptEx 期待数据但不是由连接的客户端发送,则很容易受到 DOS 攻击。那么,是否可以通过将 0 放入 来解决dwReceiveDataLength

  2. 此外,在接受相应连接时能够从客户端接收数据而不是稍后使用接收数据有什么优势AcceptEx

  3. 在接受来自对端端点的连接并将其与 IO 完成端口相关联后,请求作为完成数据包在 IO 完成端口中排队,这些完成数据包与它们各自的句柄相关联。NumberOfConcurrentThreads阻塞在完成端口上的工作线程将根据服务请求而被唤醒。那么,完成端口中的线程是IO 线程吗?

  4. 那么,我应该在socket服务器的哪里实现业务逻辑或操作呢?例如,来自客户端的请求将数字发送到服务器进行处理,而服务器就像计算器一样通过回显计算的输出来响应。那么,这个逻辑可以在 IO Completion Port 中实现吗?

  5. 如果逻辑在 IO 完成端口中实现(当IO 完成端口中处于活动状态的 IO 线程(假设)正在执行WSARecvWSASend),IO 线程是否会在等待计算完成时阻塞,从而无法接受连接如果积压的东西都被拿走了?

编辑:

  • 例如,在接受客户端套接字并在 IO 完成端口(main_cpl_port)中排队/关联之后,阻塞在此main_cpl_port上的线程调用GetQueuedCompletionStatus将完成数据包出列,随后将数据读入分配的缓冲区。在将任何响应写回客户端之前,缓冲区会被处理/解析为“命令”(例如:GoToCalculator、GoToRecorder)。
  • 例如,GoToCalculator 负责其他计算相关的命令。
  • 在这种情况下,GoToCalculator 实际上是另一个 IO 完成端口,可以满足所有与计算相关的请求。假设完成端口被命名为calc_completion_port
  • 因此,来自 main_cpl_port 的完成数据包是否有可能从当前main_cpl_port关联的客户端套接字发布到calc_completion_port以供将来的 IO(发送和接收) 。这是用来干什么的?PostQueuedCompletionStatus
  • 发布到calc_completion_port后从客户端发送的消息是否可以被阻塞在此完成端口上的线程接收?换句话说,如何将连接从另一个重定向到另一个完成端口?
0 投票
0 回答
722 浏览

c++ - IO Completion Port UDP Socket,实现和WSASendTo

我需要开发一个在 UDP 套接字中使用 IOCP 的应用程序,但是在 Microsoft 文档中作为其他示例找到的材料或在实现形式上模糊或集中。我希望有使用 IOCP 经验的人确认正确的用法是:

  • 调用 CreateIoCompletionPort 函数来创建一个 IOCP。
  • 我将我的套接字与具有相同功能的 IOCP 相关联。
  • 执行 IO 操作(在我的情况下为 WSARecvFrom 或 WSASendTo)
  • 调用 GetQueuedCompletionStatus 函数,该函数将阻塞我的进程,直到我的 IO 操作完成(例如,这可以在线程池中完成)
  • 实现缓冲区或运算结果的读取。

我没有描述套接字的实现,因为它不是重点,但这是使用 IOCP 的正确方法吗?

第二个问题是关于应用程序设计的,在发送信息的情况下。我读到一些内容,说使用 IOCP 的应用程序不会使用直接调用输出操作(例如直接调用 WSASendTo 函数),而是使用 PostQueuedCompletionStatus 函数在线程中生成事件来运行此操作。根据我的研究,我认为在性能方面没有任何优势。

假设这两种形式都应用于线程池,那么使用 PostQueuedCompletionStatus 执行输出操作有优势吗?

0 投票
1 回答
288 浏览

windows - 我可以通过多次调用 SetFileIoOverlappedRange 来锁定 4GB 或更大的内存块吗?

既然Length参数SetFileIoOverlappedRangeULONGonly,怎么才能锁定一个4GB或者更大的内存块呢?

假设我分配了一个连续的 4 GB 内存块用于重叠 I/O 并调用SetFileIoOverlappedRange两次,每半个块调用一次。两个调用都返回一个成功(非零)状态码。调用是否相加,导致锁定整个 4 GB 块?还是第二个调用“覆盖”第一个?我怎么知道?

0 投票
2 回答
759 浏览

c++ - 为什么首选异步IO

所以我一直在做一些 WIN32 套接字编程,我试图理解为什么重叠 IO 是首选。特别是,我想知道为什么会这样

优于像这样的普通 IO 调用

据我了解,如果 IO 事件未在 WSAWaitForMultipleEvents 完成,第一个调用将阻塞,而第二个调用直接在 recv 上阻塞,直到数据到达。那么稍晚一点 IO 调用块的实际好处是什么?是不是如果你在等待你做之前有一些你可以做的事情?

如果是这种情况,在数据到达之前您无能为力的应用程序中是否值得/需要重叠 IO?