gSOAP开发服务端访问数据库

        1.首先我们粗略地介绍一下gSOAP的功能:

gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。

  gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。
  gSOAP使编写web服务的工作最小化了。gSOAP编译器生成SOAP的代码来序列化或反序列化C/C++的数据结构。gSOAP包含一个WSDL生成器,用它来为你的web服生成web服务的解释。gSOAP的解释器及导入器可以使用户不需要分析web服务的细节就可以实现一个客户端或服务端程序。
        2. 我们需要准备的工具有,vs 2005/2010(也可以是其他版本),gSOAP编译工具,sql2008 这些都可以在网上找到,你们可以自己去找,这里我就不提供了。
        3.现在我们来生成一个C++客服端程序 如下:
           1) 我们先用VS 2005 工具建立一个工程,然后建一个"x.h"(代表以.h结尾的任何文件名的文件,最后写一个有一样的文件)的文件,内容为你想实现功能的函数头,下面例子供参考:
 


/**********************************************************************************************
编写头文件的几种特殊情况的处理已经注意点
1.所有的接口函数的名字必须以ns__开头
2.最后一个参数必须以指针或者引用的方式传递,作为客户端的返回值
3.需要传递的参数类型是一个结构体的时候,必须先要定义一个结构体 ,而且结构体的名字必须以ns__开头
4.当没有传入参数的时候参数类型定义为 void* 即可
***********************************************************************************************/
//登录接口
int ns__Login(char* strUserID, char* strPwd, wchar_t*& iLoginInfo);

//删除会议室预定信息
int ns__DeleteBoardedRoomInfo(char* strMeetingID, int& iResult);

//增加可以被使用的会议室 (操作权限:管理员)
int ns__AddRoom(char* strRoomID, char* strRoomName, int& iResult);

//根据时间查询会议室预定情况信息
int ns__SearchBoardedRoomInfoByTime(char* strTime, wchar_t*

       2)  gSOAP 的安装可以参考:http://wenku.baidu.com/view/68e0fb1252d380eb62946d8e.html  里面有很详细的步骤。

       3)        下载好的gSOAP 工具包里有两个文件,分别是soapcpp2.exe 和 wsdl2h.exe, 把你写好的文件“x.h”拷贝在这两个目录下,然后在dos下输入 soapcpp2.exe -i -S  x.h 回车(记得这两个文件不是放在默认路径下,一定要修改执行路路径哦,如我的这两个文件放在了D:\gSOAP下,可输入 -->D:回车--> cd gSOAP回车),会在这个目录
 
 
下为你自动生成横多不同后缀的文件,如我的生成如图:
      现在你可以吧生成的文件添加到你建的工程中 进行下一不的操作
         4) 生成好文件好以后,接下来我们要做的是,一 在主函数这个文件下写一个获取wsdl的函数并让它返回函数成功与否的结果,吧这个文件获取到服务端,例如:

//能够远程读取wsdl文件
int http_get(struct soap * soap)

    if (0 != strcmp(soap->path, "/ns.wsdl"))     //判断path路径是否是/ns.wsdl路径
    {
         return SOAP_GET_METHOD;
    }

    //读取硬盘wsdl文件
    CString cstrWsdlName = CPublicFunction::GetWsdlName();  //CPublicFunction这个类是一个公共函数类
    CString cstrWsdlPath = CPublicFunction::GetWsdlPath();

    CString cstrWsdl = cstrWsdlPath + cstrWsdlName;
    CMarkup xmlWsdl;   //这个类的是用来操作xml的类
    string strWsdl;
    if(xmlWsdl.Load(cstrWsdl))
    {
         strWsdl = xmlWsdl.GetDoc();
         cout << strWsdl.c_str() <<endl;
     }

    soap->http_content = "xml";

    soap_response(soap, SOAP_FILE);
    soap_send_raw(soap, strWsdl.c_str(), strWsdl.length());  
    soap_end_send(soap);

    return SOAP_OK;
}

 并在主函数中写下如:

    

int _tmain(int argc, _TCHAR* argv[])
{

     CDataBase db;
     if (!db.OpenDatabase())//登陆数据库
     {
          return -1;
     }
     cout<<endl;


     CString cstrSQL("select 姓名 from Student id='18'");//删除数据库
      _RecordsetPtr  dbtest;
     dbtest = db.OpenReocrdset(cstrSQL);
 
     db.CloseRecordset(dbtest);
     string result = cstrSQL;
     cout << result <<endl;

     calc.imode |= SOAP_C_UTFSTRING;
     calc.omode |= SOAP_C_MBSTRING;
     calc.fget = http_get;
 
     atexit(doDestory);

     if (!(argc < 2))
     {
         // serve as CGI application
         calc.serve();
         calc.destroy();
     }
     if (calc.run(9999))
     {
          calc.soap_stream_fault(std::cerr);
     }
     calc.destroy();

     return 0;
}
并把要包含的文件包含进来!

     5)现在就是要写自己要操作数据库的函数了,一登陆Login()函数我里,其他的方法类似,这里就不在叙述了。

/*****************************************************************************
函数名   : Login
功能描述 : 根据用户输入的用户ID和用户密码登录会议室系统
输入参数 : strUserID  strPwd
输出参数 : iLoginInfo
返回值   : 非0:参数不对或者密码不正确,0:查询成功
日 期    : 2011年2月21日
作 者    : xgc803
*****************************************************************************/
int Service::Login(char *strUserID, char *strPwd,wchar_t*& StrLoginInfo)
{
    wchar_t WcharBuffer[WCHAR_MAX];
 memset(WcharBuffer,0,WCHAR_MAX);
 wchar_t* wchar_tArray = (wchar_t*)WcharBuffer;
 
 //StrLoginInfo = "OK";
    string username = strUserID;
 string userPwd = strPwd;

    if (username == "sa" && userPwd == "12345")
    {
  MBToWCHAR(wchar_tArray, "登陆成功", strlen("登陆成功"));
  CDataBase db;
  if (!db.OpenDatabase())
  {
   return -1;
  }
    }
 else
 {
  MBToWCHAR(wchar_tArray,"登陆失败",strlen("登陆失败"));
 }
 
 
 StrLoginInfo = (wchar_t*)wchar_tArray;

 return SOAP_OK;
}

为了让客服端能成功访问服务端,并通过服务端访问到数据库,还需要做如下几件事:

       (1)修改配置文件,以.ini" 结尾的文件如

           

[ConfigInfo]

WSDL_NAME=ns.wsdl

WSDL_PATH=E:\study file\newweb\Debug\

注:结尾一定要以“\”结尾。

       (2) 修改wsdl文件中的iP地址为正确的服务端的ip地址,并关闭防火墙,如图:

                
      至此服务端告一段落。
 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用gSOAP生成Onvif服务端,你需要按照以下步骤操作: 1. 下载和安装gSOAP:首先,你需要从gSOAP官方网站(https://www.genivia.com/downloads.html)下载并安装gSOAP工具包。根据你的操作系统选择合适的版本,并按照官方文档进行安装步骤。 2. 定义服务接口:使用gSOAP的接口定义语言(IDL)来定义你的Onvif服务接口。在IDL文件中,你可以定义服务的方法、参数和返回类型等。确保按照Onvif规范来定义你的服务接口。 3. 生成代码:使用gSOAP提供的工具来生成C/C++代码。你需要使用命令行工具 `soapcpp2` 并提供IDL文件作为输入。执行命令后,gSOAP将生成相应的服务端和客户端代码文件。 4. 实现服务逻辑:根据生成的代码,你需要实现Onvif服务的具体逻辑。这包括处理接收到的请求、执行相应的操作并构建响应。 5. 编译和构建:编译你的服务端代码,并链接所需的库文件。确保按照gSOAP文档提供的指导进行编译和构建步骤。 6. 运行服务端:运行生成的服务端程序,并确保它能够监听和处理来自客户端的请求。 请注意,这只是一个概述性的步骤,具体的实施可能因个人需求和环境而异。在实际开发中,你还需要了解Onvif协议规范和gSOAP工具的详细用法,并根据实际情况进行适当的配置和定制。 希望这些信息对你有所帮助!如果你有进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值