# gdbus-p2p-demo **Repository Path**: eric_cg/gdbus-p2p-demo ## Basic Information - **Project Name**: gdbus-p2p-demo - **Description**: P2P模式:这种模式一般称之为点对点的星型结构,Client与Server之间是直接的Peer2Peer的连接,少了DBus Daemon的中转,因此性能较好。 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2021-12-31 - **Last Updated**: 2021-12-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gdbus-p2p-demo #### 介绍 P2P模式:这种模式一般称之为点对点的星型结构,Client与Server之间是直接的Peer2Peer的连接,少了DBus Daemon的中转,因此性能较好。 #### 软件架构 server结构 //创建loop,不运行 pLoop = g_main_loop_new(NULL, FALSE); //创建skeleton pSkeleton = rtplay_gdbus_example_skeleton_new(); //获得guid _guid = g_dbus_generate_guid(); //创建一个新的D-Bus服务器,该服务器侦听有效address中的第一个地址。 _server = g_dbus_server_new_sync("unix:abstract=gdbus_server", G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS, _guid, NULL, NULL, &_error); //注册new-connection,在客户端链接时被调用 g_signal_connect(_server, "new-connection", G_CALLBACK(on_new_connection), NULL); //启动server。 g_dbus_server_start(_server); //运行loop g_main_loop_run(pLoop); on_new_connection函数 //获得_iface _iface = RTPLAY_GDBUS_EXAMPLE_GET_IFACE(pSkeleton); //注册方法,当客户端调用时会被执行 _iface->handle_my_method1 = My_Method1; //导出interface,获得connection。 g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(pSkeleton), connection, RTPLAY_GDBUS_EXAMPLE_OBJECT_PATH, &_error); //注册closed,在客户端断开时被调用 g_signal_connect(connection, "closed", G_CALLBACK(on_close_connection), user_data); client结构 //创建loop,不运行 pLoop = g_main_loop_new(NULL, FALSE); //同步连接并建立D-Bus客户端连接,以与由地址指定的端点交换D-Bus消息。 _pGdbus_connection = g_dbus_connection_new_for_address_sync("unix:abstract=gdbus_server", G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, NULL, NULL, &_pError); //创建proxy,链接信号使用 pProxy = rtplay_gdbus_example_proxy_new_sync(_pGdbus_connection, G_DBUS_PROXY_FLAGS_NONE, NULL, RTPLAY_GDBUS_EXAMPLE_OBJECT_PATH, NULL, &_pError); //信号链接 g_signal_connect(pProxy, "my-signal1", G_CALLBACK(My_Signal_1_Handler), NULL); //运行loop g_main_loop_run(pLoop); #### 安装教程 1. mkdir build 2. cd build/ 3. cmake .. 4. make #### 运行结果 ```bash $ ./server/SvrExample InitDBusCommunicationServer: Server started. New thread created: Success run call in the server. Emit_My_Signal1() is called. Emit_My_Signal1() is called. Emit_My_Signal2() is called. Emit_My_Signal1() is called. Emit_My_Signal1() is called. Emit_My_Signal2() is called. Emit_My_Signal1() is called. Emit_My_Signal1() is called. Emit_My_Signal2() is called. Emit_My_Signal1() is called. Emit_My_Signal1() is called. Emit_My_Signal2() is called. A new connection [ 0x7f0c24004040 ] was created Emit_My_Signal1() is called. Server MyMethod1 call. Parameter: method1 synchronize call.. Server MyMethod1 call. Parameter: method1 asynchronize call.. Server MyMethod2 call. Parameter: in_arg1 = 12 , in_arg2 = 34. Server MyMethod2 call. Parameter: in_arg1 = 10 , in_arg2 = 21. Emit_My_Signal1() is called. Emit_My_Signal2() is called. Emit_My_Signal1() is called. Emit_My_Signal2() is called. Emit_My_Signal1() is called. Emit_My_Signal1() is called. Emit_My_Signal1() is called. Emit_My_Signal2() is called. The (null) connection [ 0x7f0c24004040 ] was closed! Emit_My_Signal1() is called. ``` ```bash $ ./example/CltExample InitDBusCommunication: Client started. New thread created: Success run call in the client. Signal_1_Callback: String value: Server Signal1(13). client myMethod_1 call, in_arg = method1 synchronize call. out_arg = Server My_Method1 to output.. client myMethodAsync_1 call, in_arg = method1 asynchronize call.. client MethodCallback_1 call. Method1Callback: return value: Server My_Method1 to output.. client myMethod_2 call, in_arg1 = 12, in_arg2 = 34, out_arg1 = Server MyMethod2 to output., out_arg2 = 46. client myMethodAsync_2 call, in_arg1 = 10, in_arg2 = 21. client MethodCallback_2 call. Method2Callback: return value: (Server MyMethod2 to output., 31). Signal_1_Callback: String value: Server Signal1(14). Signal_2_Callback: Int value: 15, String value: Server Signal2 Signal_1_Callback: String value: Server Signal1(16). Signal_2_Callback: Int value: 17, String value: Server Signal2 Signal_1_Callback: String value: Server Signal1(18). Signal_1_Callback: String value: Server Signal1(19). Signal_1_Callback: String value: Server Signal1(20). Signal_2_Callback: Int value: 21, String value: Server Signal2 ``` #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)