折腾了近一周时间,终于搞出来在C中用gsoap传递结构型数组了。用了一堆指针,好麻烦哈!

传递一个结构型数组。结构定义如下:

struct JobStatusDetail {
  int jobId;
  int status;
  char cpuTime[10];
  char wallTime[10];
}

步骤一、定义gsoap的.h文件

//gsoap ns service name:        JobService
//gsoap ns service style:       rpc
//gsoap ns service encoding:    encoded
//gsoap ns service namespace:   http://abc.com/Jobservice.wsdl
//gsoap ns service location:    http://abc.com/Jobservice.cgi

//gsoap ns schema namespace:    urn:JobService
typedef struct JobStatusDetail {
   int jobId;
  int status;
  char cpuTime[10];
  char wallTime[10];
} testType;

typedef testType *xsd__JobStatusDetailPointer;
  struct ns__JobStatusPointer {
  xsd__JobStatusDetailPointer  *__ptr;
  int __size;
};
int ns__StructArrayTest(char *cmd, struct ns__JobStatusPointer *structResult);

步骤二、实现服务器端的函数如下,整个gsoap服务器端程序结构可参见gsoap服务器与客户机程序的建立过程

int ns__StructArrayTest(struct soap *soap, char *cmd, struct ns__JobStatusPointer *structResult) {

  structResult->__size=2; //数组有两个element
  structResult->__ptr = malloc((structResult->__size+1)*sizeof(*structResult->__ptr));

  structResult->__ptr[0]=(testType *)malloc(sizeof(testType));
  (*structResult->__ptr[0]).jobId=1;  //搞了很久,终于明白(*structResult->__ptr[0])里一定存放结构具体内容
  (*structResult->__ptr[0]).status=1;
   strcpy((*structResult->__ptr[0]).cpuTime,"11:11:11");
   strcpy((*structResult->__ptr[0]).wallTime,"22:22:22");

   structResult->__ptr[1]=(testType *)malloc(sizeof(testType));
   (*structResult->__ptr[1]).jobId=2;
   (*structResult->__ptr[1]).status=2;
   strcpy((*structResult->__ptr[1]).cpuTime,"33:33:33");
   strcpy((*structResult->__ptr[1]).wallTime,"44:44:44");
  return SOAP_OK;
}

 

步骤三、实现客户端程序

#include "soapH.h"
#include "JobService.nsmap"
#include <string.h>
const char server[] = "http://**.**.**:nnnn";

static char Server[]="**.**.**";
int main(int argc, char **argv)
{
  struct soap soap;

  char buf[1024]="Tell me the job status!";
  struct ns__JobStatusPointer result;
  if (argc<1)
  {
    fprintf(stderr, "Usage: jobOptionfile \n");
    exit(0);
  }
  soap_init(&soap);

  strcpy(buf, argv[1]);

  soap_call_ns__StructArrayTest(&soap, server,"", buf, &result);
  if (soap.error)  {
    soap_print_fault(&soap, stderr);
    printf("soap wrong: %d, \n please inform the administrator!\n",soap.error);
    exit(1);
  }
  int i;
  for (i=0; i<result.__size; i++)
     printf ("jobid: %d jobStatus:%d, cpuTime:%s, wallTime:%s\n",result.__ptr[i]->jobId,result.__ptr[i]->status,result.__ptr[i]->cpuTime, result.__ptr[i]->wallTime);

  soap_destroy(&soap);
  soap_end(&soap);
  return 1;
}

编译完成后,运行客户端程序,在运行结束后,服务器和客户端的当前目录下会有SENT.log和RECV.log两个文件,可以用来查来两端收发消息的内容。

gsoap一次可以传递的信息的大小是有缺省规定的,但可以修改。可查看gsoap手册。