将多个字节写入Vala中的GLib.OutputStream

时间:2012-03-26 14:09:20

标签: networking pointers glib vala gio

我目前正在编写一个使用Vala的应用程序,它要求我通过网络发送数据。为了帮助创建数据包(以及在以后的日期更新协议),我创建了一些结构,我将其作为void *传递给方法。这些结构代表了数据包的排列方式,并允许我非常容易地生成一个数据包,而不必过多地混淆。但问题是,GLib.OutputStream.write()的Vala包装器不接受计数(即使原始方法也是如此)。 Vala获取传递给它的uint8 []的大小并将其提供给原始方法。有没有一种简单的解决方法,没有编辑GIO vapi?可能是一种非常便宜的方式,在提供尺寸时向uint8 []投射空白*?我的目标是在这里获得非常高的性能,因为应用程序将需要同时维护数千个连接。提前感谢您的帮助。

〜迈克尔

2 个答案:

答案 0 :(得分:1)

我一直在使用像这样的宏:

#define OBJECT_TO_BUFFER(val,type,size) (*(size) = sizeof(type), (guint8*)val)

解决这个问题。它接受您的对象并简单地返回与uint8[]相同的内存。它在Vala中有相应的原型:

unowned uint8[] Buffer.of<T>(ref T @value);

标题文件和名为“技巧”的VAPI文件是in my GitHub。处理对象数组有类似的版本。

答案 1 :(得分:1)

unowned uint8[] buf = (uint8[]) your_real_buffer;
buf.length = the_length_you_want;

然后发送buf。