gpt4 book ai didi

c++ - WSARecv、Completionport Model,如何管理Buffer避免溢出?

转载 作者:行者123 更新时间:2023-11-30 04:29:29 25 4
gpt4 key购买 nike

我的问题:我的 Completionport 服务器将从不同的客户端接收未知大小的数据,问题是,我不知道如何避免缓冲区溢出/如何避免我的(接收)缓冲区被数据“填满”。

现在进入问题:1) 如果我通过 WSARecv 进行接收调用,工作线程是否像回调函数一样工作?我的意思是,它是仅在接收调用完成后才挖掘接收调用,还是在接收调用时也挖掘接收调用? lpNumberOfBytes(来自 GetQueuedCompletionStatus)变量包含到目前为止接收到的字节数还是接收到的总字节数?

2) 如何避免溢出,我想到了动态分配的缓冲区结构,但话又说回来,我如何找出包将达到多大?

编辑:我不想问这个问题,但是是否有任何“简单”的方法来管理缓冲区并避免溢出?同步对我来说是不可能的,至少现在是这样

最佳答案

如果我通过 WSARecv 进行接收调用,工作线程是否像回调函数一样工作?

请参阅@valdo 帖子。完成数据 si 排队到您的线程池,一个线程将准备好处理它。

“我的意思是,它是否仅在完成后才挖掘接听电话?”是的 - 因此得名。请注意,“完成”的含义可能有所不同。取决于协议(protocol)。对于 TCP,这意味着已从对等方接收到一些流式数据字节。

“lpNumberOfBytes(来自 GetQueuedCompletionStatus)变量包含到目前为止接收到的字节数还是接收到的字节总数?”它包含仅在 IOCP 完成中提供的接收和加载到缓冲区数组中的字节数。

“如何避免溢出,我想到了动态分配的缓冲区结构,但话又说回来,我如何知道包将变得有多大?”如果您提供缓冲区数组,则不会出现溢出 - 加载缓冲区的内核线程不会超过传递的缓冲区长度。在应用程序级别,考虑到 TCP 的流式传输特性,您可以决定如何将缓冲区数组处理为可用的应用程序级别协议(protocol)单元。您必须利用您对所提供服务的了解来决定合适的缓冲区管理方案。

最后一个 IOCP 服务器有点通用。我使用了一个缓冲池数组和一个在启动时分配的“缓冲载体”对象池(以及一个套接字对象池)。每个缓冲池都包含不同大小的缓冲区。在建立新连接后,我使用最小池中的一个缓冲区发出了 WSARecv。如果此缓冲区已完全填满,我将使用来自下一个最大池的缓冲区用于下一个 WSARecv,依此类推。

然后是防止多处理程序线程乱序缓冲所需的序列号问题:(

关于c++ - WSARecv、Completionport Model,如何管理Buffer避免溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9330349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com