我正在评估 libuv 作为我正在编写的 C/c++ 服务器的库。该协议以长度为前缀,因此只要我可以从流中读取一个 32 位整数,我就应该能够知道我应该分配什么大小的缓冲区。文档说 uv_read_start 函数可能会被多次调用。
UV_EXTERN int uv_read_start(uv_stream_t*, uv_alloc_cb alloc_cb,
uv_read_cb read_cb);
由于我使用的是长度前缀协议,一旦我知道缓冲区的正确大小,我想分配它并将其重新用于后续读取,直到我收到所有字节。有没有一种简单的方法可以用 libuv 做到这一点?现在看来 uv_alloc_cb 函数必须处理这个问题。我可以将缓冲区与我的流对象相关联,而不是将其放在地图或其他东西中吗?
由于我使用的是长度前缀协议,所以我根本不想在堆上分配缓冲区,直到我可以读取前 4 个字节(32 位)。我是否可以在堆栈上分配一个大小为 4 的缓冲区并让 uv_read_cb 函数实际进行堆分配?uv_read_cb 函数是否作为 uv_read_start 函数的一部分同步调用?如果是这样,当我知道我的流还没有附加缓冲区时,我应该能够在堆栈上进行分配。