2013-11-03 3 views
2

D-Bus server.c 및 client.c 코드가 있으며 수정되었습니다. 예를 들어 client.c에서 "hi"를 입력하면 결과가 나타납니다. 서버는 "message hi"메시지를 출력하고 "reply_content !!!!!!" to client.cD-Bus 메시지에 회신하는 방법

그러나 이제는 client.c가 응답 메시지를받을 수없는 것으로 보입니다. 누구나 아이디어가 있으십니까?

미리 감사드립니다. 여기

"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

#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; 
} 

답변

0

에만 반환 값이없는 순간에 신호와 통신하고 있습니다.

client.c에서 dbus_message_new_signal 대신 dbus_message_new_method_call을 사용하고 server.c에서 type='signal'type='method_call'으로 변경해야합니다.

관련 문제