C/C++을 위한 XML-RPC는 xmlrpc-c 웹사이트 에서 구할 수 있다.
관련 파일들은 RPM 형태로 구할 수도 있고, 소스를 내려받아 컴파일할 수도 있다.
다음의 코드를 getSumAndDifference.c의 이름으로 저장하라:
#include <stdio.h>
#include <xmlrpc.h>
#include <xmlrpc_client.h>
#define NAME "XML-RPC getSumAndDifference C Client"
#define VERSION "0.1"
#define SERVER_URL "http://xmlrpc-c.sourceforge.net/api/sample.php"
void die_if_fault_occurred (xmlrpc_env *env)
{
/* Check our error-handling environment for an XML-RPC fault. */
if (env->fault_occurred) {
fprintf(stderr, "XML-RPC Fault: %s (%d)\n",
env->fault_string, env->fault_code);
exit(1);
}
}
int main (int argc, char** argv)
{
xmlrpc_env env;
xmlrpc_value *result;
xmlrpc_int32 sum, difference;
/* Start up our XML-RPC client library. */
xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION);
xmlrpc_env_init(&env);
/* Call our XML-RPC server. */
result = xmlrpc_client_call(&env, SERVER_URL,
"sample.sumAndDifference", "(ii)",
(xmlrpc_int32) 5,
(xmlrpc_int32) 3);
die_if_fault_occurred(&env);
/* Parse our result value. */
xmlrpc_parse_value(&env, result, "{s:i,s:i,*}",
"sum", &sum,
"difference", &difference);
die_if_fault_occurred(&env);
/* Print out our sum and difference. */
printf("Sum: %d, Difference: %d\n", (int) sum, (int) difference);
/* Dispose of our result value. */
xmlrpc_DECREF(result);
/* Shutdown our XML-RPC client library. */
xmlrpc_env_clean(&env);
xmlrpc_client_cleanup();
return 0;
} |
컴파일은 다음과 같이 한다:
bash$ CLIENT_CFLAGS=`xmlrpc-c-config libwww-client --cflags` bash$ CLIENT_LIBS=`xmlrpc-c-config libwww-client --libs` bash$ gcc $CLIENT_CFLAGS -o getSumAndDifference getSumAndDifference.c $CLIENT_LIBS |
각자의 시스템에 맞도록 위의 gcc를 바꿔주면 된다.
다음의 코드를 getSumAndDifference2.cc의 이름으로 저장하라:
#include <iostream.h>
#include <XmlRpcCpp.h>
#define NAME "XML-RPC getSumAndDifference C++ Client"
#define VERSION "0.1"
#define SERVER_URL "http://xmlrpc-c.sourceforge.net/api/sample.php"
static void get_sum_and_difference () {
// Build our parameter array.
XmlRpcValue param_array = XmlRpcValue::makeArray();
param_array.arrayAppendItem(XmlRpcValue::makeInt(5));
param_array.arrayAppendItem(XmlRpcValue::makeInt(3));
// Create an object to resprent the server, and make our call.
XmlRpcClient server (SERVER_URL);
XmlRpcValue result = server.call("sample.sumAndDifference", param_array);
// Extract the sum and difference from our struct.
XmlRpcValue::int32 sum = result.structGetValue("sum").getInt();
XmlRpcValue::int32 diff = result.structGetValue("difference").getInt();
cout << "Sum: " << sum << ", Difference: " << diff << endl;
}
int main (int argc, char **argv) {
// Start up our client library.
XmlRpcClient::Initialize(NAME, VERSION);
// Call our client routine, and watch out for faults.
try {
get_sum_and_difference();
} catch (XmlRpcFault& fault) {
cerr << argv[0] << ": XML-RPC fault #" << fault.getFaultCode()
<< ": " << fault.getFaultString() << endl;
XmlRpcClient::Terminate();
exit(1);
}
// Shut down our client library.
XmlRpcClient::Terminate();
return 0;
} |
컴파일은 다음과 같이 한다:
bash$ CLIENT_CFLAGS=`xmlrpc-c-config c++ libwww-client --cflags` bash$ CLIENT_LIBS=`xmlrpc-c-config c++ libwww-client --libs` bash$ c++ $CLIENT_CFLAGS -o getSumAndDifference2 getSumAndDifference2.cc $CLIENT_LIBS |
구식 C++ 컴파일러로는 제대로 컴파일이 되지 않을 수도 있다.
만약 XML-RPC 서버가 Introspection API를 지원한다면 자동으로 C++ proxy class를 만들 수 있다. Proxy class를 만들기 위해서는 다음의 명령을 입력하고 그 결과를 파일로 저장하라:
bash$ xml-rpc-api2cpp \ > http://xmlrpc-c.sourceforge.net/api/sample.php sample SampleProxy |
위의 명령은 SampleProxy라는 이름의 proxy class를 만든다. SampleProxy는 sample로 시작하는 모든 메쏘드의 래퍼(wrapper)를 가지고 있다. 물론 원한다면 수정할 수 있다.
다음의 코드를 sumAndDifference.c의 이름으로 저장하라:
#include <xmlrpc.h>
#include <xmlrpc_cgi.h>
xmlrpc_value *
sumAndDifference (xmlrpc_env *env, xmlrpc_value *param_array, void *user_data)
{
xmlrpc_int32 x, y;
/* Parse our argument array. */
xmlrpc_parse_value(env, param_array, "(ii)", &x, &y);
if (env->fault_occurred)
return NULL;
/* Return our result. */
return xmlrpc_build_value(env, "{s:i,s:i}",
"sum", x + y,
"difference", x - y);
}
int main (int argc, char **argv)
{
/* Set up our CGI library. */
xmlrpc_cgi_init(XMLRPC_CGI_NO_FLAGS);
/* Install our only method (with a method signature and a help string). */
xmlrpc_cgi_add_method_w_doc("sample.sumAndDifference",
&sumAndDifference, NULL,
"S:ii", "Add and subtract two integers.");
/* Call the appropriate method. */
xmlrpc_cgi_process_call();
/* Clean up our CGI library. */
xmlrpc_cgi_cleanup();
} |
컴파일은 다음과 같이 한다:
bash$ CGI_CFLAGS=`xmlrpc-c-config cgi-server --cflags` bash$ CGI_LIBS=`xmlrpc-c-config cgi-server --libs` bash$ gcc $CGI_CFLAGS -o sumAndDifference.cgi sumAndDifference.c $CGI_LIBS |
컴파일이 되었으면 sumAndDifference.cgi 파일을 웹서버의 cgi-bin 디렉토리에 복사하면 된다.