找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2900|回复: 0
打印 上一主题 下一主题
收起左侧

xmlrpc-c库的一个测试程序,client端输入N个字符串到server段排序后返回

[复制链接]
跳转到指定楼层
楼主
ID:77367 发表于 2015-4-18 20:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. /*******************************************************************************************************
  2. *Application:xmlrpc_client.c
  3. *description:A simple string sort XML-RPC client program written in C.
  4. *author:hemmingway
  5. *time:26/05/2012 09:18:09
  6. *compile with: gcc -Wall -c -I/usr/local/include -O2 -o xmlrpc_client.o xmlrpc_client.c
  7.     gcc -lxmlrpc_client -lxmlrpc -lxmlrpc_util -lcurl -o xmlrpc_client  xmlrpc_client.o
  8. *************************************************************************************************************/

  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <unistd.h>
  13. #include <xmlrpc-c/base.h>
  14. #include <xmlrpc-c/client.h>
  15. #include <xmlrpc-c/util.h>
  16. /*xmlrpc_env is defined in  xmlrpc-c/util.h*/
  17. #define NAME  "XMLRPC string sort C Client"
  18. #define VERSION "0.1"
  19. #define SLEEP(seconds) sleep(seconds);
  20. #define MAXLEN  1000   /*max length of any input line*/
  21. #define MAXLINES 500  /*max #lines to be sorted*/
  22. char *lineptr[MAXLINES];

  23. void die_if_fault_occurred (xmlrpc_env *env)
  24. {
  25.     /* Check our error-handling environment for an XML-RPC fault. */
  26.     if (env->fault_occurred) {
  27.         fprintf(stderr, "XML-RPC Fault: %s (%d)\n",
  28.                 env->fault_string, env->fault_code);
  29.         exit(1);
  30.     }
  31. }

  32. /*getline:read a line into s, return length*/
  33. int getline(char s[], int lim)
  34. {
  35. int c = 0 , i;
  36. /*
  37. for(i=0; i < lim-1 && (c=getchar()!=EOF) && c!='\n';++i)
  38.   s[i]=c;
  39. */
  40. i = 0;
  41. while(--lim > 0 && (c=getchar()) != EOF && c != '\n')
  42.   s[i++] = c;
  43. if(c == '\n')
  44.   s[i++] = c;
  45. s[i] = '\0';
  46. return i;
  47. }
  48. /*readlines: read input lines*/
  49. int readlines(char *linrptr[], int maxlines)
  50. {
  51. int len,nlines;
  52. char *p,line[MAXLEN];

  53. nlines = 0;
  54. while( (len = getline(line,MAXLEN) ) > 1)
  55.   if(nlines >= maxlines || (p = malloc(len*sizeof(char)) )== NULL)
  56.    return -1;
  57.   else
  58.   {
  59.    line[len-1] = '\0'; /*delete new line*/
  60.    strcpy(p,line);
  61.    lineptr[nlines++] = p;
  62.   }
  63. return nlines;
  64. }
  65. void writelines(char *lineptr[], int nlines)
  66. {
  67. int i;
  68. for(i= 0; i < nlines; i++)
  69.   printf("%s\n",lineptr[i]);
  70. }

  71. int main(int argc,  char **argv)
  72. {
  73. xmlrpc_env env;
  74. xmlrpc_value *myArrayP;
  75. xmlrpc_value *resultArrayP;
  76. xmlrpc_value *itemP;
  77. const char * const serverUrl = "http://localhost:8080/RPC2";
  78. const char * const methodName = "string.qsort";
  79. char *line;
  80. int nlines, i;
  81. /* Initialize our error-handling environment. */
  82. xmlrpc_env_init(&env);
  83. /* Start up our XML-RPC client library. */
  84. xmlrpc_client_init2(&env, XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION, NULL, 0);
  85. die_if_fault_occurred(&env);

  86. printf("Making XMLRPC call to server url '%s' method '%s' "
  87.            "to sort \'char *lineptr[]\' into increasing order...\n", serverUrl, methodName);
  88. printf("\n\n");
  89. printf(">>>plz input a line to be sort(press <ENTER><ENTER> to done!):\n");

  90. /*
  91. while(getline(line,MAXLEN) <= 0 )
  92.   ;
  93. printf(">>>input line is:\n%s\n\n",line);

  94. */

  95. if ( (nlines = readlines(lineptr,MAXLINES) ) < 0 ){
  96.   printf("error:...");
  97.   return 1;
  98. }

  99. printf(">>>lines:%d\n",nlines);
  100. printf(">>>input line's is:\n");
  101. writelines(lineptr, nlines);
  102. printf("\n\n");
  103. printf(">>>\n");

  104. myArrayP = xmlrpc_array_new(&env);
  105. die_if_fault_occurred(&env);
  106. /*build array*/
  107. for( i= 0; i < nlines; i++)
  108. {
  109.   itemP = xmlrpc_string_new(&env, lineptr[i]);
  110.       xmlrpc_array_append_item(&env, myArrayP, itemP);
  111.   xmlrpc_DECREF(itemP);
  112. }
  113. /*test...*/
  114. printf("test input array size:%d\n\n\n",xmlrpc_array_size(&env,myArrayP));  /*Array size*/

  115. /* Make the remote procedure call */
  116. resultArrayP = xmlrpc_array_new(&env);
  117. die_if_fault_occurred(&env);
  118. resultArrayP = xmlrpc_client_call(&env, serverUrl, methodName, "(iA)", (xmlrpc_int32)nlines, myArrayP);
  119. die_if_fault_occurred(&env);


  120. /* print  sort string out. */
  121. printf(">>>string after sort.\n");
  122. nlines =  xmlrpc_array_size(&env,resultArrayP);
  123. for( i= 0; i < nlines; i++)
  124. {
  125.   xmlrpc_array_read_item(&env, resultArrayP, i, &itemP);
  126.   xmlrpc_read_string(&env, itemP, &line );
  127.   printf("%s\n",line);
  128.   xmlrpc_DECREF(itemP);
  129. }
  130. die_if_fault_occurred(&env);

  131. /* Dispose of our result value. */
  132. xmlrpc_DECREF(myArrayP);
  133. xmlrpc_DECREF(resultArrayP);

  134. /* Shutdown our XML-RPC client library. */
  135. xmlrpc_env_clean(&env);
  136. xmlrpc_client_cleanup();

  137. return 0;
  138. }


  139. /*******************************************************************************************************
  140. *Application:xmlrpc_server.c
  141. *description:A simple string sort XML-RPC client program written in C.
  142. *author:hemmingway
  143. *time:26/05/2012 09:18:09
  144. *compile with: gcc -Wall -c -I/usr/local/include -O2 -o xmlrpc_server.o xmlrpc_server.c
  145.     gcc -lxmlrpc_server -lxmlrpc_server_abyss -lxmlrpc -lxmlrpc_util -lcurl -o xmlrpc_server xmlrpc_server.o
  146. *************************************************************************************************************/

  147. #include <stdio.h>
  148. #include <stdlib.h>
  149. #include <string.h>
  150. #include <unistd.h>
  151. #include <xmlrpc-c/base.h>
  152. #include <xmlrpc-c/server.h>
  153. #include <xmlrpc-c/server_abyss.h>
  154. #include <xmlrpc-c/util.h>
  155. #define SLEEP(seconds) sleep(seconds);
  156. /*qsort:sort v[left]...v[right] into increasing order*/
  157. void str_qsort(char *v[], int left, int right)
  158. {
  159. int i,last;
  160. void swap(char *v[], int i, int j);

  161. if(left >= right)   /*do nothing if array contains fewer than two elements*/
  162.   return;
  163. swap(v,left,(left + right)/2); /*move partition elem*/
  164. last = left;
  165. for(i = left + 1; i <= right; i++)
  166.   if( strcmp(v[i],v[left]) < 0 )
  167.    swap(v, ++last,i);
  168. swap(v,left,last);
  169. str_qsort(v, left,last-1);
  170. str_qsort(v, last+1, right);
  171. return;
  172. }
  173. /*swap: interchange v[i] and v[j]*/
  174. void swap(char *v[], int i, int j)
  175. {
  176. char *temp;
  177. temp = v[i];
  178. v[i] = v[j];
  179. v[j] = temp;
  180. return ;
  181. }
  182. /*compare_rise: for qsort*/
  183. int compare_rise(const void *a,const void *b)
  184. {
  185. return *(char*)a - *(char*)b;
  186. }
  187. /*sample_qsort:sort string's*/
  188. static  xmlrpc_value *
  189. sample_qsort(xmlrpc_env *   const envP,
  190.            xmlrpc_value * const paramArrayP,
  191.            void *         const usr_data)
  192. {

  193.      xmlrpc_value *arrayP;
  194. xmlrpc_value *retval;
  195. xmlrpc_int32 nlines;
  196. char *line;

  197. xmlrpc_decompose_value(envP, paramArrayP, "(iA)", &nlines, &arrayP);
  198. if (envP->fault_occurred)
  199.         retval = NULL;
  200. else
  201. {
  202.   size_t size = xmlrpc_array_size(envP, arrayP);
  203.   fprintf(stderr,"service get of array size: %d\n", size);
  204.   if (envP->fault_occurred)
  205.              retval = NULL;
  206.          else   /*sort string*/
  207.   {
  208.     retval = xmlrpc_array_new(envP);
  209.              unsigned int i;
  210.                for (i = 0; i < size && !envP->fault_occurred; ++i)
  211.     {
  212.                     xmlrpc_value * itemP;
  213.                   itemP = xmlrpc_array_get_item(envP, arrayP, i);
  214.                         if (!envP->fault_occurred)
  215.      {
  216.       xmlrpc_read_string(envP, itemP, &line );
  217.       fprintf(stderr,"server test output:%s\n",line);
  218.       /*here we sort our current string*/
  219.       qsort(line, strlen(line), sizeof (char), compare_rise);
  220.       /*build sort string to retval*/
  221.       itemP = xmlrpc_string_new(envP, line);
  222.       xmlrpc_array_append_item(envP, retval, itemP);
  223.                     } /*end if */
  224.      xmlrpc_DECREF(itemP);
  225.                 }/*end for*/
  226.    
  227.     xmlrpc_DECREF(arrayP);
  228.                if (envP->fault_occurred)
  229.                    retval = NULL;
  230.        }/*end second else*/
  231. }/*end firt else*/
  232.     /* Return our result. */
  233.     return  retval;
  234. }
  235. int main(int argc, char **argv)
  236. {

  237. xmlrpc_server_abyss_parms serverparm;
  238. xmlrpc_registry * registryP;
  239. xmlrpc_env env;
  240. xmlrpc_env_init(&env);

  241. registryP = xmlrpc_registry_new(&env);

  242. /*xmlrpc_registry_add_method往服务器注册一个新的方法。
  243. 所谓方法就是可以提供给客户端的一个调用方法。
  244. 需要输入方法名,以及方法的实现函数指针。
  245. */
  246. xmlrpc_registry_add_method(&env, registryP, NULL, "string.qsort", &sample_qsort, NULL);

  247. serverparm.config_file_name = NULL;
  248. serverparm.registryP = registryP;
  249. serverparm.port_number = 8080;
  250. serverparm.log_file_name = "/tmp/xmlrpc_log";

  251. printf("Starting XML-RPC server...\n");

  252. /*xmlrpc_server_abyss启动服务,这是个循环函数*/
  253. xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(registryP));

  254.     return 0;
  255. }


复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表