DBus,C -发送/接收二进制数据

vpfxa7rd  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(197)

寻找一个简单的教程。
我需要通过DBus(纯C)发送和接收二进制数据。
我找到的所有教程都使用DBUS_TYPE_STRING,但我有一个二进制数据块。
这样思考用法:

void write_msg(DbusConnection *conn, void *data, size_t datasize) {
   DBusMessage *msg = dbus_message_new(DBUS_TYPE_ARRAY); // Is it DBUS_TYPE_ARRAY?

   // how to convert data of datasize into msg?

   dbus_connection_send(conn, msg, NULL);

   dbus_free(msg); // there is no dbus_message_free() function?
}

void read_msg(DbusConnection *conn, void *data, size_t datasize) {
   DBusMessage *msg = dbus_connection_pop_message(conn);

   // how to convert msg to data of datasize?

   dbus_free(msg);
}

// And to use it as:
struct my_struct st;
write_msg(conn, &st, sizeof(st));

那么,如何将一个非类型化的内存块写入/读取到DBusMessage中呢?让它像在套接字中写/读数据报一样简单?

9jyewag0

9jyewag01#

dbus_message_new(DBUS_TYPE_ARRAY); // Is it DBUS_TYPE_ARRAY

不,这是 message 类型,不是数据类型。D-Bus有“方法调用”和“信号”作为两种主要的消息类型-如果您通过D-Bus调用函数(方法),您应该指定DBUS_MESSAGE_TYPE_METHOD_CALL,或使用dbus_message_new_method_call()函数。
那么,如何将一个非类型化的内存块写入/读取到DBusMessage中呢?
D-Bus中的二进制数据通常以ay类型传输-“字节数组”。
虽然我对dbus-glib不是很熟悉,但我查看了wpa_supplicant的源代码(hostap.git)作为示例,我认为您正在寻找:
1.数组以dbus_message_iter_open_container(&val, DBUS_TYPE_ARRAY, "y", &iter)开始,
1.使用dbus_message_iter_append_fixed_array()写入数据
(或者,您可以为内存块的每个字节循环dbus_message_iter_append_basic(&iter, DBUS_TYPE_BYTE, &(val[i]))),
1.使用dbus_message_iter_close_container(&iter)完成
让它像在套接字中写/读数据报一样简单?
如果您所需要的只是通过套接字传输数据报,那么D-Bus可能不适合您。你不能完全摆脱它的结构(方法调用/返回格式和对象和接口系统)--如果你这样做了,那么使用D-Bus的意义何在?
但是,请尝试使用GLib 2(GDBus)或systemd的“sd-bus”作为更易于使用的C库。(您正在使用的dbus-glib库大多被认为是不推荐使用的,而倾向于通过GLib使用GDBus;它将永远保持工作,但不再真正维护。)
此外,请记住,D-Bus并不适用于大容量流量。通过私有套接字是可以的,但是共享系统(或会话)总线将对可接受的内容有限制。
如果你真的需要一个原始的Unix套接字,那么 * 使用套接字 * -例如,你可以创建一个socketpair(),通过D-Bus调用传递一个文件描述符(使用h值),然后通过套接字继续所有通信。一些程序已经做到了这一点,甚至dbus-daemon维护人员也建议需要高通信量或非结构化通信的程序这样做。

相关问题