[Linux] 使用 XML-RPC for C/C++ 寫簡單的 IPC client

[Linux] 使用 XML-RPC for C/C++ 寫簡單的 IPC client

我們的專案主要是用 python 寫的,

裡面用了 python 的 xmlrpclib 來作 process 間溝通的管道~

最近有個需求是要用 C++ 寫一個程式與 python 作 IPC,

於是就找到了 XML-RPC for C/C++ 這個函式庫,用起來也還算簡單~

 

1. 安裝 XML-RPC for C/C++

下載頁面抓最新的原始碼,我抓的是 xmlrpc-c-1.33.17.tgz,

把這個 tgz 解開:

tar zxvf xmlrpc-c-1.33.17.tgz
cd xmlrpc-c-1.33.17

 

執行一下 ./configure –help 可以看到說明,

主要就是 –prefix 指定要裝到哪裡,以及用 –disable-xxx 來關閉不需要的功能,

像我只需要在 Linux 上 XML-RPC client 功能,

因此跟 Windows 和 server 相關的功能我都關掉了:

./configure --disable-wininet-client --disable-abyss-server --disable-cgi-server

 

接著就執行 make 和 make install 就能編譯與安裝好:

make && sudo make install

 

裝好之後,應該會有一個 xmlrpc-c-config 的執行檔,

執行一下,確認東西裝好了~

testuser@localhost ~ $ xmlrpc-c-config
You must specify at least one option.
Usage: xmlrpc-c-config <feature> ... <option> ...
The features are:
c++            legacy C++ wrapper API
c++2           modern C++ API
client         client functions
cgi-server     CGI-based server functions
abyss-server   ABYSS-based server functions
pstream-server pstream-based server functions
server-util    basic server functions (implied by *-server)
Options are:
--version      The version number of the package
--features     List all features (aka modules) currently installed
--cflags       C compiler flags to use when '#include'ing package headers
--libs         Libraries and flags to use when linking programs normally
--ldadd        Libraries to use with automake
--ldflags      Flags to use with automake & libtool
--prefix       The prefix under which the package was installed

 

2. 寫一個簡單的 XML-RPC client 程式

假設我們有一個 XML-RPC 的 server listen 在 6251 port,

而且這個 RPC server 有一個 stop() 函式 (無參數),

那麼我們可以寫一個像下面的程式:

 (主要是複製 XML-RPC Small C++ Client Program 這個範例程式再修改)

#include <string>
#include <iostream>
#include <xmlrpc-c/girerr.hpp>
#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/client_simple.hpp>
int main(int argc, char* argv[])
{
try
{
std::string const serverUrl("http://localhost:6251/RPC2");
std::string const methodName("stop");
xmlrpc_c::clientSimple myClient;
xmlrpc_c::value result;
myClient.call(serverUrl, methodName, "", &result);
}
catch (std::exception const& e)
{
std::cerr << "Client threw error: " << e.what() << std::endl;
}
catch (...)
{
std::cerr << "Client threw unexpected error." << std::endl;
}
return 0;
}

 

編譯的時候,會需要參考到 header 和 lib 檔,

這邊執行 xmlrpc-c-config 就可以吐出相關的資訊,例如:

testuser@localhost ~ $ xmlrpc-c-config c++2 client --cflags
-I/usr/local/include
testuser@localhost ~ $ xmlrpc-c-config c++2 client --libs
-L/usr/local/lib   -lxmlrpc_client++ -lxmlrpc_client -lxmlrpc++ -lxmlrpc  -lxmlrpc_xmlparse -lxmlrpc_xmltok -lxmlrpc_util -lcurl   -lxmlrpc_packetsocket

  

因此編譯的參數設定成如下所示:

XMLRPC_CFLAGS=$(xmlrpc-c-config c++2 client --cflags)
XMLRPC_LIBS=$(xmlrpc-c-config c++2 client --libs)
g++ -g3 -ggdb -O2 -Wall -Wshadow -Wcast-align -Wformat=2 -DLNXAMD64 testrpc.cpp ${XMLRPC_CFLAGS} ${XMLRPC_LIBS} -o testrpc

 

3. 執行 XML-RPC C++ 程式

編譯好後的 testrpc 程式,在執行時需要動態連結到 XML-RPC 的一些函式庫,

可以用 LD_LIBRARY_PATH 來設定:

XMLRPC_LDPATH=$(xmlrpc-c-config --prefix)/lib
LD_LIBRARY_PATH=${XMLRPC_LDPATH} ./testrpc

 

這樣就完成一個簡單的 XML-RPC C++ 的 client 端程式囉~

不過要更進階的話,相關的 API 還是得自己參考一下文件呀~

 

 

 

(本頁面已被瀏覽過 1,035 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料