我想使用libuv通过TCP发送文件。我的问题是用于读取文件内容的uv_read_start。
在此之后,我必须让malloc(size)分配必要的内存量来填充内存中的所有文件(我绝对希望将这样的文件放在内存中)。
有没有办法在没有全局变量的情况下做到这一点?也许是一种完全不同的方式来做同样的事情?
提前谢谢。
发布于 2018-02-17 00:39:04
我看到handle->data包含一个void*,所以我们可以准确地放入我们想要的内容。在调用uv_read_start之前,将大小存储在流句柄stream->data = (size_t*)malloc(sizeof(size_t));和*(size_t *)(stream->data) = size;中,并通过读取size_t rsize = *(size_t*)(handle->data);在alloc_cb中重用它。在此之后,您必须释放此缓冲区。
还有其他想法吗?
发布于 2018-04-13 18:38:56
正如OP所提到的,使用void *字段是一种选择。
另一种是在C中使用继承(如果使用C++)或继承风格的黑客。
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;
};然后,在将指向my_struct类型的对象的指针强制转换为uv_handle_t ((uv_handle_t*) s)后调用alloc_cb,并在alloc_cb内部强制转换回my_struct
my_struct * s = (my_struct*) handle;在An introduction to libuv,release 2这本书的第8.4段“将数据传递给工作线程”(参见here)中,对C方法进行了更详细的解释(尽管在不同的上下文中)。
https://stackoverflow.com/questions/48788195
复制相似问题