我想使用libuv通过TCP发送文件。
我的问题是uv_read_start
用于读取文件的内容。
为此,我首先发送文件的大小,因此我在malloc(sizeof(uint64_t))
中创建一个静态alloc_cb
来读取大小。
之后我必须让malloc(size)
分配必要的内存量来填充内存中的所有文件(我绝对希望在内存中有这样的文件)。
但我不知道如何将参数size
传递给alloc_cb
(我不想使用全局变量)。
有没有办法在没有全局变量的情况下做到这一点?
也许完全不同的方式做同样的事情?
提前致谢。
答案 0 :(得分:0)
我发现handle->data
包含void*
,因此我们可以完全按照自己的意愿投放。
在调用uv_read_start
之前,在流句柄stream->data = (size_t*)malloc(sizeof(size_t));
和*(size_t *)(stream->data) = size;
中存储大小,并通过阅读alloc_cb
在size_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_struct
(uv_handle_t
)之后调用(uv_handle_t*) s
,然后转回my_struct
内alloc_cb
1}}:
my_struct * s = (my_struct*) handle;
C#方法在书An introduction to libuv
,第2版,第8.4和第34段中更详细地解释(尽管在不同的上下文中);将数据传递给工作者线程&#34; (见here)。