【问题标题】:Writing a number of bytes to a GLib.OutputStream in Vala在 Vala 中将多个字节写入 GLib.OutputStream
【发布时间】:2012-03-26 14:09:20
【问题描述】:

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

~迈克尔

【问题讨论】:

    标签: networking pointers glib vala gio


    【解决方案1】:

    我一直在使用这样的宏:

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

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

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

    名为“tricks”的头文件和 VAPI 文件是in my GitHub。处理对象数组也有类似的版本。

    【讨论】:

    • 谢谢 :) 我会试试这些。但是,有没有办法通过 Vala 做到这一切?我的意思是,我不介意使用标题,因为只有我才会使用代码。我只是想知道是否可以在不需要 C 代码的情况下完成 :)
    【解决方案2】:
    unowned uint8[] buf = (uint8[]) your_real_buffer;
    buf.length = the_length_you_want;
    

    然后发送buf。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      相关资源
      最近更新 更多