iPerf源码分析

iperf数据结构分析

  • 前言
  • 主要数据结构
    • struct iperf_test
  • 总结


前言

基于iPerf 3.1.3源码分析

主要数据结构

struct iperf_test

struct iperf_test
{
    char      role;   //'c'表示客户端,'s'表示服务端,客户端和服务端共用一份代码,用于区分
    int       sender; //数据发送方
    int       sender_has_retransmits; //发送方是否有重传
    struct protocol *protocol; //协议头指针,协议分为:TCP、UDP、SCTP
    signed char state;  //客户端和服务端状态机,如:TEST_START TEST_RUNNING RESULT_REQUESTEST_END 4

    char     *server_hostname; 
    char     *tmp_template;
    char     *bind_address; //绑定ip地址
    TAILQ_HEAD(xbind_addrhead, xbind_entry) xbind_addrs;
    int       bind_port; //绑定端口号
    int       server_port;//服务端socket端口号
    int       omit;       
    int       duration; //测试总时长
    char     *diskfile_name; //默认为NULL
    int       affinity, server_affinity; //客户端和服务端CPU亲和
#if defined(HAVE_CPUSET_SETAFFINITY)
    cpuset_t cpumask;
#endif
    char     *title; //默认为NULL
    char     *congestion; //拥塞控制算法
    char     *pidfile; //程序pid保存文件 

    char     *logfile; //日志文件
    FILE     *outfile; //打印信息输出文件,默认stdout

    int       ctrl_sck; //服务端通信socket
    int       listener; //服务端监听socket
    int       prot_listener;

    int       daemon; //是否脱离控制台,以守护进程方式在后台运行,命令行参数-D打开
    int       one_off; //-1
    int       no_delay; //-N
    int       reverse; //服务端发送数据,客户端接收数据,用于测试下行,命令行参数-R打开
    int       verbose //-V
    int       json_output;//输出json调试信息,命令行参数-J打开
    int       zerocopy; //零拷贝标志,-Z
    int       debug;//调试信息表示,-d
   
    int       get_server_output;
    int       udp_counters_64bit;
    int       no_fq_socket_pacing;
    int       multisend;

    char     *json_output_string; 
    int       max_fd; //
    fd_set    read_set;
    fd_set    write_set;
    
    int       omitting;
    double    stats_interval; //统计间隔时间
    double    reporter_interval;//上报间隔时间
    void      (*stats_callback) (struct iperf_test *); //客户端和服务端测试统计回调函数
    void      (*reporter_callback) (struct iperf_test *); //客户端和服务端测试记录上报回调函数
    Timer     *omit_timer; //定时器
    Timer     *timer; //定时器
    int        done; //定时器
    Timer     *stats_timer; //统计定时器
    Timer     *reporter_timer; //上报定时器

    double cpu_util[3];
    double remote_cpu_util[3];
    int       num_streams; //测试流数量(线程数量),默认为1, 命令行参数-P指定流数量

    iperf_size_t bytes_sent; //发送字节数量
    iperf_size_t blocks_sent; //发送块数据
    char      cookie[COOKIE_SIZE]; //客户端和服务端开始通信前,需发送一串字符串
//    struct iperf_stream *streams; 
    SLIST_HEAD(slisthead, iperf_stream) streams;
    struct iperf_settings *settings; //struct iperf_settings用于记录socket的一些信息,如domain,window size,buffer等

    SLIST_HEAD(plisthead, protocol) protocols;

    void      (*on_new_stream)(struct iperf_stream *);
    void      (*on_test_start)(struct iperf_test *);
    void      (*on_connect)(struct iperf_test *);
    void      (*on_test_finish)(struct iperf_test *);

    cJSON *json_top;
    cJSON *json_start;
    cJSON *json_connected;
    cJSON *json_intervals;
    cJSON *json_end;
    
    char *server_output_text;
    cJSON *json_server_output;

    TAILQ_HEAD(iperf_textlisthead, iperf_textline) server_output_list;
};  

总结

持续
更新中。。。

你可能感兴趣的:(iperf源码分析,网络)