[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 還是得自己參考一下文件呀~