Socket-Mmsg

 view release on metacpan or  search on metacpan

Mmsg.xs  view on Meta::CPAN

			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 )