// // main.cpp // zk-client // // Created by Michael Han on 5/21/16. // Copyright © 2016 Michael Han. All rights reserved. // #include #include using namespace std; #define STDLOG(log) cout << log << endl; static const char *host = "127.0.0.1:2181"; static zhandle_t *zh; static clientid_t myid; static int connected = 0; static int expired = 0; void watcher (zhandle_t *zkh, int type, int state, const char *path, void* context) { if (type == ZOO_SESSION_EVENT) { if (state == ZOO_CONNECTED_STATE) { connected = 1; STDLOG("connected."); } else if (state == ZOO_NOTCONNECTED_STATE ) { connected = 0; STDLOG("not connected."); } else if (state == ZOO_CONNECTING_STATE) { connected = 0; STDLOG("connecting..."); } else if (state == ZOO_EXPIRED_SESSION_STATE) { expired = 1; connected = 0; zookeeper_close(zkh); STDLOG("session expired."); } else if (state == ZOO_AUTH_FAILED_STATE) { STDLOG("auth error."); } else { STDLOG("unknown state."); } } } int main(int argc, const char * argv[]) { int rc, fd, interest, events; struct timeval tv; fd_set rfds, wfds, efds; FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); zoo_set_debug_level(ZOO_LOG_LEVEL_INFO); zoo_deterministic_conn_order(1); zh = zookeeper_init(host, watcher, 30000, &myid, 0, 0); if (!zh) { return errno; } while (!expired) { int fd; int interest; int events; struct timeval tv; int rc; int zirc = zookeeper_interest(zh, &fd, &interest, &tv); if (fd != -1) { if (interest & ZOOKEEPER_READ) { FD_SET(fd, &rfds); } else { FD_CLR(fd, &rfds); } if (interest & ZOOKEEPER_WRITE) { FD_SET(fd, &wfds); } else { FD_CLR(fd, &wfds); } } else { fd = 0; } switch (zirc) { case ZOK: STDLOG("ZOK"); break; case ZBADARGUMENTS: STDLOG("ZBADARGUMENTS"); break; case ZMARSHALLINGERROR: STDLOG("ZMARSHALLINGERROR"); break; case ZOPERATIONTIMEOUT: STDLOG("ZOPERATIONTIMEOUT"); break; case ZCONNECTIONLOSS: STDLOG("ZCONNECTIONLOSS"); break; case ZSYSTEMERROR: STDLOG("ZSYSTEMERROR"); break; default: STDLOG("unknown zookeeper_interest return code."); } rc = select(fd+1, &rfds, &wfds, &efds, &tv); events = 0; if (rc > 0) { if (FD_ISSET(fd, &rfds)) { events |= ZOOKEEPER_READ; } if (FD_ISSET(fd, &wfds)) { events |= ZOOKEEPER_WRITE; } } zookeeper_process(zh, events); } return 0; }