1 /*============================================================================= 2 asynch_client.cpp 3 =============================================================================== 4 This is an example of an XML-RPC client that uses XML-RPC for C/C++ 5 (Xmlrpc-c). 6 7 In particular, it does multiple RPCs asynchronously, running 8 simultaneously. 9 =============================================================================*/ 10 11 #include <cassert> 12 #include <cstdlib> 13 #include <string> 14 #include <iostream> 15 16 using namespace std; 17 18 #include <xmlrpc-c/girerr.hpp> 19 #include <xmlrpc-c/base.hpp> 20 #include <xmlrpc-c/client.hpp> 21 22 int main(int argc,char **)23main(int argc, char **) { 24 25 if (argc-1 > 0) { 26 cerr << "This program has no arguments" << endl; 27 exit(1); 28 } 29 30 try { 31 xmlrpc_c::clientXmlTransport_curl myTransport; 32 33 xmlrpc_c::client_xml myClient(&myTransport); 34 35 string const methodName("sample.add"); 36 37 xmlrpc_c::paramList sampleAddParms1; 38 sampleAddParms1.add(xmlrpc_c::value_int(3)); 39 sampleAddParms1.add(xmlrpc_c::value_int(1)); 40 41 xmlrpc_c::rpcPtr rpc1P(methodName, sampleAddParms1); 42 43 xmlrpc_c::paramList sampleAddParms2; 44 sampleAddParms2.add(xmlrpc_c::value_int(5)); 45 sampleAddParms2.add(xmlrpc_c::value_int(7)); 46 47 xmlrpc_c::rpcPtr rpc2P(methodName, sampleAddParms2); 48 49 string const serverUrl("http://localhost:8080/RPC2"); 50 51 xmlrpc_c::carriageParm_curl0 myCarriageParm(serverUrl); 52 53 rpc1P->start(&myClient, &myCarriageParm); 54 rpc2P->start(&myClient, &myCarriageParm); 55 56 cout << "Two RPCs started. Waiting for them to finish." << endl; 57 58 myClient.finishAsync(xmlrpc_c::timeout()); // infinite timeout 59 60 assert(rpc1P->isFinished()); 61 assert(rpc2P->isFinished()); 62 63 int const sum1(xmlrpc_c::value_int(rpc1P->getResult())); 64 int const sum2(xmlrpc_c::value_int(rpc2P->getResult())); 65 66 cout << "Result of RPC 1 (sum of 3 and 1): " << sum1 << endl; 67 cout << "Result of RPC 2 (sum of 5 and 7): " << sum2 << endl; 68 69 } catch (exception const& e) { 70 cerr << "Client threw error: " << e.what() << endl; 71 } catch (...) { 72 cerr << "Client threw unexpected error." << endl; 73 } 74 75 return 0; 76 } 77