""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
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 |