'gSOAP'에 해당되는 글 3건

  1. 2014.03.12 gsoap (2) (1)
  2. 2014.03.11 gsoap (1)
  3. 2013.10.28 stub & skeleton 이해하기

gsoap (2)

Programming 2014.03.12 12:00


참고로 제가 여기 적는 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 (2)  (1) 2014.03.12
gsoap (1)  (0) 2014.03.11
stub & skeleton 이해하기  (0) 2013.10.28
[C Programming] Struct Hack  (0) 2013.08.15
Posted by sound79 사운드친구

댓글을 달아 주세요

gsoap (1)

Programming 2014.03.11 12:00

gsoap 에 대해서 기본적인 것 부터 시작해보자


http://www.cs.fsu.edu/~engelen/soap.html



본 글에서부터는 오로지  C++에 대해서만 언급한다. 물론 gsoap 은 C 로도 프로그래밍이 가능하지만, C++로 하는것이 왠지..

그리고 soap에 대해서는 다루지 않는다.


gsoap을 하기위해서는 기본적으로  wsdl2h와 soapcpp2를 이용하여 wsdl, schema로부터 데이터를 바인딩하고(헤더파일 생성) soapcpp2로 stub, skeleton 코드(서버, 클라이언트 베이스) 를 생성한다는 것... ^^

  • The wsdl2h WSDL/schema importer and data binding mapper tool.
  • The soapcpp2 stub/skeleton compiler and code generator


오늘은 간단히 gsoap을 이용하여 사칙 연산을 해보도록 하겠다.


1. wsdl2h -s -o calc.h http://www.genivia.com/calc.wsdl

==> calc.wsdl 를 참고하여 calc.h 를 생성한다. 데이터 구조..


2. soapcpp2 -i -C calc.h

==>  여러 파일들이 생성될 것이다. xml, proxy 파일, soap 정의 등


3. test.c 만들기

#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); 
   service.destroy(); // delete data and release memory 
}


test.cpp로 저장하고

g++ test.cpp soapcalcProxy.cpp soapC.cpp -lgsoap++ 로 컴파일 하면 끝...

간단하다.


4. ./a.out 실행 결과

calc3$ ./a.out 

The sum of 1.0 and 2.0 is 3







저작자 표시 비영리 동일 조건 변경 허락
신고

'Programming' 카테고리의 다른 글

현재 네트워크에서 DHCP 서버가 동작되고 있는지 확인?  (0) 2014.08.18
gsoap (2)  (1) 2014.03.12
gsoap (1)  (0) 2014.03.11
stub & skeleton 이해하기  (0) 2013.10.28
[C Programming] Struct Hack  (0) 2013.08.15
Software Versioning (소프트웨어 버전규칙)  (0) 2013.08.07
Posted by sound79 사운드친구

댓글을 달아 주세요

간단히....

stub은 클라이언트에 위치

skeleton 은 서버에 위치한다고 보면 된다.


JAVA의 RMI를 기준으로 아래 원문을 참조해 보자


원문:

The rmic compiler generates two files: a stub and a skeleton. The stub resides on the client machine and the skeleton resides on the server machine. The stub and skeleton are comprised of Java code that provides the necessary link between the two objects.

When a client invokes a server method, the JVM looks at the stub to do type checking (since the class defined within the stub is an image of the server class). The request is then routed to the skeleton on the server, which in turn calls the appropriate method on the server object. In other words, the stub acts as a proxy to the skeleton and the skeleton is a proxy to the actual remote method.


참조

http://www.tns.lcs.mit.edu/manuals/java-rmi-alpha2/rmi-spec/rmi-arch.doc.html

http://theweak.tistory.com/entry/STUB%EC%8A%A4%ED%85%81-%EA%B3%BC-SKELETON%EC%8A%A4%EC%BC%88%EB%A0%88%ED%86%A4

저작자 표시 비영리 동일 조건 변경 허락
신고

'Programming' 카테고리의 다른 글

현재 네트워크에서 DHCP 서버가 동작되고 있는지 확인?  (0) 2014.08.18
gsoap (2)  (1) 2014.03.12
gsoap (1)  (0) 2014.03.11
stub & skeleton 이해하기  (0) 2013.10.28
[C Programming] Struct Hack  (0) 2013.08.15
Software Versioning (소프트웨어 버전규칙)  (0) 2013.08.07
Posted by sound79 사운드친구

댓글을 달아 주세요