问题标签 [io-completion-ports]

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 回答
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 投票
1 回答
201 浏览

python - 带有命名管道和 IO 完成端口的 ERROR_NO_MORE_ITEMS

我有一个用 python+ctypes 实现的简单命名管道服务器:

它从外部程序接收数据。我希望GetQueuedCompletionStatus只有当有东西到达管道时才会返回,但情况并非总是如此。有时,在完成数据包出队后,我可以看到bytes_available == 0,ret_code == 0overlapped_struct.Internal == 256(我认为这意味着 ERROR_NO_MORE_ITEMS)。

关于为什么会发生的任何想法?

0 投票
1 回答
199 浏览

sockets - 了解 IO 完成端口

我不清楚,我在某个地方读到了GetQueuedCompletionStatus将返回WSARecvWSASend按照它们创建的顺序产生的结果,所以这是我的问题:
在服务器中如果初始化CreateIoCompletionPortNumberOfConcurrentThreads = 1然后打开与一个客户端的连接,然后服务器首先调用WSARecvWSASend但是客户从不发送任何东西。在服务器中,GetQueuedCompletionStatus永远不会返回结果,WSASend因为结果WSARecv必须首先发生?

0 投票
1 回答
81 浏览

c++ - 连续性多个 WSASend() io 完成端口

在来自服务器的 IO 完成端口中使用 TCP,如果我在同一个套接字中连续进行两个WSASend,第一个发送“ABC”,第二个发送“DEF”然后当我调用GetQueuedCompletionStatus它时告诉我第一个WSASend只发送“AB”然后我再次打电话GetQueuedCompletionStatus,它告诉我第二次WSASend发送“DEF”,客户端是否要接收“ABDEF”?还是第二个WSASend会因为第一WSASend条消息不完整而失败?

0 投票
2 回答
1081 浏览

winapi - WaitForSingleObject() 在完成端口上?

今天我了解到我可以调用CreateIoCompletionPort()然后将返回的内容传递HANDLEWaitForSingleObject()

它在我的 Windows 10 机器上按预期工作。

这种行为是已知的、合法的或记录在案的吗?我找不到任何关于它的信息。

0 投票
1 回答
62 浏览

windows - Windows IOCP 树?

我想做的是休闲:所以我有 4 个线程。并为每个线程创建一个 IOCP。在线程函数中,我在 GetQueuedCompletionStatus(INIFINIT) 上等待以获取工作,然后对其进行处理,然后再次等待。

因此,如果我想向特定线程提交作业,我只需在其 IOCP 上使用 PostQueuedCompletionStatus。

但我想要的是拥有一个主 IOCP 和线程函数内部。我在主 IOCP 上 GetQueuedCompletionStatus ,所以当我在主 IOCP 上发布作业时,随机线程获取并处理它,但我仍然想为特定线程发送特定作业。我怎样才能做到这一点?谢谢!谢谢。

0 投票
2 回答
295 浏览

c - 如何兼顾 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS、IOCP 和清理

如果FILE_SKIP_COMPLETION_PORT_ON_SUCCESS在绑定到 I/O 完成端口的文件句柄上设置,则OVERLAPPED需要在其 I/O 同步完成时释放结构。否则,它需要保持活动状态,直到工作人员处理来自 I/O 完成端口的通知。

这一切听起来都不错,直到您意识到这仅在您自己管理文件句柄时才有效。
但是如果其他人给了你文件句柄,你怎么知道什么时候应该释放这个OVERLAPPED结构呢?有没有办法在事后发现这一点?
否则,这是否基本上意味着您无法在无法保证完成通知状态的任何文件句柄上正确执行重叠 I/O...?

0 投票
1 回答
862 浏览

windows - ReadFile(Ex) 与 BindIoCompletionCallback 的使用

我正在尝试使用命名管道编写 IPC。

服务器代码: http: //pastebin.com/tHyAv0e0

客户端代码: http: //pastebin.com/Qd0yGBca

我的问题是关于服务器的。跟随 SO 用户,我正在尝试在服务器代码中使用 BindIoCompletionCallback() 。服务器由以下功能组成:

  • print_last_error :打印最后一个错误的可读消息
  • IocpThreadProc :传递给 BindIoCompletionCallback() 的回调,它调用 ConnectNamedPipe() 和 ReadFile()
  • server_new :创建命名管道并尝试连接到管道的另一端(即客户端),创建退出事件并调用 BindIoCompletionCallback()
  • server_del :应该释放资源
  • 具有无限循环的主函数,等待退出事件发出信号。

当客户端连接时,它会发送消息“salut, c'est le client !”。我已将 ReadFile() 的缓冲区设置为 5,以测试我必须多次调用 ReadFile() 的情况。我有以下输出:

以 ** 开头的行:它打印回调的参数

以 'msg' 开头的行:它打印由 Readfile 填充的缓冲区的消息

由于客户端发送的消息长度为 24,我通常应该得到这 5 条消息(每条消息都是 5 个字符,除了最后一个,是 4 个字符):

但我不能拥有消息的第一部分(即:“salut”)。当 I/O 操作完成时调用回调,可能是第一部分。但是我没有成功调用 ReadFile() 以获取消息的第一部分。我试图在主函数的主循环中、线程中、server_new() 等中调用 ReadFile()……除了正确的方法之外的所有内容。

有人知道如何解决这个问题吗?

谢谢你

0 投票
0 回答
107 浏览

sockets - 没有线程的 I/O 完成端口

问题是关于如何只使用一个循环来处理主程序线程内的所有套接字请求。这可以使用 WSAEventSelect 和 WSAWaitForMultipleEvents 来实现,但我们这里限制为 64 个事件。我也可以使用 WSAAsyncSelect 但我需要一个窗口来处理套接字消息。

我没有找到的是如何使监听套接字也与 I/O 完成异步工作。GetQueuedCompletionStatus 函数似乎旨在用于数据传输,但不用于处理传入的连接请求。

我的想法如下:

这是可能的还是有其他方法可以实现?

0 投票
0 回答
430 浏览

c++ - GetQueuedCompletionStatus 初始 WSARecv 与 0 lpNumberOfBytesRecvd 问题

我正在通过这篇文章阅读有关 IOCP 的信息

http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancediomethod5i.html

他使用的第一个 WSARecv 函数与 0lpNumberOfBytesRecvd一起用于启动完成端口

现在在应用程序接收 IO 帖子的工作线程函数上

它也检查 0 的参数lpNumberOfBytesGetQueuedCompletionStatus如果是则关闭连接

当我尝试它时,第一条 IOCP 消息发布了GetQueuedCompletionStatus它总是在lpNumberOfBytes参数中返回 0 的函数,因为第一次WSARecv调用是在lpNumberOfBytesRecvd设置为零的情况下调用的

我已尝试实现此代码,但我无法使代码正常工作,除非我在第一次调用时选择不在此参数中使用 NULL,WSARecv以便 在收到所有数据的情况下可以使用GetQueuedCompletionStatus返回值 0 的函数lpNumberOfBytes.

MSDN 说要使用 NULL

lpNumberOfBytesRecvd [出]

如果接收操作立即完成,则指向此调用接收的数据数(以字节为单位)的指针。

如果 lpOverlapped 参数不为 NULL,则为此参数使用 NULL 以避免潜在的错误结果。仅当 lpOverlapped 参数不为 NULL 时,此参数才能为 NULL。

如果我WSARecv再次调用(在工作线程函数内部)并且收到所有数据,则代码无法正常工作,这会导致GetQueuedCompletionStatus函数立即返回而无需等待,即使使用了 INFINITE 并且工作线程进入无限循环。函数没有返回任何错误,GetQueuedCompletionStatus它只是表现得好像有更多数据但没有。

WSARecv需要以 buf 大小的什么值启动?

我也应该使用非阻塞套接字吗?或者只是普通的阻塞套接字,因为我使用单独的线程来接受连接,所以我认为它很好,因为它不会冻结我的 GUI。