int rpcd_init(uint16_t port) { int fd; fd = skt_tcp_bind_listen(NULL, port, 0); if (fd == -1) { return -1; } logi("rpcd listen port = %d\n", port); _rpcd = CALLOC(1, struct rpcd); _rpcd->listen_fd = fd; _rpcd->evbase = gevent_base_create(); if (!_rpcd->evbase) { return -1; } struct gevent *e = gevent_create(fd, on_connect, NULL, on_error, (void *)_rpcd); if (-1 == gevent_add(_rpcd->evbase, e)) { loge("event_add failed!\n"); gevent_destroy(e); } _rpcd->dict_fd2rpc = dict_new(); _rpcd->dict_uuid2fd = dict_new(); wq_pool_init(); //REGISTER_MSG_MAP(BASIC_RPC_API); rpcd_group_register(); return 0; }
struct rpc *rpc_connect_create(struct rpcd *rpcd, int fd, uint32_t ip, uint16_t port) { char str_ip[INET_ADDRSTRLEN]; char uuid[MAX_UUID_LEN]; int ret; struct rpc *r = (struct rpc *)calloc(1, sizeof(struct rpc)); if (!r) { loge("malloc failed!\n"); return NULL; } r->fd = fd; create_uuid(uuid, MAX_UUID_LEN, fd, ip, port); struct gevent *e = gevent_create(fd, on_recv, NULL, on_error, (void *)r); if (-1 == gevent_add(rpcd->evbase, e)) { loge("event_add failed!\n"); } r->ev = e; rpc_header_format(r, uuid, uuid, 0, 0); ret = rpc_send(r, uuid, MAX_UUID_LEN); if (ret != MAX_UUID_LEN) { loge("rpc_send failed!\n"); } rpcd_connect_add(rpcd, r, fd, uuid); skt_addr_ntop(str_ip, ip); logi("on_connect fd = %d, remote_addr = %s:%d, uuid=%s\n", fd, str_ip, port, uuid); return r; }
int rpc_set_cb(struct rpc *r, void (*cbr)(int fd, void *arg), void (*cbw)(int fd, void *arg), void (*cbe)(int fd, void *arg), void *arg) { if (!r) { loge("invalid parament!\n"); return -1; } struct gevent *e = gevent_create(r->fd, cbr, cbw, cbe, arg); if (!e) { loge("gevent_create failed!\n"); } if (-1 == gevent_add(r->evbase, e)) { loge("event_add failed!\n"); } return 0; }