-int Channel::RecvFrom (evutil_socket_t sock, Address& addr, struct evbuffer *evb) {
- socklen_t addrlen = sizeof(struct sockaddr_mptp) + addr.addr->count * sizeof(mptp_dest);
- struct evbuffer_iovec vec;
- if (evbuffer_reserve_space(evb, SWIFT_MAX_RECV_DGRAM_SIZE, &vec, 1) < 0) {
- print_error("error on evbuffer_reserve_space");
- return 0;
- }
- int length = recvfrom (sock, (char *)vec.iov_base, SWIFT_MAX_RECV_DGRAM_SIZE, 0,
- (struct sockaddr*)&(addr.addr), &addrlen);
+int Channel::RecvFrom (evutil_socket_t sock, Address& addr, struct evbuffer **evb) {
+ int count = addr.addr->count;
+ socklen_t addrlen = sizeof(struct sockaddr_mptp) + count * sizeof(mptp_dest);
+ struct evbuffer_iovec vec[count];
+ for (int i=0; i<count; ++i) {
+ if (evbuffer_reserve_space(evb[i], SWIFT_MAX_RECV_DGRAM_SIZE, &vec[i], 1) < 0) {
+ print_error("error on evbuffer_reserve_space");
+ return 0;
+ }
+ }
+ struct iovec iov[count];
+ struct msghdr msg;
+ memset(&msg, 0, sizeof(msg));
+ memset(&iov, 0, sizeof(iov));
+ for (int i=0; i<count; ++i) {
+ iov[i].iov_base = vec[i].iov_base;
+ iov[i].iov_len = SWIFT_MAX_RECV_DGRAM_SIZE;
+ }
+ msg.msg_iov = iov;
+ msg.msg_iovlen = count;
+ msg.msg_name = addr.addr;
+ msg.msg_namelen = addrlen;
+ int length = recvmsg(sock, &msg, 0);