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_create(const char *host, uint16_t port) { int ret; char str_ip[INET_ADDRSTRLEN]; struct skt_connection *sc; struct rpc *r = CALLOC(1, struct rpc); if (!r) { loge("malloc failed!\n"); return NULL; } sc = skt_tcp_connect(host, port); if (sc == NULL) { loge("connect failed!\n"); return NULL; } r->fd = sc->fd; if (-1 == skt_set_noblk(sc->fd, 0)) { loge("block skt_recv failed!\n"); } ret = rpc_recv(r, r->packet.header.uuid_src, MAX_UUID_LEN); if (ret != MAX_UUID_LEN) { loge("rpc_recv failed: ret = %d\n", ret); } // if (-1 == skt_set_noblk(sc->fd, 1)) { // loge("no-block skt_recv failed!\n"); // } skt_addr_ntop(str_ip, sc->local.ip); logi("local addr = %s:%d, uuid_src = %s\n", str_ip, sc->local.port, r->packet.header.uuid_src); skt_addr_ntop(str_ip, sc->remote.ip); //logd("remote ip = %s, port = %d\n", str_ip, sc->remote.port); r->evbase = gevent_base_create(); return r; }
struct rpc *rpc_create(const char *host, uint16_t port) { char local_ip[INET_ADDRSTRLEN]; char remote_ip[INET_ADDRSTRLEN]; struct rpc *r = CALLOC(1, struct rpc); if (!r) { loge("malloc failed!\n"); return NULL; } memset(&r->recv_pkt, 0, sizeof(struct rpc_packet)); struct skt_connection *connect; connect = skt_tcp_connect(host, port); if (!connect) { loge("connect failed!\n"); return NULL; } r->fd = connect->fd; if (-1 == skt_set_block(r->fd)) { loge("skt_set_block failed!\n"); } r->evbase = gevent_base_create(); if (!r->evbase) { loge("gevent_base_create failed!\n"); return NULL; } rpc_set_cb(r, on_read, on_write, on_error, r); r->dispatch_thread = thread_create("rpc_dispatch", rpc_dispatch_thread, r); r->state = rpc_inited; if (thread_sem_wait(r->dispatch_thread, 2000) == -1) { loge("wait response failed %d:%s\n", errno, strerror(errno)); return NULL; } skt_addr_ntop(local_ip, connect->local.ip); skt_addr_ntop(remote_ip, connect->remote.ip); logi("rpc[%08x] connect information:\n", r->send_pkt.header.uuid_src); logi("local addr = %s:%d\n", local_ip, connect->local.port); logi("remote addr = %s:%d\n", remote_ip, connect->remote.port); return r; }