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; }
static int tcp_open(struct protocol_ctx *sc, const char *url) { struct tcp_ctx *c = sc->priv; struct skt_addr addr; skt_addr_list_t *tmp; char str[MAX_ADDR_STRING]; int len; char *p; char *tag = ":"; p = strstr(url, tag); if (!p) { printf("tcp url is invalid\n"); return -1; } len = p - url;//"127.0.0.1:2333" printf("url = %s, len = %d\n", url, len); strncpy(c->dst_ip, url, len); p += strlen(tag); c->dst_port = atoi(p); if (0 == skt_get_local_list(&tmp, 0)) { for (; tmp; tmp = tmp->next) { skt_addr_ntop(str, tmp->addr.ip); printf("ip = %s port = %d\n", str, tmp->addr.port); } } strcpy(c->src_ip, str); struct skt_connection *conn = skt_tcp_connect(str, c->dst_port); if (!conn) { printf("connect %s:%d failed\n", str, c->dst_port); return -1; } c->fd = conn->fd; sc->fd = c->fd; skt_get_addr_by_fd(&addr, c->fd); c->src_port = addr.port; // skt_set_noblk(c->fd, 1); // skt_set_reuse(c->fd, 1); return 0; }