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; }
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; }
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; }
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; }
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; }
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; }