将参数发送到alloc_cb

时间:2018-02-14 13:17:33

标签: libuv

我想使用libuv通过TCP发送文件。 我的问题是uv_read_start用于读取文件的内容。

为此,我首先发送文件的大小,因此我在malloc(sizeof(uint64_t))中创建一个静态alloc_cb来读取大小。 之后我必须让malloc(size)分配必要的内存量来填充内存中的所有文件(我绝对希望在内存中有这样的文件)。

但我不知道如何将参数size传递给alloc_cb(我不想使用全局变量)。 有没有办法在没有全局变量的情况下做到这一点? 也许完全不同的方式做同样的事情?

提前致谢。

2 个答案:

答案 0 :(得分:0)

我发现handle->data包含void*,因此我们可以完全按照自己的意愿投放。 在调用uv_read_start之前,在流句柄stream->data = (size_t*)malloc(sizeof(size_t));*(size_t *)(stream->data) = size;中存储大小,并通过阅读alloc_cbsize_t rsize = *(size_t*)(handle->data);中重复使用它。 之后你必须释放这个缓冲区。

还有其他想法吗?

答案 1 :(得分:0)

正如OP所提到的,使用void *字段是一种选择。

另一种是在C中使用继承(如果使用C ++)或继承式hackery。

对于C ++:,我们使用继承。

struct my_struct: public uv_handle_t {
    size_t size;
};

您可以将指向此结构的指针传递给alloc_cb(因为my_struct继承自handle),然后将其强制转换为my_struct类型:

my_struct * s = reinterpret_cast<my_struct*>(handle);

对于C:我们没有继承权,所以我们需要一些黑客攻击:

struct my_struct {
    uv_handle_t handle;
    size_t size;
};

然后在将alloc_cb类型的对象转换为my_structuv_handle_t)之后调用(uv_handle_t*) s,然后转回my_structalloc_cb 1}}:

my_struct * s = (my_struct*) handle;

C#方法在书An introduction to libuv,第2版,第8.4和第34段中更详细地解释(尽管在不同的上下文中);将数据传递给工作者线程&#34; (见here)。