Gsoap开发之结构体数据输入(对Server而言)

来源:互联网 发布:索尼耳机软件 编辑:程序博客网 时间:2024/04/30 23:01

头文件Netinterface.h如下:

/**for ip change**/struct ns__ipAddrEx{    char *ns__ipSrc;    char *ns__ipDst;};struct ns__ipAddrExResponse{};/**for ip change**/
int ns__PosSetting(struct ns__ipAddrEx* ipSetting_In,  struct ns__ipAddrExResponse* ipR_Out);

接口为
int ns__PosSetting(struct ns__ipAddrEx* ipSetting_In,  struct ns__ipAddrExResponse* ipR_Out);  第一个形参为输入(相对Server而言,下同),第二个形参为输出结构体。


找到soapcpp2执行文件,新建一个工程目录后进入,在terminal里执行$ ./soapcpp2 -c Netinterface.h  

-c 是生成纯C的SOAP代码架构的意思,这些可以参看soapcpp2命令说明。 OK,生成架构后即可开始码代码了。

Server端:

#define  myTable   "/etc/ipaddr"#define  IP_LEN    4#define  IP_BUF    100#define  IPADDR_LEN   16

intmain (int argc, char *argv[]){int m, s;struct soap mySoap;soap_init (&mySoap);mySoap.bind_flags = SO_REUSEADDR;mySoap.fget = http_get;soap_set_namespaces(&mySoap, namespaces);soap_set_recv_logfile(&mySoap, "./log/S_RECV.log");soap_set_sent_logfile(&mySoap, "./log/S_SENT.log");soap_set_test_logfile(&mySoap, "./log/S_TEST.log");if (argc < 2){  printf ("usage: %s <server_port> \n", argv[0]);  exit (1);}else{  m = soap_bind (&mySoap, NULL, atoi (argv[1]), 100);  if (m < 0)  {  soap_print_fault (&mySoap, stderr);  exit (-1);  }  fprintf (stderr, "Socket connection successful: master socket = %d\n",m);  for (;;)  {  s = soap_accept (&mySoap);  if (s < 0)  {  soap_print_fault (&mySoap, stderr);  exit (-1);  }  fprintf (stderr,  "Socket connection successful: slave socket = %d\n", s);  soap_serve (&mySoap);    //该句说明该server的服务  soap_end (&mySoap);  }}return 0;}
<pre name="code" class="cpp">intns__PosSetting(struct soap *mySoap, struct ns__ipAddrEx* ipSetting_In,  struct ns__ipAddrExResponse* ipR_Out){   int result = -1;   if(ipSetting_In->ns__ipSrc != NULL && ipSetting_In->ns__ipDst)   {   result = SOAP_OK;   printf("__PosSetting: srcIp--%s,  dstIp--%s\n", ipSetting_In->ns__ipSrc, ipSetting_In->ns__ipDst);   }   else   {   printf("server: PosSetting\n");   }   return result;}




Client端:

<pre name="code" class="cpp">intPosSetting(const char *server, struct ns__ipAddrEx* ipSetting_In,  struct ns__ipAddrExResponse* ipR_Out){struct soap mySoap;                         /* 创建mySoap()结构体 */int result = 0;soap_init (&mySoap);                        /* soap_init()*/soap_set_namespaces(&mySoap, namespaces);ipSetting_In->ns__ipSrc = soap_malloc(&mySoap, 16);memset(ipSetting_In->ns__ipSrc, '\0', 16);snprintf(ipSetting_In->ns__ipSrc, 16, "10.0.0.22");ipSetting_In->ns__ipDst = soap_malloc(&mySoap, 16);memset(ipSetting_In->ns__ipDst, '\0', 16);snprintf(ipSetting_In->ns__ipDst, 16, "10.0.0.21");#ifdef  __DEBUGsoap_set_recv_logfile(&mySoap, "./log/C_RECV.log");soap_set_sent_logfile(&mySoap, "./log/C_SENT.log");soap_set_test_logfile(&mySoap, "./log/C_TEST.log");#endifsoap_call_ns__PosSetting (&mySoap, server, "", ipSetting_In, ipR_Out); /* 调用soap_call_ns__PosSetting() */if (mySoap.error)    {printf ("soap error:%d,%s,%s\n", mySoap.error,          *soap_faultcode (&mySoap), *soap_faultstring (&mySoap));result = mySoap.error;    }else{printf("PosSetting OK\n");}soap_end (&mySoap);                         /* 释放内存空间 */soap_done (&mySoap);return result;}

最后,分别执行Server及Client端应用即可。

PS: 要善于利用wireshark网络抓包工具,对协议包进行分析,另外也要会用gsoap提供的debug log, 从里面可以看出很多问题。 我的一个内存出错问题还有结构体传送异常问题也都是通过它找到答案的。
0 0
原创粉丝点击