.TH LIBIPERF 3 "February 2018" ESnet "User Manuals"
.SH NAME
libiperf \- API for iperf3 network throughput tester

.SH SYNOPSIS
#include <iperf_api.h>
.br
\-liperf

.SH DESCRIPTION
.PP
Libiperf gives you access to all the functionality of the iperf3
network testing tool.
You can build it directly into your own program, instead of having
to run it as a shell command.

.SH CALLS
Initialization / termination:
.nf
    struct iperf_test *iperf_new_test();
    int iperf_defaults(struct iperf_test *t);
    void iperf_free_test(struct iperf_test *t);
.fi
Setting test parameters:
.nf
    void iperf_set_test_role( struct iperf_test *pt, char role );
    void iperf_set_test_bind_address( struct iperf_test *t, char *bind_address );
    void iperf_set_test_server_hostname( struct iperf_test *t, char *server_host );
    void iperf_set_test_server_port( struct iperf_test *t, int server_port );
    void iperf_set_test_duration( struct iperf_test *t, int duration );
    void iperf_set_test_blksize( struct iperf_test *t, int blksize );
    void iperf_set_test_num_streams( struct iperf_test *t, int num_streams );
    void iperf_set_test_json_output( struct iperf_test *t, int json_output );
    int iperf_has_zerocopy( void );
    void iperf_set_test_zerocopy( struct iperf_test* t, int zerocopy );
.fi
Running a test:
.nf
    int iperf_run_client(struct iperf_test *);
    int iperf_run_server(struct iperf_test *);
    void iperf_reset_test(struct iperf_test *);
.fi
Output:
.nf
    FILE *iperf_get_test_outfile(struct iperf_test *);
    char* iperf_get_test_json_output_string(struct iperf_test *);
.fi
Error reporting:
.nf
    void iperf_err(struct iperf_test *t, const char *format, ...);
    char *iperf_strerror(int);
    extern int i_errno;
.fi
This is not a complete list of the available calls.
See the include file for more.

.SH EXAMPLES
Here's some sample code that runs an iperf client:
.nf
    struct iperf_test *test;
    test = iperf_new_test();
    if ( test == NULL ) {
        fprintf( stderr, "%s: failed to create test\n", argv0 );
        exit( EXIT_FAILURE );
    }
    iperf_defaults( test );
    iperf_set_test_role( test, 'c' );
    iperf_set_test_server_hostname( test, host );
    iperf_set_test_server_port( test, port );
    if ( iperf_run_client( test ) < 0 ) {
        fprintf( stderr, "%s: error - %s\n", argv0, iperf_strerror( i_errno ) );
        exit( EXIT_FAILURE );
    }
    iperf_free_test( test );
.fi
And here's a server:
.nf
    struct iperf_test *test;
    test = iperf_new_test();
    if ( test == NULL ) {
        fprintf( stderr, "%s: failed to create test\n", argv0 );
        exit( EXIT_FAILURE );
    }
    iperf_defaults( test );
    iperf_set_test_role( test, 's' );
    iperf_set_test_server_port( test, port );
    for (;;) {
        if ( iperf_run_server( test ) < 0 )
            fprintf( stderr, "%s: error - %s\n\n", argv0, iperf_strerror( i_errn
o ) );
        iperf_reset_test( test );
    }
    iperf_free_test( test );
.fi
These are not complete programs, just excerpts.
The full runnable source code can be found in the examples subdirectory
of the iperf3 source tree.

.SH AUTHORS
A list of the contributors to iperf3 can be found within the
documentation located at
\fChttp://software.es.net/iperf/dev.html#authors\fR.

.SH "SEE ALSO"
iperf3(1),
http://software.es.net/iperf/
