如何用PHP实现通过Web执行CC++程序

如何用PHP实现通过Web执行CC++程序,第1张

 例如,我们可以写一个能够通过命令行还接收参数的C++简单程序,并命名为Sampleapp.然后我们能够按照下面的方式给他传递三个不同的参数 :

 

Sampleapp ?参数一 ?参数二 ?参数三

这个程序的功能是能输出传递给他的参数的个数和每个参数的值,然后我们可以用PHP脚本程序来执行编译好的C++程序。

 

利用你习惯的文本编辑器,新建一个名为Sampleapp.cpp的文件,再此文件中输入如下的代码:

#include <iostream.h>

int main(int argc, char* argv[])

{

cout <<endl <<"You passed "

<<argc-1 <<" arguement"

<<(argc-1 == 1 ? "" : "s")

<<"." <<endl

cout <<(argc-1 == 1 ? "This" : "These")

<<" arguement"

<<(argc-1 == 1 ? "" : "s")

<<" "

<<(argc-1 == 1 ? "is" : "are") <<": "

<<endl <<endl

for(int i = 1i <argci++)

cout <<"[" <<i <<"] "

<<argv[i] <<endl

return 0

}

这个C++程序包含的程序的入口点:main(),main()函数带了两个参数:argc(命令行传入参数的个数)和argv(一个包含了所传参数实际值的字符型指针数组)。这个两个参数能被C++编译器自动捕获。

cout <<endl <<"You passed " <<argc-1

<<" arguement"

<<(argc-1 == 1 ? "" : "s")

<<"." <<endl

这句话的意思是获得从执行命令行传入的参数的个数。Argv这个字符型指针数组是从0开始检索的,它至少包含一个实际的值(即本程序的路径和名称),这个值由C++编译器自动地附加上去。条件 *** 作符“?”是用来判断命令行传入地参数是否多于一个。例如,如果命令行过传入两个参数,我们地程序将输出如下信息:

You passed 2 arguments.

cout <<(argc-1 == 1 ?

"This" : "These")

<<" arguement"

<<(argc-1 == 1 ? "" : "s")

<<" "

<<(argc-1 == 1 ? "is" : "are")

<<": " <<endl <<endl

接下来,我们同样用条件 *** 作符来输出另一句话。不过要记住,即使我们不从程序执行命令行传入任何参数,main函数地argv[]参数也包含一个值。同样地,如果我们从命令行传入两个参数给程序,程序将输出如下地信息:

These arguments are:

for(int i = 1

i <argci++)

cout <<"[" <<i <<"] "

<<argv[i] <<endl

最后,main函数逐一的输出命令行传入的每个参数,它用到了一个简单的for(;;)循环语句,这个函数能根据参数的个数将参数值一个一个的输出。假如我们传给程序两个参数“first”和second“, for循环输出的结果如下:

[1] ?first

[2] ?second

以上是关于这个C++程序的简单说明,它的功能十分简单,就是将命令行传入的参数用cout函数显示在输出屏幕上。

接下来,我们将编译这个。cpp文件,如果你在windows平台下,需要telnet到所使用的server上。在这里,我们使用大多Unix机器上都提供的G++编译器来编译这个源文件。不过为了确信你的机器安装了G++,你可以输入如下命令:which g++.如果G++已经安装了,Unix shell将显示出G++所在的全路径。如果没有安装,它将提示你说“command couldn‘t be found”。 你可以在这里下载到G++.在源文件所在的目录输入如下G++命令:

g++ -c sampleapp.cpp.

通过这个命令,我们就将。cpp文件编译成了包含机器代码的目标文件。通过 ls ?a命令,你可以发现在本目录下出现了一个新文件sampleapp.o,这就是。cpp源文件被编译成机器码的结果。不过我们最终想要的是一个可执行文件,因为我们还要输入如下的G++命令:

g++ sampleapp.cpp ?o sampleapp

这样我们就获得了一个名为sampleapp的可执行文件。不过注意的是,Unix下的可执行文件跟Windows不一样,它没有任何后缀。下面我们可以来检验一下程序执行的结果,如果如下命令:

sampleapp one -two /three

我们可以看到如下的执行结果:

You passed 3 arguments.

These arguments are:

[1] one

[2] ?two

[3] /three

现在,可执行的C++程序成生完毕,下面我们将生成一个能够通过web浏览器来访问这个程序的PHP教本程序。

c+=中使用Axis实现webservice的基本过程:

使用Axis C++开发Web服务的基本过程可以简单描述如下:

1、使用Java语言描述WEB服务

2、使用Java2WSDL工具生成WSDL文件

3、使用WSDL2Ws工具生成服务端代码框架

4、编码实现service,并部署服务

5、使用WSDL2Ws工具生成客户端代码框架

6、编码实现客户端

三、实例演示

这里以一个简单的加法Add服务来说明用Axis C++构建webService的过程。

1、使用Java语言描述WEB服务

Axis C++中我们必须先定义好WSDL后方可生成用来实现该服务的代码框架,这一点与Axis Java不同。生成WSDL方法很多,可以使用Java2WSDL工具,当然也可以手工编写,这里使用Java2WSDL工具生成。下面我们对Add服务用Java语言描述:

public interface Add{

public int add(int x, int y)

}

只要方法的声明即可,不需要实现方法,因此我们使用接口来定义。将上面的代码保存为Add.java。

2、使用Java2WSDL工具生成WSDL文件

javac Add.java (生成.class文件)

java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava org.apache.axis.wsdl.Java2WSDL -o Add.wsdl -l"http://localhost/axis/Add" -n"http://localhost/axis/Add" Add

经过上面两步,我们就可以得到Add.wsdl文件。需要说明的是,生成的WSDL文件有时会有错(intf都成了impl),这可能是Java2WSDL工具的Bug。如果出现这种情况,可以和Axis C++自带的例子WSDL文件对比。(注:我花了两天时间才找出这个问题)

3、使用WSDL2Ws工具生成服务端代码框架

有上面的WSDL文件,我们可以用WSDL2Ws工具生成服务端构架。

java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sserver

-s server 表示生成server代码框架

-l c++表示生成C++代码

4、编码实现service,并部署服务

上面生成的文件中,我们只需要实现Add.cpp中的add方法即可。

... ...

xsd__int Add::add(xsd__int Value0, xsd__int Value1)

{

return Value0+Value1

}

... ...

对代码编译并链接生成.so动态库:

g++ -shared -I$AXISCPP_HOME/include -o libadd.so *.cpp

对服务进行部署,步骤如下:

(1).将生成的libadd.so文件复制至$AXISCPP_DEPLOY/lib目录

(2).复制Add.wsdl文件至$AXISCPP_DEPLOY/wsdls目录

(3).编辑AXISCPP_DEPLOY/etc/server.wsdd文件并在相应位置添加如下内容:

<service name="Add" provider="CPP:RPC" description="Add Service ">

<parameter name="className" value="/apache/axiscpp/lib/libadd.so"/>

<parameter name="allowedMethods" value="add "/>

</service>

(4).重新启动HTTP服务

(5).检查http://localhost/axis是不否有新增的Add服务

为了测试我们发布的Web服务是否工作正常,我们下面利用Axis C++来生成调用该服务的客户端代码并进行测试。

5、使用WSDL2Ws工具生成客户端代码框架

java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sclient

-s client 表示生成client代码框架

-l c++表示生成C++代码

6、编码实现客户端

上述命令生成了Add.hpp, Add.cpp,我们再编写客户端入口程序 AddClient.cpp:

#include "Add.hpp"

#include <stdio.h>

int main(int argc, char** argv)

{

Add ws("http://localhost/axis/Add")

int sum

if(argc<2)

{

printf("Usage:%s num1 num2\n", argv[0])

return -1

}

sum = ws.add(atoi(argv[1]),atoi(argv[2]))

printf("%d\n",sum)

return 0

}

编译客户端,生成可执行文件:

g++ -I$AXISCPP_HOME/include -L$AXISCPP_DEPLOY/lib -laxis_client -ldl -o Add *.cpp

之后,可以用Add命令测试服务工作是否正常。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11997800.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存