C++写的服务端要跟WEB界面通讯,这样就可以通过web界面去获取在线用户,系统性能之类的东西,或者去修改服务端的一样配置,上头说不用socket通讯,要用WebService,但本人对什么是WebService都不清楚,所以想请教高手们,如果有源码的话更好。

解决方案 »

  1.   

    #include <stdio.h>#import "msxml3.dll"
    using namespace MSXML2;#import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP1.dll" \
    exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", \
    "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
    using namespace MSSOAPLib;void main()
    {
       CoInitialize(NULL);   ISoapSerializerPtr Serializer;
       ISoapReaderPtr Reader;
       ISoapConnectorPtr Connector;   // 连接服务器
       Connector.CreateInstance(__uuidof(HttpConnector));
       Connector->Property["EndPointURL"] = "http://www.allesta.net:51110/webservices/soapx4/isuseronline.php";
       Connector->Connect();   // 启动消息机制
       Connector->Property["SoapAction"] = "uri:allesta-YahooUserPing";
       Connector->BeginMessage();   // 创建SoapSerializer对象
       Serializer.CreateInstance(__uuidof(SoapSerializer));   // 与输入流连接
       Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));   // 制作SOAP信息
       Serializer->startEnvelope("","","");
       Serializer->startBody("");
       Serializer->startElement("isuseronline","uri:allesta-YahooUserPing","","m");
       Serializer->startElement("username","","","");
       Serializer->writeString("laghari78");
       Serializer->endElement();
       Serializer->endElement();
       Serializer->endBody();
       Serializer->endEnvelope();   // 向服务器发送信息
       Connector->EndMessage();   // 读取回应
       Reader.CreateInstance(__uuidof(SoapReader));   // 连接输出流
       Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");   // 显示结果
       printf("Answer: %s\n", (const char *)Reader->RPCResult->text);
         CoUninitialize();
    }
      

  2.   

    为什么不先到MSDN上去了解一下WebService的概念和原理呢,原理都很简单的
      

  3.   

    Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。例如,你想创建一个Web service ,它的作用是返回当前的天气情况。那么你可已建立一个ASP页面,它接受邮政编码作为查询字符串,然后返回一个由逗号隔开的字符串,包含了当前的气温和天气。要调用这个ASP页面,客户端需要发送下面的这个HTTP GET请求: http://host.company.com/weather.asp?zipcode=20171 返回的数据就应该是这样: 21,晴 这个ASP页面就应该可以算作是Web service 了。因为它基于HTTP GET请求,暴露出了一个可以通过Web调用的API。当然,Web service 还有更多的东西。 
      

  4.   


    一 服务器端
    1.首先编写 add.h文件:
    1//gsoap ns service name: add
    2//gsoap ns service namespace: http://localhost/add.wsdl
    3//gsoap ns service location: http://localhost
    4//gsoap ns service executable: add.cgi
    5//gsoap ns service encoding: encoded
    6//gsoap ns schema namespace: urn:add
    7
    8int ns__add( int num1, int num2, int* sum );
    9
    2.用gsoap/bin目录下的soapcpp2.exe程序,生成一些文件。可以把soapcpp2.exe拷贝到一add.h目录下,用cmd执行soapcpp2.exe add.h就可以,在这个目录下会自动生成许多将来有用的文件,如add.namap,soapH.h,soapC.cpp,soapClient.cpp,soapServer.cpp等文件。soapcpp2.exe可以带参数执行,具体执行soapcpp2.exe -h查看。3.新建一个win32控制台工程,加入wsock32.lib库,将刚才生成的那些文件添加到工程中。然后编写webserver.cpp主程序:
    #include "add.h"
    #include "add.nsmap"int main(int argc, char* argv[])
    {
        
        int m, s; /**//* master and slave sockets */
        struct soap add_soap;
        soap_init(&add_soap);
        //soap_set_namespaces(&add_soap, add_namespaces);
        
        if (argc < 2)
        {
            printf("usage: %s <server_port> \n", argv[0]);
            exit(1);
        }
        else
        { 
            m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);
            if (m < 0)
            {
                soap_print_fault(&add_soap, stderr);
                exit(-1);
            }
            
            fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
            for ( ; ; )
            { 
                s = soap_accept(&add_soap); 
                if (s < 0)
                { 
                    soap_print_fault(&add_soap, stderr);
                    exit(-1);
                }
                fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
                
                soap_serve(&add_soap);//该句说明该server的服务
                soap_end(&add_soap);
            }
        }
        return 0;
    }
    //server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数
    int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
    {
        *sum = num1 + num2;
        return 0;
    }4. 编译这个程序,会提示错误,将gsoap_win32目录下stdsoap2.cpp,stdsoap2.h文件加入工程,重新编译如果还有错误,可能是你将add.h生成的文件添加入工程出错的原因。实际上在编写server程序时,无须带Client的那些文件,还有带Lib的文件也无须添加到工程中。再重新编译应该就没有问题了,启动4567端口,在ie中输入localhost:4567,如果显示xml页面,说明程序已经启动。二 对应的客户端
    1。客户端程序代码如下:
    #include <stdio.h>
    #include <stdlib.h>
    #include "soapH.h"
    #include "add.nsmap"
    int add(const char* server, int num1, int num2, int *sum);int main(int argc, char **argv) 
    {
        int result = -1;
        char* server="http://localhost:4567";
        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;
    }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;
    }
    2.客户端程序既可以新建一个新的win32控制台程序,将刚才生成的nsmap,soapH.h,soapClient.h等文件加入工程,编译既可。我是直接在原先工程中加入一客户端代码,将webserver.cpp文件移除,并且将soapServer.cpp等server端需要的文件移除,将soapClient.cpp等client端需要的cpp添加到工程,编译既可。
    3.启动server程序,F5客户端程序,经测试正常。
      

  5.   

    但gSoap的官方网站上生成的的文件中,有soapH.h,soapC.cpp,soapClient.cpp,soapServer.cpp,但没有add.namap文件呀?
      

  6.   

    To   lvshaoqing://该函数是客户端调用的主要函数,后面几个参数和add.h中声明的一样,前面多了3个参数,函数名是接口函数名ns__add前面加上soap_call_
        soap_call_ns__add( &add_soap, server, "", num1, num2, sum );编译的时候说 soap_call_ns__add未定义呀,把产生的oapH.h,soapC.cpp,soapClient.cpp,soapServer.cpp
    都找遍了也找不到这个函数呀
      

  7.   

    了解下isapi extension
    HttpExtensionProc
      

  8.   

    个人感觉WEB SERVICE就是个遵守HTTP协议的服务端程序,使用HTTP协议来传输交互的内容
      

  9.   

    webservice其实就是利用标准的XML协议(SOAP)在客户端和服务端之间传输数据. 推荐楼主使用ATLServer,http://www.codeplex.com/AtlServerVS2005包含了这个库, 新的VS2008已不再支持.
      

  10.   

    最近项目中涉及到VC客户端调用ASP.NET Webservice,也是初学,发现关于VC+SOAP+WebService的资料太少了。
    SOAP=HTTP+XML,WebService提供WebMethod。
    客户端通过SOAP远程调用RPC(Remote Procedure Call)存放在服务器端的WebService(WebMethod),
    这是一种基于互联网的分布式计算模型。
    这个是《VC6.0调用ASP.NET WebService实例》:http://blog.pfan.cn/xman/42117.html
    你的这个是C++写的服务端要跟WEB界面通讯,不明白你到底要干啥?
    WebService应该是Web(ASP.NET)写的吧?
      

  11.   

    Web service其实就是一种远程调用方法,其本质和DCOM、RPC等是一样的。只是大家采用的技术不同。就像你们头不让你用的Socket,你也可以用它来实现远程调用,只要规定好调用数据格式就可以了。
    Web service不一定要用C++实现,如果上头这么规定,就太死了。因为对于Web service的用户,只要接口一样,用什么语言实现都是一样的。
    怎么实现不是一两句话能够讲清楚的,你不要期望在这里得到答案,你应该去看一本书,比如.net编程的书,那里面有你想要的答案。欢迎到我的博客:http://hi.baidu.com/chendeping/
      

  12.   

    额地个天哪,“急”了一年了?还没结贴?
    在 VS2008 下使用 WebService
    http://blog.csdn.net/DavidHsing/archive/2009/06/17/4276366.aspx
      

  13.   

    这帖子,确实比较牛,还有网上那个过时的gsoap帖的主人都出现了,呵呵。
      

  14.   

    呵呵。。我以前做过几个类似的项目,跟电信调试接口的。可以用VS.NET里面的VC.也可以用gsoap,两个方法我都实现过。可以在我的blog里面看一下,里面应该有记录,http://xjchilli.blog.163.com/。
    也可以站内联系我,我可以回家后找相关资料给你。
      

  15.   

    顺便问个下,soapclient调用的时候如果参数返回的是XML文件的话,怎么办啊,好像函数返回的是个VT_DISPATCH,有啥方法能取出xml文件的内容吗
      

  16.   

    http://soft.zdnet.com.cn/software_zone/2009/0731/1423612.shtml
      

  17.   

    Boa 构建了基于Arm-Linux 操作系统的嵌入式Web 服务器