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

原创 2015年07月07日 17:16:59

头文件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

int
main (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">int
ns__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">int
PosSetting(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  __DEBUG
	soap_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");
#endif

	soap_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, 从里面可以看出很多问题。 我的一个内存出错问题还有结构体传送异常问题也都是通过它找到答案的。

基于gsoap开发WebService服务返回结构体数组

基于gsoap开发WebService服务返回结构体数组 gsoap搭建和快速WebService示例编写,前面文章已经介绍过,此文直接讲关键点。 (1)返回的目标结构,开头以ns...

gsoap实现webservice如何发送结构体数组

头文件中如下定义: struct SRecordArray {     int              __size;     struct SRecord **__ptr; }; 注意加粗那一行,...
  • bytxl
  • bytxl
  • 2013年08月26日 09:15
  • 1448

gsoap使用总结

gsoap 服务端 客户端 多线程
  • byxdaz
  • byxdaz
  • 2016年06月15日 11:41
  • 5798

结构体数组与传递结构体变量

说明: 结构体:敌舰 函数:初始化敌舰,升级敌舰 代码: #include using namespace std; //敌舰结构体 struct EnemySpaceShip { in...
  • lionpku
  • lionpku
  • 2015年03月15日 17:47
  • 634

gSoap下Server端接口函数的数据传出

gSoap下Server端接口函数的数据传出 一、引言     gSOAP是一个OpenSource的web服务开发工具,包括server/client通信和wsdl自动生成功能,能依据wsd...
  • CSDNwei
  • CSDNwei
  • 2017年07月26日 16:23
  • 265

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

gSoap使用入门(2)----自定义接口头文件

接口头文件的格式在向导中没有看到明确的说明性的内容,但通过看开发包中示例程序中头文件定义和通过wsdl生成的头文件的内容,可以发现,头文件中都会出现以下几行信息  //gsoap ns servic...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++调用gSoap编写的WEBSERVICE与C#.NET间接口自定义结构体不能重复使用

最近项目开发从C/S架构转成B/S架构后,开始使用webservice技术,由于我们的webservice是由vc++实现的,因此用到了gSoap库实现webservice,而上端业务我们采用了C#编...
  • acidy
  • acidy
  • 2014年02月23日 15:22
  • 1276

使用gSOAP开发实例(5) libxml2解析SOAP响应消息

电信provisioning系统中,常常需要与远程服务器实时交换一些数据,以完成用户的请求。由于简单对象访问协议(Simple Object Access Protocol, SOAP)的流行,许多涉...
  • yui
  • yui
  • 2010年07月26日 22:25
  • 7402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gsoap开发之结构体数据输入(对Server而言)
举报原因:
原因补充:

(最多只允许输入30个字)