Beispiel #1
0
int rpc_recv(struct rpc *r, void *buf, size_t len)
{
    int ret, rlen;
    struct rpc_packet *pkt = &r->recv_pkt;
    int head_size = sizeof(rpc_header_t);
    memset(pkt, 0, sizeof(rpc_packet_t));
    pkt->payload = buf;

    ret = skt_recv(r->fd, (void *)&pkt->header, head_size);
    if (ret == 0) {
        loge("peer connect closed\n");
        return -1;
    } else if (ret != head_size) {
        loge("skt_recv failed, head_size = %d, ret = %d\n", head_size, ret);
        return -1;
    }
    if (r->send_pkt.header.uuid_dst != pkt->header.uuid_dst) {
        loge("uuid_dst is diff from recved packet.header.uuid_dst!\n");
    }
    if (len < pkt->header.payload_len) {
        loge("skt_recv pkt.header.len = %d\n", pkt->header.payload_len);
    }
    rlen = min(len, pkt->header.payload_len);
    ret = skt_recv(r->fd, buf, rlen);
    if (ret == 0) {
        loge("peer connect closed\n");
        return -1;
    } else if (ret != rlen) {
        loge("skt_recv failed: rlen=%d, ret=%d\n", rlen, ret);
        return -1;
    }
    return ret;
}
Beispiel #2
0
int rpc_recv(struct rpc *r, void *buf, size_t len)
{
    struct rpc_packet pkt;
    int ret, rlen;
    int head_size = sizeof(rpc_header_t);
    memset(&pkt, 0, sizeof(rpc_packet_t));
    pkt.data = buf;

    ret = skt_recv(r->fd, (void *)&pkt.header, head_size);
    if (ret == 0) {
        loge("peer connect closed\n");
        return -1;
    } else if (ret != head_size) {
        loge("skt_recv failed, head_size = %d, ret = %d\n", head_size, ret);
        return -1;
    }
    //strncpy(r->uuid_dst, pkt.header.uuid_dst, MAX_UUID_LEN);
    if (len < pkt.header.len) {
        loge("skt_recv pkt.header.len = %d\n", pkt.header.len);
    }
    rlen = min(len, pkt.header.len);
    ret = skt_recv(r->fd, buf, rlen);
    if (ret == 0) {
        loge("peer connect closed\n");
        return -1;
    } else if (ret != rlen) {
        loge("skt_recv failed: rlen=%d, ret=%d\n", rlen, ret);
        return -1;
    }
    //dump_packet(&pkt);
    return ret;
}
Beispiel #3
0
int skt_send_sync_recv(int fd, const void *sbuf, size_t slen, void *rbuf, size_t rlen, int timeout)
{
    skt_send(fd, sbuf, slen);
    skt_set_noblk(fd, 0);
    skt_recv(fd, rbuf, rlen);

    return 0;
}
Beispiel #4
0
struct iovec *rpc_recv_buf(struct rpc *r)
{
    struct iovec *buf = CALLOC(1, struct iobuf);
    struct rpc_packet *recv_pkt = &r->recv_pkt;
    uint32_t uuid_dst;
    uint32_t uuid_src;
    int ret;
    int head_size = sizeof(rpc_header_t);

    ret = skt_recv(r->fd, (void *)&recv_pkt->header, head_size);
    if (ret == 0) {
        //loge("peer connect closed\n");
        goto err;
    } else if (ret != head_size) {
        loge("skt_recv failed, head_size = %d, ret = %d\n", head_size, ret);
        goto err;
    }
    uuid_src = r->recv_pkt.header.uuid_src;
    uuid_dst = r->send_pkt.header.uuid_src;
    if (uuid_src != 0 && uuid_dst != 0 && uuid_src != uuid_dst) {
        logw("uuid_src(0x%08x) is diff from received uuid_dst(0x%08x)\n", uuid_src, uuid_dst);
        logw("this maybe a peer call\n");
    } else {
        //loge("uuid match.\n");
    }
    buf->iov_len = recv_pkt->header.payload_len;
    buf->iov_base = calloc(1, buf->iov_len);
    recv_pkt->payload = buf->iov_base;
    ret = skt_recv(r->fd, buf->iov_base, buf->iov_len);
    if (ret == 0) {
        loge("peer connect closed\n");
        goto err;
    } else if (ret != buf->iov_len) {
        loge("skt_recv failed: rlen=%d, ret=%d\n", buf->iov_len, ret);
        goto err;
    }
    return buf;
err:
    if (buf->iov_base) {
        free(buf->iov_base);
    }
    free(buf);
    return NULL;
}
Beispiel #5
0
struct iobuf *rpc_recv_buf(struct rpc *r)
{
    struct iobuf *buf = CALLOC(1, struct iobuf);
    struct rpc_packet *pkt = &r->packet;
    int ret, rlen;
    int head_size = sizeof(rpc_header_t);

    ret = skt_recv(r->fd, (void *)&pkt->header, head_size);
    if (ret == 0) {
        loge("peer connect closed\n");
        goto err;
    } else if (ret != head_size) {
        loge("skt_recv failed, head_size = %d, ret = %d\n", head_size, ret);
        goto err;
    }
    //strncpy(r->uuid_dst, pkt->header.uuid_dst, MAX_UUID_LEN);
    rlen = pkt->header.len;
    buf->addr = calloc(1, rlen);
    buf->len = rlen;
    pkt->data = buf->addr;
    ret = skt_recv(r->fd, buf->addr, rlen);
    if (ret == 0) {
        loge("peer connect closed\n");
        goto err;
    } else if (ret != rlen) {
        loge("skt_recv failed: rlen=%d, ret=%d\n", rlen, ret);
        goto err;
    }
    //dump_packet(&pkt);
    return buf;
err:
    if (buf->addr) {
        free(buf->addr);
    }
    free(buf);
    return NULL;
}
Beispiel #6
0
Datei: tcp.c Projekt: gozfree/src
static int tcp_read(struct protocol_ctx *sc, void *buf, int len)
{
    struct tcp_ctx *c = sc->priv;
    int ret = skt_recv(c->fd, buf, len);
    return ret;
}