- 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 count = addr.addr->count;
+ 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 = addr.addr->count;
+ msg.msg_name = addr.addr;
+ msg.msg_namelen = addrlen;
+ int length = recvmsg(sock, &msg, 0);