4.让我们的server跑起来吧: shell>make shell>./addserver 8888 如果终端打印出“Socket connection successful: master socket = 3”,那么你的server已经在前台run起来了,应该是值得高兴的。 打开IE,键入http://本机IP:8888,显示XML,服务已经启动,终端打印出“Socket connection successful: slave socket = 4”,表示服务接收到了一次soap的连接。
5.让我们再来写个客户端(这个只是将soap的客户端函数封装一下,具体的调用参见下面的addtest.c),创建文件addclient.c,内容如下:
#include "addStub.h" #include "add.nsmap" /** * 传入参数:server:server的地址 * num1,num2:需要相加的数 * 传出参数:sum:num1和num2相加的结果 * 返回值:0为成功,其他为失败 */ int add( const char* server, int num1, int num2, int *sum ) { struct soap add_soap; int result = 0; soap_init(&add_soap); soap_set_namespaces(&add_soap, add_namespaces);
//该函数是客户端调用的主要函数,后面几个参数和add.h中声明的一样,前面多了3个参数,函数名是接口函数名ns__add前面加上soap_call_ soap_call_ns__add( &add_soap, server, "", num1, num2, sum ); if(add_soap.error) { printf("soap error:%d,%s,%s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) ); result = add_soap.error; } soap_end(&add_soap); soap_done(&add_soap); return result; }
6.我们最终写一个可以运行的客户端调用程序,创建文件addtest.c,内容如下:
#include #include
int add(const char* server, int num1, int num2, int *sum);
int main(int argc, char **argv) { int result = -1; char* server="http://localhost:8888"; int num1 = 0; int num2 = 0; int sum = 0; if( argc < 3 ) { printf("usage: %s num1 num2 \n", argv[0]); exit(0); }
num1 = atoi(argv[1]); num2 = atoi(argv[2]);
result = add(server, num1, num2, &sum); if (result != 0) { printf("soap err,errcode = %d\n", result); } else { printf("%d+%d=%d\n", num1, num2, sum ); } return 0; }
7.让我们的client端和server端通讯 shell>make client shell>./addtest 7 8 当然,你的server应该还在run,这样得到输出结果7+8=15,好了,你成功完成了你的第一个C写的WebService,恭喜。 三.图示说明
四.要注意的问题 1. add.h文件前面的几句注释不能删除,为soapcpp2需要识别的标志 2. 接口函数的返回值只能是int,是soap调用的结果,一般通过soap.error来判断soap的连接情况,这个返回值没有用到。 3. 接口函数的最后一个参数为传出参数,如果需要传出多个参数,需要自己定义一个结构将返回项封装。 4. 在.h文件中不能include别的.h文件,可能不能生效,需要用到某些结构的时候需要在该文件中直接声明。 5. 如果客户端的调用不需要返回值,那么最后一个参数 五.参考文档 1.gsoap主页 http://gsoap2.sourceforge.net
2.跟我一起写Makefile http://dev.csdn.net/develop/article/20/20025.shtm
3.Web Services: A Technical Introduction(机械工业出版社) 六.备注 192.168.18.233和192.168.18.234的/usr/local/gsoap目录下的3个需要的文件及一个env目录,不是编译安装的,是在别的地方编译好了直接copy过来的(实际编译结果中还有wsdl2h工具及其他一些文件,但是我们的实际开发中只是用到了这3个文件及env目录)。因为时间仓促,本人还没有时间研究编译的问题,相关细节可以查看参考文档1。 在192.168.18.233的/home/weiqiong/soap/sample目录下及192.168.18.234的/tmp/soap/sample目录下有本文讲到的加法运算的例子。
|