본문 바로가기

Programming

gsoap (2)


참고로 제가 여기 적는 gsoap의 글들은 대부분 

http://www.cs.fsu.edu/~engelen/soap.html 의 Document의 User Guide를 참고하고 있습니다.

어떻게 보면 간단히 예제들을 한번 돌려보고 이해한 만큼 적는 것입니다.


오늘은 간단히 gsoap를 이용하여 웹서버의 CGI 를 구현해 보고자 합니다. 물론 gsoap의 기본 예제 그대로... ^^


1. 먼저 다음과 같은 헤더 파일을 만듭니다.

// 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);


==> 이걸 currentTime.h로 저장한 soapcpp2 -S currentTime.h

       그럼 다음과 같은 파일들이 생성됩니다.

test$ ls

currentTime.currentTime.req.xml  currentTime.h      currentTime.wsdl  soapC.cpp  soapServer.cpp     soapStub.h

currentTime.currentTime.res.xml  currentTime.nsmap  ns.xsd            soapH.h    soapServerLib.cpp  soapcurrentTimeObject.h


아시다시피  soapcpp2 -S  <== '-S' 의 옵션은 Server-Side Code를 생성해 줍니다. 일단은 대충 그정도만 이해하고... 넘어가죠... 

여기서 잠깐 soapcpp2의 
=============================================================================
test$ soapcpp2 -h
Usage: soapcpp2 [-1|-2] [-C|-S] [-T] [-L] [-a] [-b] [-c] [-d path] [-e] [-f N] [-h] [-i] [-I path:path:...] [-k] [-l] [-m] [-n] [-p name] [-s] [-t] [-u] [-v] [-w] [-x] [-y] [infile]

-1      generate SOAP 1.1 bindings
-2      generate SOAP 1.2 bindings
-C generate client-side code only
-S generate server-side code only
-T generate server auto-test code
-L don't generate soapClientLib/soapServerLib
-a use SOAPAction HTTP/WSA header to invoke server-side operations
-b serialize byte arrays char[N] as string
-c      generate C source code
-dpath  use path to save files
-e generate SOAP RPC encoding style bindings
-fN file split of N XML serializer implementations per file (N>=10)
-h display help info
-Ipath  use path(s) for #import
-i      generate C++ service proxies and objects inherited from soap struct
-j      generate C++ service proxies and objects that share a soap struct
-k      generate data structure walkers (experimental)
-l      generate linkable modules (experimental)
-m      generate Matlab(tm) code for MEX compiler
-n      use service name to rename service functions and namespace table
-pname  save files with new prefix name instead of 'soap'
-qname  use name as the C++ namespace of all declarations
-s      generate deserialization code with strict XML validation checks
-t      generate code for fully xsi:type typed SOAP/XML messaging
-u uncomment comments in WSDL/schema output by suppressing XML comments
-v display version info
-w don't generate WSDL and schema files
-x don't generate sample XML message files
-y include C/C++ type access information in sample XML messages
infile header file to parse (or stdin)
=============================================================================

2. 그 다음 실제 cgi를 위한 구현부를 만듭니다.

// 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; 
}

==> 이걸 currentTime.cpp 로 저장한 다음, 아래와 같이 컴파일 합니다.

       g++ -o currentTime.cgi currentTime.cpp soapC.cpp soapServer.cpp -lgsoap++ 


3. 생성된 currentTime.cgi를 테스트 해봅니다.

currentTime$ ./currentTime.cgi < currentTime.currentTime.req.xml 

Status: 200 OK

Server: gSOAP/2.8

Content-Type: text/xml; charset=utf-8

Content-Length: 445

Connection: close


<?xml version="1.0" encoding="UTF-8"?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:currentTime"><SOAP-ENV:Body><ns:currentTimeResponse><response>2014-03-10T13:12:18Z</response></ns:currentTimeResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>


4. currentTime.cgi를 웹서버의 /cgi-bin/ 에 copy 후 실행 권한을 줍니다.
==> /usr/lib/cgi-bin


5. 웹브라우저에서 실행해 보기

==> 대충 아래와 같은 형태로 나타나는데, 왠지 에러 같네요.. 아마도 XML 형태의 Request가 없어서 그런거지.. 계속 하다보면 답이 나오겠죠... ㅎㅎ 


'Programming' 카테고리의 다른 글

DHCP Probe 소스 코드  (0) 2014.11.29
현재 네트워크에서 DHCP 서버가 동작되고 있는지 확인?  (0) 2014.08.18
gsoap (1)  (0) 2014.03.11
stub & skeleton 이해하기  (0) 2013.10.28
[C Programming] Struct Hack  (0) 2013.08.15