gpt4 book ai didi

c - libuv 是否提供任何设施来将缓冲区附加到连接并重新使用它

转载 作者:太空狗 更新时间:2023-10-29 15:24:22 28 4
gpt4 key购买 nike

我正在评估 libuv 作为我正在编写的 C/c++ 服务器的库。该协议(protocol)以长度为前缀,所以一旦我可以从流中读取一个 32 位整数,我就应该能够知道我应该分配多大的缓冲区。文档说 uv_read_start 函数可能会被调用多次。

UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb,
uv_read_cb read_cb);

因为我使用的是长度前缀协议(protocol),一旦我知道缓冲区的正确大小,我想分配它并重新使用它进行后续读取,直到我收到所有字节。有没有一种简单的方法可以用 libuv 做到这一点?现在看来 uv_alloc_cb 函数必须处理这个问题。我可以将缓冲区与我的流对象相关联,而不是将其放在 map 或其他东西中吗?

因为我使用的是长度前缀协议(protocol),所以我根本不想在堆上分配缓冲区,直到我可以读取前 4 个字节(32 位)。我是否可以在堆栈上分配一个大小为 4 的缓冲区并让 uv_read_cb 函数实际进行堆分配? uv_read_cb 函数是否作为 uv_read_start 函数的一部分被同步调用?如果是,那么当我知道我还没有附加到我的流的缓冲区时,我似乎应该能够在堆栈上分配。

最佳答案

回答我自己的问题。我在这里的 libuv 邮件列表中找到了答案:https://groups.google.com/forum/#!topic/libuv/fRNQV_QGgaA

如果链接不可用,请在此处复制详细信息:

将您自己的数据结构附加到句柄:

句柄有一个 void* data 字段供您使用。你可以让它指向存储长度的辅助结构和缓冲区。

或者,您可以将 uv_tcp_t 嵌入到另一个结构中,然后使用 container_of 查找嵌入结构。这不是一个标准 C 宏,但您可以在中找到它的定义和用法示例libuv/源代码树。它的好处是它只是做一些指针算术,它使您免于另一个级别的指针间接寻址。

接收缓冲区的堆栈分配:

不,那是不可能的。正确的思考方式是你的 alloc_cb 返回一个缓冲区,libuv 会在某个时候填充数据在将来。强调“有时”是因为没有保证什么时候会发生;它可能是立即的,它可能是秒(或分钟)后。

关于c - libuv 是否提供任何设施来将缓冲区附加到连接并重新使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19216045/

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