问题标签 [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 投票
2 回答
1549 浏览

windows - 什么时候发送 IO 完成端口数据包,什么时候不发送?

我目前正在使用 IO 完成端口研究基于命名管道的 IPC 机制。

不幸的是,我在使用 msdn 文档时遇到了一些问题,因为我不清楚在哪些情况下调用 ReadFile/WriteFile 会导致完成数据包。

ERROR_IO_PENDING 返回 FALSE 的情况很清楚,但是当 ERROR_MORE_DATA 返回时显然可能的情况呢?这种情况下会有完成包吗?此外,如果返回其他错误怎么办?在哪些情况下我必须直接而不是在完成处理程序中处理结果和释放资源?

另一种情况是如果 ReadFile/WriteFile 甚至成功,这显然也是可能的。谢天谢地, MSDN 对此非常清楚:

此外,WriteFile 函数有时会返回 TRUE,GetLastError 值为 ERROR_SUCCESS,即使它使用异步句柄(也可以返回 FALSE 和 ERROR_IO_PENDING)。...在此示例中,建议允许完成端口例程单独负责此类资源的所有释放操作。

这个建议是否在所有情况下都是正确的,并且分配给完成端口的句柄的 ReadFile/WriteFile 操作的结果实际上可以(并且应该)被完全忽略,因为无论如何都会将数据包发送到端口?

0 投票
2 回答
2880 浏览

timer - 支持重叠 I/O(用于 IOCP)的计时器?

我需要在基于 I/O 完成端口 (IOCP) 的应用程序中添加计时器支持。我想避免使用特定线程来管理计时器。

在 Linux 上,您可以创建一个通过文件描述符传递到期通知的计时器(请参阅 timerfd.h 手册),因此如果您的应用程序基于 epoll,则可以将其与 epoll 一起使用。

在 Windows 上,您可以将“等待计时器”与异步过程调用 (ACP) 一起使用(请参阅http://msdn.microsoft.com/en-us/library/ms686898(v=VS.85).aspx

如果您有兴趣,kqueue (BSD, Mac OS) 默认支持定时器(参见 EVFILT_TIMER)。

对于 I/O 完成端口,我们必须使用支持重叠 I/O 的对象。那么,有没有这样的 IOCP 计时器?

此致,

塞德里克斯

0 投票
2 回答
443 浏览

windows - 在 Windows XP 上具有重叠 IO 的 WSASYSCALLFAILURE

我在我的代码中遇到了一个错误,它在重叠的套接字上使用了 WSARecv 和 WSAGetOverlapped 结果。在重负载下,WSAGetOverlapped 返回 WSASYSCALLFAILURE('一个永远不会失败的系统调用失败'),然后我的 TCP 流不同步,导致我的程序的上层出现混乱。

到目前为止,我还无法将它隔离到一组给定的硬件或驱动程序中。是否有人也遇到了这个问题,并找到了解决方案或解决方法?

0 投票
1 回答
1565 浏览

winapi - 调用 ReadFile 返回 ERROR_WORKING_SET_QUOTA

该程序可以正常运行几分钟,然后 ReadFile 开始失败,错误代码为 ERROR_WORKING_SET_QUOTA。

我正在使用带有重叠 I/O 的 ReadFile,如下所示:

为什么我会收到此错误?

0 投票
3 回答
2033 浏览

linux - Linux 中的 Windows 命名管道替代方案

我们正在将现有的 Windows 代码移植到 Linux。我们使用 ACE 作为抽象层。我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作。

在linux中与此等效的是什么。我检查了 linux 命名管道(FIFO),但它们似乎只支持一个客户端和服务器,不支持重叠 IO。

你能指导我这件事吗?

0 投票
3 回答
1274 浏览

c++ - WSASend 在大文件传输过程中失败是否正常?

如果有人有时间,我需要一点帮助。我已经使用 IO 完成端口编写了一个 Web 服务器,但是在发送大文件时遇到了一些问题。网页似乎可以正常加载,但在大文件传输期间,WSASend() 会在几分钟后失败,并出现错误“指定的网络名称不再可用”。

现在,当任何重叠操作失败时,我的服务器只会关闭关联的连接。这是正确的做法吗?或者我应该在关闭套接字之前重试失败的重叠操作几次?我正在使用 tcp/stream 套接字。

(已修复)我还收到了来自 WSARecv 的随机 0 字节数据包。我不知道该怎么做,或者问题是否相关。(/已修复)

谢谢你的帮助

编辑:现在服务器正确处理连接,并且有一个更全面的日志,看起来 Len 是对的。客户端出于某种原因正在关闭连接。

日志:

所以现在的问题是,为什么客户端会关闭连接?它需要 2-5 分钟才能发生。我已将每次发送的缓冲区大小减少到 4098 字节,并且仅在第一个块完成时才发送下一个块。

再次感谢您对此的任何想法。

ps 我什至刚刚实现了一个重试功能,这样它就会在放弃之前重试失败的重叠 IO 操作五次......仍然没有运气=(

0 投票
3 回答
5921 浏览

createfile - WriteFile() 调用适用于 x86,但不适用于 x64。获取错误代码 6 -- 使用 VB.NET 时句柄无效

我正在使用 CreateFile、WriteFile 和 ReadFile API 调用将一些数据写入 USB 设备。我的代码在 32 位系统上运行良好。CreateFile 获取设备的句柄,将该句柄和一些数据传递给 WriteFile,并使用 ReadFile 从该句柄中读取。

我的问题是,相同的代码在 64 位系统上不起作用。WriteFile 返回的错误为 6,句柄无效。我在 CreateFile 调用中检查了句柄的有效性,它是一个有效的句柄。在 CreateFile 之后调用 GetLastError() 将返回 0。正在打开“文件”以进行重叠通信,并且重叠的 init 调用也正在返回它们的正确值。

我的问题是:因为它是 64 位系统,我需要做一些不同的考虑吗?不同的旗帜?完全不同的电话?

请注意,我对代码进行了一些修改以使其同步(取出 OVERLAPPED)并且它起作用了,所以我假设问题出在我的 OVERLAPPED 结构或我初始化调用的方式上.

任何帮助是极大的赞赏。

编辑:

下面是我的 API 签名和我用于 OVERLAPPED 实现的代码

以下是出现问题的写入代码。需要注意的是,在读取中,OVERLAPPED结构的hEvent参数以同样的方式初始化

0 投票
2 回答
1161 浏览

c++ - AcceptEx 返回 1022 (WSAEINVAL)...我做错了什么?

我正在尝试为完成端口编写一个小型测试服务器。但是当我尝试调用 AcceptEx 时...它总是返回 WSAEINVAL 作为 winsock 错误代码...我真的不明白我的错误是什么

http://codepad.org/NEXG3Ssh <- 键盘上的代码

0 投票
1 回答
3297 浏览

winapi - 使用重叠 IO 进行控制台输入?

我试图通过使用 FILE_FLAG_OVERLAPPED 标志打开 CONIN$ 来使用重叠 IO 从控制台读取输入。但是,当我使用它时,ReadFile 会阻塞,即使使用 OVERLAPPED 参数也是如此。

我读过一些帖子报告这是一个 Windows 7 错误。我正在使用 7,所以这是可能的。

这是我正在使用的代码:

0 投票
3 回答
1462 浏览

c++ - 应用程序未从 COM 端口接收串行数据 - C++

我的应用程序没有从 COM 端口正确接收数据。这曾经奏效。我不知道发生了什么。我知道正确的数据正在通过线路发送/接收,因为我可以在我的协议分析器上看到它。

PC 进入该WAIT_OBJECT_0 + 1状态,但缓冲区内容始终为零。我知道这很多,但如果有人能指出我做错了什么,我会非常感激。我可以根据要求添加/删除详细信息。谢谢。

编辑:附加信息

我已经能够验证 PC 是否对 进行了调用ReadFileEx,并且它“成功”了。但是,PC 永远不会进入FileIOCompletionRoutine. 有任何想法吗?(我从代码中删除了错误处理以使生活更简单。)另外,从我在 MSDN 网站上阅读的内容来看,它看起来FileIOCompletionRoutine会在自己的线程中被异步调用。那是对的吗?谢谢。

编辑:最终解决方案

这就是我想出的。显然,这里没有初始化和错误处理代码。我们不能让事情变得太容易。:)