如何回复D-Bus消息 [英] How to reply a D-Bus message

查看:180
本文介绍了如何回复D-Bus消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到了D-Bus server.c和client.c代码,并进行了一些修改. 我想要从client.c输入例如"hi"的结果 服务器将打印"receive message hi",并回复"reply_content !!!!!!"到client.c

I got the D-Bus server.c and client.c code, and made some modification. I want the result that when type for example "hi" from client.c server will print "receive message hi", and reply "reply_content!!!!!!" to client.c

但是现在看来client.c无法获得回复消息. 有人知道吗?

But it seems that now client.c cannot get the reply message. Anyone have the idea?

谢谢.

"server.c"
/* server.c */

#include <dbus/dbus.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

static DBusHandlerResult
filter_func(DBusConnection *connection, DBusMessage *message, void *usr_data)
{
    DBusMessage *reply;
    dbus_bool_t handled = false;
    char *word = NULL;
    DBusError dberr;

    dbus_error_init(&dberr);
    dbus_message_get_args(message, &dberr, DBUS_TYPE_STRING, &word, DBUS_TYPE_INVALID);
    printf("receive message: %s\n", word);
    handled = true;

    reply = dbus_message_new_method_return(message);
    char * reply_content = "reply_content!!!!!!";

    dbus_message_append_args(reply, DBUS_TYPE_STRING, &reply_content, DBUS_TYPE_INVALID);

    dbus_connection_send(connection, reply, NULL);
    dbus_connection_flush(connection);
    dbus_message_unref(reply);

    return (handled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
}

int main(int argc, char *argv[])
{
    DBusError dberr;
    DBusConnection *dbconn;

    dbus_error_init(&dberr);
    dbconn = dbus_bus_get(DBUS_BUS_SESSION, &dberr);

    if (!dbus_connection_add_filter(dbconn, filter_func, NULL, NULL)) {
        return -1;
    }

    dbus_bus_add_match(dbconn, "type='signal',interface='client.signal.Type'", &dberr);

    while(dbus_connection_read_write_dispatch(dbconn, -1)) {
        /* loop */
    }
    return 0;
}

这里是client.c

Here is client.c

#include <dbus/dbus.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

static DBusHandlerResult
filter_func(DBusConnection *connection, DBusMessage *message, void *usr_data)
{
    dbus_bool_t handled = false;
    char *word = NULL;
    DBusError dberr;

    dbus_error_init(&dberr);
    dbus_message_get_args(message, &dberr, DBUS_TYPE_STRING, &word, DBUS_TYPE_INVALID);

    printf("receive message %s\n", word);
    handled = true;

    return (handled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
}


int db_send(DBusConnection *dbconn)
{
    DBusMessage *dbmsg;
    char *word = (char *)malloc(sizeof(char));
    int i;

    dbmsg = dbus_message_new_signal("/client/signal/Object", "client.signal.Type", "Test");

    scanf("%s", word);

    if (!dbus_message_append_args(dbmsg, DBUS_TYPE_STRING, &word, DBUS_TYPE_INVALID)) {
    return -1;
    }

    if (!dbus_connection_send(dbconn, dbmsg, NULL)) {
        return -1;
    }
    dbus_connection_flush(dbconn);
    printf("send message %s\n", word);

    dbus_message_unref(dbmsg);
    return 0;
}

int main(int argc, char *argv[])
{
    DBusError dberr;
    DBusConnection *dbconn;

    dbus_error_init(&dberr);

    dbconn = dbus_bus_get(DBUS_BUS_SESSION, &dberr);
    if (!dbus_connection_add_filter(dbconn, filter_func, NULL, NULL)) {
        return -1;
    }

    db_send(dbconn);

    while(dbus_connection_read_write_dispatch(dbconn, -1)) {
        db_send(dbconn);
    }
    dbus_connection_unref(dbconn);

    return 0;
}

推荐答案

您目前仅与没有返回值的信号进行通信.

You're communicating only with signals at the moment, which don't have a return value.

在client.c中,使用dbus_message_new_method_call代替dbus_message_new_signal,在server.c中,您可能必须将type='signal'更改为type='method_call'.

In client.c, use dbus_message_new_method_call instead of dbus_message_new_signal, and in server.c you probably have to change type='signal' to type='method_call'.

这篇关于如何回复D-Bus消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆