EBCguide

Clunix Wiki
Yhkim (토론 | 기여) 사용자의 2014년 3월 18일 (화) 17:08 버전
(비교) ← 이전 판 | 현재 판 (비교) | 다음 판 → (비교)

목차

EBC Guide

이 문서는 EBC를 예제와 함께 설명한다.

General

기본적으로 ebc daemon(ebcd)을 이용하여 ebc간 통신이 이루어진다. ebc 서버와 클라이언트로 나누어진다. 보통 사용되는 함수는 아래와 같다.

ebc_err_t
ebc_connect(const char *serverip, ecm_uint16 port, const char *mdname, ecm_uint32 timeout, ecm_ebc_t *pecm_ebc)
  • ebc 연결 (서버 주소, 포트, 모듈 이름, 타임아웃, ebc 타입)
void
ebc_close(ecm_ebc_t ecm_ebc)
{
        do_ebc_close(ecm_ebc, ECM_TRUE);

}
  • ebc 연결종료 함수
void
ebc_close(ecm_ebc_t ecm_ebc)
  • ebc 연결종료
ebc_err_t
ebc_app_loop(ecm_ebc_t ecm_ebc, ecm_uint32 timeout)
  • ebc 프로그램 루프 (ebc 타입, 타임아웃)
ebc_err_t
ebc_ecb_add(ecm_ebc_t ecm_ebc, const char *pattern, ebc_mcbfunc_t mcb_func, ecm_ptr_t ctx)
  • ebc 콜백함수 등록 (ebc 타입, 패턴[콜백함수를 나타내는 문자열], 콜백함수명, 포인터)
ebc_err_t
ebc_call(ecm_ebc_t ecm_ebc, const char *dest, sr_t **psr)
{
        return do_call(ecm_ebc, dest, psr, ECM_FALSE, 0, ECM_FALSE);
}
  • ebc Call 함수


Server

다음 예제는 ebc 서버 예제이다.

static void
run_scenario_6(void)
{
	ecm_ebc_t	ec;
	ebc_err_t	err;

	if ((err = ebc_connect("127.0.0.1", 908, "mytest", 5000, &ec)) != EBC_OK)
		ecm_test_failed("cannot connect: err: %d\n", err);

	if ((err = ebc_ecb_add(ec, "test", cb_test, NULL)) != EBC_OK) {
		ecm_test_failed("ecb_ecb_add failed(): err: %d\n", err);
	}
	if ((err = ebc_app_loop(ec, 30000)) < 0) {
		if (err != -ERR_EBC_INTERRUPTED)
			ecm_test_failed("ebc_app_loop() failed: %d", err);
	}

	ebc_close(ec);
}
  • ebc_connect 함수를 통해 ebc에 접속한다.
  • ebc_ecb_add 함수를 통해 ebc에 콜백함수를 등록시킨다.
  • ebc_app_loop 함수를 통해 서버 프로그램을 타임아웃만큼 동작시킨다.

다음 예제는 콜백함수 예제이다.

static sr_t *
cb_test(ecm_ebc_t ec_peer, ebc_addr_t *saddr, ebc_addr_t *daddr, sr_t *sr, ecm_ptr_t ctx)
{
	sr_t * sr_res, *sr_services, *sr_ebcd;

	sr_res = sr_create_dir();
	sr_createc_int(sr_res, "ebc_port", ST_INT, 10010);
	sr_services = sr_createc_dir(sr_res, "services");
	sr_ebcd = sr_createc_dir(sr_services, "ebcd");

	sr_createc_bool(sr_ebcd, "enabled", ST_BOOL, 1);
	sr_createc_str(sr_ebcd, "clname", ST_STR, "ECMCluster");
	sr_createc_str(sr_ebcd, "ndname", ST_STR, "node");
	sr_createc_int(sr_ebcd, "detection_interval", ST_INT, 0);
	sr_createc_str(sr_ebcd, "bdcast_addr", ST_STR, "255.255.255.255");
}
  • 콜백함수명은 cb_test이다. argument는 위와 같다
  • cb_test 콜백함수가 불려지면 간단한 SR값을 리턴한다.
<dir> {
        ebc_port <int>10010;
        services <dir> {
                ebcd <dir> {
                        enabled <bool>true;
                        clname <str>ECMCluster;
                        ndname <str>node;
                        detection_interval <int>0;
                        bdcast_addr <str>"255.255.255.255";
                };
         };
};

Client

다음 예제는 Client 예제이다.

typedef void    *ecm_ebc_t;
typedef int     ebc_err_t;
static ebc_t    *ec;

void
cmd_connect(const char *serverip, ecm_uint16 port, const char *mdname)
{
        ebc_t   *ec_new;

        if (port == 0)
                port = ebc_port;
        if (ebc_connect(serverip, port, mdname, timeout, (ecm_ebc_t *)&ec_new) == EBC_OK) {
                ebc_close(ec);
                ec = ec_new;
        }
        else
                fprintf(stderr, "cannot connect\n");
}


void
cmd_call(char *target, ecm_uint32 timeout, char *asr)
{
        sr_t    *sr_arg;
        ebc_err_t       err;

        sr_arg = sr_asr_scan(asr);
        if (timeout > 0)
                err = ebc_call_timeout(ec, target, &sr_arg, timeout);
        else
                err = ebc_call(ec, target, &sr_arg);
        if (err != EBC_OK) {
                fprintf(stderr, "can't EBC call to [%s]: %d\n", target, err);
                sr_fancy_print(stdout, sr_arg, SR_RECUR, NULL);
        }           
        else
                sr_fancy_print(stdout, sr_arg, SR_RECUR, NULL);
        sr_free(sr_arg);
        ecm_free(target);
        ecm_free(asr);
}
  • Client에서도 동일하게 ebc_connect 함수를 이용하여 ebc에 접속한다.
  • asr 형식과 ebc_call 함수를 이용하여 해당 서버의 콜백함수를 부른다.
  • ebc_call 함수는 다음과 같은 값을 입력받는다.
ecm_ebc_t ecm_ebc, const char *dest, sr_t **psr)
dest : PA 문자열, psr : ASR 형식

ex) pa/./ebcd/echo test <str>test
부서별 위키