MY IT

C++ Framework ACE

메롱씨티 배드맨 2007. 8. 24. 14:20

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

                            INSTALL

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


0. 우선 ACE를 받는 곳입니다. 

http://deuce.doc.wustl.edu/old_distribution/


1. 압축을 풉니다. 

> tar zxvf ACE-5.4.tar.gz


2. 환경 변수를 등록합니다.

> vi .bash_profile

ACE_ROOT=절대경로/ACE_wrappers

LD_LIBRARY_PATH=절대경로/ACE_wrappers/ace


3. 설치 OS에 맞춰어 config.h 파일을 만듭니다.

- 생성 위치 : ACE_ROOT/ace/config.h

> #include "config-linux.h"

> #define ACE_HAS_STANDARD_CPP_LIBRARY 1


4. 설치 OS에 맞춰어 Macro 파일을 생성합니다.

- 생성 위치 : ACE_ROOT/include/makeinclude

> ln -s platform_linux.GNU platform_macros.GNU


5. 설치 합니다.

- ACE_ROOT/ace 로 이동

> make 



""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

                            COMPILE

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


#----- ACE COMPILE CODE START ------------

if [ -z "$1" ]; then
	echo 'Object name Nothing'
	exit 1
elif [ -z "$2" ]; then
	echo 'cpp file name Nothing'
	exit 1
elif [ ! -s  "$2" ]; then
	echo "$2" 'file is nothing or 0 byte'
	exit 1
fi
g++ -W -Wall -Wpointer-arith -pipe -03 -g -D_REENTRANT -DACE_HAS_AIO_CALLS -D_GNU_SOURCE -I$ACE_ROOT
    -DACE_HAS_EXCEPTIONS -D__ACE_INLINE__ -c -o $1.o $2 
g++ -W -Wall -Wpointer-arith -pipe -03 -g -D_REENTRANT -DACE_HAS_AIO_CALLS -D_GNU_SOURCE -I$ACE_ROOT 
   -DACE_HAS_EXCEPTIONS -D__ACE_INLINE__ -Wl, -E -L$ACE_ROOT/ace -L./ -o $1 $1.o -IACE -ldl -lpthread -lrt 

#----- ACE COMPILE CODE END --------------



""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

               간단하게 짜본 Sample Source

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


역시 Wrapping & Packaging 이라고 하는 ACE답게 네트웍 소스 코드가 상당히 간단히 구현이 됩니다.
/* ----------- SOURCE CODE START ----------------- */

#include <ace/INET_Addr.h>
#include <ace/Log_Record.h>
#include <ace/Process.h>
#include <ace/Process_Manager.h>
#include <ace/SOCK_Connector.h>
#include <ace/SOCK_Stream.h>
#include <ace/Signal.h>
#include <ace/Auto_Ptr.h>

 

int http_call(char *ip, int port, char *uri, string &str)
{
    ACE_SOCK_Connector connector;
    ACE_SOCK_Stream peer;
    ACE_INET_Addr peer_addr;

    // iovec 구조체는 확인이 좀 필요함.. ㅡㅡ;;
    iovec iov[3];
    int ret_val;

    char buf[MAX_HTTP_BUF], p_uri[1024];
    int n, iLen=0;

    memset(p_uri, 0x00, sizeof(p_uri));

    if(!uri) strcpy(p_uri, "index.html");
    else    strcpy(p_uri, uri);

    (char *)iov[0].iov_base = "GET ";
     iov[0].iov_len = strlen((char *)iov[0].iov_base;


     (char *)iov[1].iov_base = p_uri;
     iov[1].iov_len = strlen(p_uri);


     (char *)iov[2].iov_base = " HTTP/1.0rnrn";
     iov[2].iov_len = strlen((char *)iov[2].iov_base);

     if (peer_addr.set (port, ip) == -1)
           return 0;

     // time out 처리
     ACE_Time_Value timeout(3);

     // blocking 모드
      if (connector.connect (peer, peer_addr, &timeout) == -1)
     {
           if(errno == ETIME)
          {
                printf("연결 시간 초과!!n");
           }
           return 0;
     }

     if(peer.sendv_n(iov, 3, &timeout) == -1)
     {
           if(errno == ETIME)
          {
                printf("Send Time out!!n");
           }
           printf("Closen");
           peer.close();
     

           return 0;
      }

      memset(buf, 0x00, MAX_HTTP_BUF);
   

      while(1)
     {
           if ((n =peer.recv(buf, sizeof(MAX_HTTP_BUF))) == -1)
          {
                printf("Rcv Errorn");
                break;
           }

           if(n == 0) break;

           str.append(buf);

           iLen =+ n;
     }
     peer.close();

     return 1;
}

/* ----------- SOURCE CODE END ------------------- */

'MY IT' 카테고리의 다른 글

pthread_join과 pthread_detach 차이  (0) 2007.11.12
Vim 6.x 설정  (0) 2007.10.31
[PHP] 단순 무식 데이터 encoding, decoding   (0) 2007.01.25
직접 DB연결 없이 Shell command로 해결하기  (0) 2006.10.14
[STL] QUEUE  (0) 2006.07.15