问题标签 [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 回答
324 浏览

c++ - 当套接字 recv() 然后使用带有 FILE_NO_BUFFERING_FLAG 的重叠_io 写入文件时数据对齐

我正在编写一个 C++ 程序,它只是从另一台计算机接收数据并将数据写入具有高吞吐量(自 GbEthernet 以来约为 100MB/s)的 SSD RAID。

我已经设置了 2overlapped_io个,它们从以太网接收并写入 SSD。

接收完成后,它会向作者发送一条消息。

FILE_NO_BUFFERING_FLAG在磁盘上创建文件时使用。

在网络发送方方面,我使用重叠 IO 发送数据。

我陷入了这个问题:从套接字接收时,它rv = recv()与磁盘不对齐(可能是 4096 次?)。

我应该怎么办?

0 投票
1 回答
144 浏览

winapi - Win32:如何使用单个 OVERLAPPED 操作将多个缓冲区写入 NamedPipe?

有没有办法使用单个 OVERLAPPED 操作将多个缓冲区写入 NamedPipe?

0 投票
2 回答
3120 浏览

asynchronous - How to call DeviceIOControl code asynchronously?

I am trying to call DeviceIO functions asynchronously by using the OVERLAPPED structure as described on MSDN. I am using the FSCTL_ENUM_USN_DATA control code to enumerate the MFT of NTFS drives but i am not able to run it asynchronously. The file handle is created with FILE_FLAG_OVERLAPPED but there is no difference whether I use the overlapped structure with FILE_FLAG_OVERLAPPED or not. The function does not return immediately. Is seems to be synchronous in both cases. The example below shows the enumeration of the first 100.000 MFT entries on the C:\ drive. Since I am not so familiar with the usage of overlapped structures maybe I did something wrong. My question: How can I execute DeviceIoControl(hDevice, FSCTL_ENUM_USN_DATA,...) asynchronously? Thanks for any help.

0 投票
1 回答
428 浏览

c++ - ReadFileEx,可变长度 - 几个问题

我正在尝试读取stderr子进程。数据是使用创建的文本行sprintf(stderr, "some debug info\n")。我将ReadFileEx 与完成例程一起使用。我不知道有多少行文本或每行有多长。那么,我应该把什么作为nNumberOfBytesToRead参数?

我的猜测是我将缓冲区的最大大小设置为 4k;虽然我不知道这是否是最佳尺寸。我猜如果写入的行stderr短于 4k,完成例程将不会触发。我猜当达到 4k 但仍有更多数据时,我必须ReadFileEx在完成例程中启动另一个。我会知道是这种情况,因为GetLastError会返回ERROR_MORE_DATA。我希望在缓冲区未满时接到电话,但子进程已退出。我不确定子进程退出时是否会收到完成回调,因为我在stderr创建子进程时将写句柄传递给了子进程;也许当我关闭该句柄时我会收到回调。wrtstderr?

这是如何创建进程和句柄的伪代码:

详细信息(Tx 扩展是一个抛出错误的包装器):

0 投票
2 回答
1082 浏览

c++ - WSARecv 钩子:防止数据包被可执行文件接收

我正在使用 C++ 和 detours 处理挂钩 winsock2 函数的 dll。我的目标是修改进出原始可执行文件的 TCP 流量。在某些时候,我需要停止某些数据包传递(以便原始可执行文件根本不知道该数据包,但仍保持连接)。

使用 WSASend 挂钩,很清楚(您只是不调用原始 WSASend 并返回 0)。但我不知道如何使用 WSAOVERLAPPED 结构在 WSARecv 钩子中制作它。

我希望下面的代码演示了我想要什么:

我如何假装什么​​也没发生,也没有收到任何数据包(比如假的 WSA_IO_PENDING)?有什么想法/想法吗?

PS 据我所知,可执行文件不使用完成例程(lpCompletionRoutine 始终为 NULL),仅使用重叠结构。

0 投票
2 回答
1784 浏览

windows - Windows 在单独的线程上重叠 IO 与 IO

在 Windows 上,当您执行 I/O 时,您可以使用 OVERLAPPED 选项异步执行。这样做与在另一个线程上同步执行 I/O 有什么区别吗?如果是这样,哪个更好?操作系统是否只是在异步情况下生成一个单独的线程,或者它只是在驱动程序线程上排队并发送信号而不是阻塞等待?

谢谢!

0 投票
1 回答
1665 浏览

windows - 取消重叠串行 I/O 的 WaitCommEvent

我正在以重叠的方式通过串行端口处理非标准调制解调器。除了读取和写入电信线之外,我还必须使用该功能检查CTSDSR等控制线。WaitCommEvent()

在函数调用指示的(几乎所有)情况下*background activity*,我必须等待overlapped.hEvent发生。由于我也在等待来自其他来源的事件(例如由用户输入引起的 IPC、程序终止),因此我使用了该WaitForMuiltipleObjects()函数。但是,如果阻塞等待由于控制线更改以外的其他原因完成,我该如何停止后台活动EvtMask?我所基于的代码目前使用SetCommMask(hFile, 0),但我没有找到合适的可靠参考。

我还观察到不正确支持对控制线进行更改的情况(驱动程序?VM?),所以我必须在中间检查的情况下进行切片等待。

必须做什么才能安全地离开EvtMask声明变量的范围?

0 投票
1 回答
651 浏览

c++ - bWait = false 的 GetOverlappedResults 块

GetOverlappedResults()根本不返回。
我运行了下面的简单示例,当网络接口中的 IP 地址发生更改时,手动重置事件被设置,我可以看到“IP 地址表已更改..”输出,但即使 bWait 为 false,GetOverlappedResults() 也不会返回. 即使使用 bWait = true 它也应该返回,因为事件已设置,因此 I/O 操作已完成。

到底是怎么回事?

0 投票
1 回答
849 浏览

c# - 在 Win32 上使用 FILE_FLAG_OVERLAPPED 永久挂起 COM 端口通信

这里的最终目标是让现有的 C++ 应用程序通过虚拟串行 COM 端口与现有的 C# 应用程序进行通信,这两者都是其他人编写的。我对串行通信不是很熟悉,上周左右我一直在研究它,但它仍然在我的脑海中,但这并没有让任务消失,所以我在这里。如果你能帮上忙,请记得到 ELI5。

在我完成这个任务的过程中,我最近的想法是从头开始编写一个 C++ 应用程序,它只是发送一个已知消息并接收一个预期的消息作为回报。我能够编写一个创建文件句柄的 C++ 应用程序,并使用 and 成功通过 COM 发送CreateFile(...)消息WriteFile(...)。我知道 C# 应用程序收到了消息,因为它报告了正确接收的数据。但是,我的ReadFile(...).

我的下一步是设置我的 C++ 迷你应用程序来发送和收听消息。我发现这行得通,所以我知道我的小应用程序可以通过 COM 发送和接收消息。但是 C# 应用程序无法发送到达我的 C++ 应用程序的任何版本的消息。

其他人向我指出,C# 应用程序使用 FILE_FLAG_OVERLAPPED,而 C++ 应用程序都使用 FILE_ATTRIBUTE_NORMAL。所以我开始尝试调整我的 C++ 应用程序以使用 FILE_FLAG_OVERLAPPED 以便 C++ 和 C# 应用程序保持一致。但是,这导致我的 C++ 应用程序失败,我不知道为什么。被困在上面足够长的时间来寻求帮助。这是我的代码失败并出现错误 997: ERROR_IO_PENDING 并且似乎从未收到消息(重叠)。

发件人将报告它按预期发送了消息。听者只是无限地重复'io pending'。

因此,任何一个问题的答案都会有所帮助:

  • 为什么我的代码失败了?你如何使用 FILE_FLAG_OVERLAPPED?
  • -或者-
  • 一个应用程序发送/接收重叠,而另一个应用程序不重叠是否重要?
  • 实际上第三个问题,为什么COM通信在一个方向上会成功,但在另一个方向上会失败?
0 投票
0 回答
376 浏览

c++ - 如何使用重叠 IO 接受()多个套接字?

在使用重叠 IO(使用完成例程)时,我无法理解如何(快速)接受多个套接字。

所以在我的服务器中,这是伪代码:

所以如你所见,我只能接受一个套接字,然后我进入等待状态,只有当sock接收到东西时,我才能接受另一个套接字!