The spray protocol is not a C function interface, per se, but can be accessed using the generic remote procedure calling interface clnt_call (see rpc_clnt_calls(3rpc)). The protocol sends a packet to the called host. The host acknowledges receipt of the packet. The protocol counts the number of acknowledgments and can return that count.
The spray protocol currently supports the following procedures, which should be called in the order given:
The XDR routines xdr_sprayarr and xdr_spraycumul are available in librpcsvc.
#include <rpc/rpc.h> #include <rpcsvc/spray.h> ... spraycumul spray_result; sprayarr spray_data; char buf[100]; /* arbitrary data */ int loop = 1000; CLIENT *clnt; struct timeval timeout0 = {0, 0}; struct timeval timeout25 = {25, 0};spray_data.sprayarr_len = (u_int)100; spray_data.sprayarr_val = buf;
clnt = clnt_create("somehost", SPRAYPROG, SPRAYVERS, "netpath"); if (clnt == (CLIENT *)NULL) { /* handle this error */ }
if (clnt_call(clnt, SPRAYPROC_CLEAR, xdr_void, NULL, xdr_void, NULL, timeout25)) { /* handle this error */ } while (loop-- > 0) { if (clnt_call(clnt, SPRAYPROC_SPRAY, xdr_sprayarr, &spray_data, xdr_void, NULL, timeout0)) { /* handle this error */ } } if (clnt_call(clnt, SPRAYPROC_GET, xdr_void, NULL, xdr_spraycumul, &spray_result, timeout25)) { /* handle this error */ } printf("Acknowledged %ld of 1000 packets in %d secs %d usecs\n", spray_result.counter, spray_result.clock.sec, spray_result.clock.usec);