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

标签 c libuv

我正在评估 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/

相关文章:

c++ - Node JS native 模块 : Can You Run C/C++ Methods In A Separate Libuv/NodeJS Style Process?

c++ - 多次同时调用 uv_write 有时不起作用

c - 带有格式化错误跟踪的日志宏

c - 有符号字符的范围

javascript - Nodejs - libuv 非阻塞事件回调

multithreading - libuv - 事件循环和线程

C++ 错误 : reference to non-static member function must be called

c - C语言仿射密码获得相同 key

C - 编写 makefile 及其工作原理

c - 如何使用 FFMpeg 同时收听 2 个传入的 rtsp 流