Socket-Mmsg
view release on metacpan or search on metacpan
iovecs[i].iov_len = msg_len;
msgs[i].msg_hdr.msg_iov = &iovecs[i];
msgs[i].msg_hdr.msg_iovlen = 1;
msgs[i].msg_hdr.msg_name = &src_addr[i];
msgs[i].msg_hdr.msg_namelen = sizeof(src_addr[i]);
}
// timeout struct
timeout.tv_sec = (time_t) tspec;
timeout.tv_nsec = (long) ((tspec - (double) timeout.tv_sec) * 1000000000.0);
// Recv
retval = recvmmsg(sockfd, msgs, msg_count, MSG_WAITFORONE, &timeout);
if (retval == -1) {
perror("recvmmsg()");
}else{
// Gen result array
result = newAV();
for (i = 0; i < retval; i++) {
pack = newAV();
av_push(pack, newSVpv(msgs[i].msg_hdr.msg_name, msgs[i].msg_hdr.msg_namelen)); // sockaddr_in
av_push(pack, newSVpv(bufs[i],msgs[i].msg_len)); // bufer
pack_ref = newRV_noinc((SV *)pack);
av_push(result, pack_ref);
}
result_ref = newRV_noinc((SV *)result);
sv_2mortal(result_ref);
dXSARGS;
sp = mark;
XPUSHs(result_ref);
PUTBACK;
}
// Free memory
Safefree(mem_blk);
Safefree(src_addr);
Safefree(iovecs);
Safefree(msgs);
Safefree(bufs);
}
MODULE = Socket::Mmsg PACKAGE = Socket::Mmsg
PROTOTYPES: DISABLE
void
sendmmsg (psock, msg_array_ref)
PerlIO * psock
SV * msg_array_ref
PPCODE:
sendmultimsg(psock, msg_array_ref);
return;
void
recvmmsg (psock, msg_count, msg_len, tspec)
PerlIO * psock
int msg_count
int msg_len
float tspec
PPCODE:
recvmultimsg(psock, msg_count, msg_len, tspec);
return;
( run in 0.468 second using v1.01-cache-2.11-cpan-5511b514fd6 )