Exemple #1
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}