8월 212011
 

Ubuntu에서 apache2만 설치되어 있다고 가정.

1. cgi-bin 폴더를 cgi사용 가능하게 만들기
> sudo vi /etc/apache2/mods-enabled/userdir.conf

– <IfModule mod_userdir.c> 안에 아래 내용 추가

<Directory /home/*/public_html/cgi-bin> 

Options ExecCGI
AddHandler cgi-script .cgi
</Directory>
 – Options ExecCGI와 AddHandler를 Root에다가 적으면 모든 곳에서 cgi 사용 가능! 

2. 서버 재시작 한다.
> sudo /etc/init.d/apache2 restart

3. ~/public_html/cgi-bin 밑에 서비스 복사
currentTime.cgi 와 currentTime.wsdl을 복사한다.
currentTime.cgi에는 755의 권한을 준다.

4. 웹 브라우져에서 잘 작동되는지 확인한다.

주석 :
mime에서 cgi를 연결
> sudo vi /etc/apache2/mods-enabled/mime.conf

– #AddHandler cgi-script .cgi 의 주석 해제

8월 112011
 

본 문서는 gSOAP User Guide[1]를 기반으로 해서 작성하였음.

– gSOAP으로 구현된 WS Provider는 CGI 기반으로 만들어 짐

* 현재 시각을 돌려주는 간단한 Web Service Provider 작성

1. currentTime.h   (헤더파일 생성)

// File: currentTime.h

//gsoap ns service name: currentTime

//gsoap ns service namespace: urn:currentTime

//gsoap ns service location: http://www.yourdomain.com/currentTime.cgi

int ns__currentTime(time_t& response);

 

–  주석에 사용되는 내용은 의미가 있음
– ns뒤에 ‘__’ 두번 한 후 함수 작성

2. currentTime.cpp (실행 코드 작성)
1) object를 사용하지 않을 경우

// File: currentTime.cpp

#include “soapH.h” // include the generated declarations

#include “currentTime.nsmap” // include the XML namespace mappings

int main()

{

 

// create soap context and serve one CGI-based request:

return soap_serve(soap_new());

 

}

int ns__currentTime(struct soap *soap, time_t& response)

{

response = time(0);

 

return SOAP_OK;

 

}

 

2) object를 사용하는 경우

// File: currentTime.cpp

#include “soapcurrentTimeService.h” // include the proxy declarations

#include “currentTime.nsmap” // include the XML namespace mappings

int main()

{

 

// create server and serve one CGI-based request:

 

currentTimeService server;

 

return server.serve();

 

}

int currentTimeService::currentTime(time_t& response)
{

 

response = time(0);

return SOAP_OK;

 

}

 

* stand-alone(non-multithreaded)서버를 돌리고 싶은 경우 main함수에서 return currentTimeService.run(8080);으로 변경

3. 서버용 SOAP 작동을 위한 코드 생성
1) 앞에서 object를 사용하지 않는 경우
> soapcpp2 -S currentTime.h
2) 앞에서 object를 사용하는 경우
> soapcpp2 -c -S currentTime.h

* ‘-c’ 옵션을 사용하면 c코드로 서버코드가 생성됨

4. CGI binary로 컴파일
> c++ -o currentTime.cgi currentTime.cpp soapC.cpp soapServer.cpp -lgsoap++

5. cgi 파일 테스트
./currentTime.cgi < currentTime.currentTime.req.xml

[1] Robert van Engelen, “gSOAP 2.8.3 User Guide”, GENIVIA INC, June 24, 2011, p11~14

8월 112011
 

본 문서는 gSOAP User Guide[1]를 기반으로 해서 작성하였음.

– 간단한 SOAP Client 제작

http://www.genivia.com/calc.wsdl 에 있는 SOAP Provider로 부터 Stub을 작성하여 C++ 기반으로 작성하였음.
calc 서비스는 간단히 double Type의 두개의 매개변수를 받아 덧셈, 곱셈 등 계산을 하여 double Type의 계산 결과를 리턴하는 서비스이다.

1. ‘.h 헤더 파일’ 생성
(1) C++ without STL ( -s 옵션에 의해 STL이 빠짐)
> wsdl2h -s -o calc.h http://www.genivia.com/calc.wsdl

(2) Pure C Application (-c 옵션)
> wsdl2h -c -o calc.h http://www.genivia.com/calc.wsdl

2. 헤더 파일을 통해 C/C++ API를 생성
(1) C++
> soapcpp2 -i -C -I<import> calc.h
여기서 ‘<import>’는 ~/gsoap-2.8/gsoap/import 경로를 입력
– ‘-C’옵션은 Client 코드만 생성

(2) C
> soapcpp2 -c -C -I<import> calc.h

3. 실제 서비스를 사용해보는 예제 코드
1) cpp 코드  (예를들어 main.cpp)

#include “soapcalcProxy.h”

#include “calc.nsmap”

int main()

{

calcProxy service;

double result;

if (service.add(1.0, 2.0, result) == SOAP OK)

std::cout << “The sum of 1.0 and 2.0 is ” << result << std::endl;

else

service.soap_stream_fault(std::cerr);

return 0;

}

 

2) C 코드 (예를들어 main.c)

#include “soapH.h”

#include “calc.nsmap”

int main()

{

 

struct soap *soap = soap_new();

double result;

if (soap_call_ns2__add(soap, NULL, NULL, 1.0, 2.0, &result) == SOAP_OK)

printf(“The sum of 1.0 and 2.0 is %lg\n”, result);

else

soap_print_fault(soap, stderr);

soap_end(soap);

soap_free(soap);

return 0;

 

}

 

4. 컴파일
1) c++
> g++ ~/gsoap-2.8/gsoap/stdsoap2.cpp main.cpp soapC.cpp soapcalcProxy.cpp

2) c
> gcc ~/gsoap-2.8/gsoap/stdsoap2.c main.c soapC.c soapClient.c

5. 실행해서 잘 되는지 확인하기

[1] Robert van Engelen, “gSOAP 2.8.3 User Guide”, GENIVIA INC, June 24, 2011, p8~11

8월 112011
 

* 환 경
– Ubuntu 11.04
– gcc, make, configure, perl (default)
– Bison (우분투 설치 관리자에서 설치 가능)
– Flex (우분투 설치 관리자에서 설치 가능)
– Zlib (zlib.net, http://syaku.tistory.com/69 참조)
– openssl (기본으로 설치 되나 라이브러리 추가 설치 필요 : libssl-dev)

* gsoap을 적당한 위치에 복사해서 아래 명령 실행하면 설치 완료

$ ./configure
$ ./make
$ ./make install

* 설치시 옵션을 붙일 수 있음
./configure –enable-samples (예제도 같이 설치)
./configure –enable-debug (sent.log, recv.log, test.log 파일로 로그가 남음)
./configure –enable-ipv6 (IP v6를 사용하도록 컴파일)

자세한 것은 INSTALL.TXT 파일 참조