EBCguide
Clunix Wiki
목차 |
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