iperf报错broken pipe和bad file descriptiopn
在进行iperf测试时,出现了两个错误:
(1)iperf3:error - select failed: bad file descriptor
(2)iperf3: error - unable to send conrol message: broken pipe
这两个错误都是在客户端出现的。
根据iperf源码,分析了这两个错误的调用函数以及可能出错原因。
1、iperf简介
网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理、网络存在安全漏洞等原因,都会导致网络带宽利用率不高。要找到网络带宽利用率不高的原因,就需要对网络传输进行监控,此时就需要用到一些网络性能评估工具,而Iperf就是这样一款网络带宽测试工具。
详细介绍可以看这个博客:https://blog.csdn.net/bingyu9875/article/details/105700655
2、Bad file descriptor错误
在iperf源码中查找Bad file descriptor关键字找不到,于是查找error - select failed关键字。
发现在src/iperf_strerror.c文件中,当int_error=IESELECT时,会报出select failed关键字。
根据error-关键字,确定调用iperf_strerror.c中的iperf_streror函数的是src/main.c。
main.c中调用run(test),查看main.c中的run函数,当iperf_run_client(test) < 0时,进入报错分支,就会报出error-关键字。
iperf_run_client函数在src/iperf_client_api.c文件中,发现当result < 0 && errno != EINTR时,i_errno = IESELECT。而result = select(test->max_fd + 1, &read_set, &write_set, NULL, timeout),result函数在库文件sys/select.h中。
select于监视文件描述符的变化情况——读写或是异常,如果有一个服务器程序维护多个TCP连接,判断有数据到达的办法是监听一组文件描述符,获取事件变化。
select返回负值是select错误。select函数的详细介绍可以查看这个博客:https://blog.csdn.net/Orange_pa/article/details/128110033。
在iperf源码中查找Bad file descriptor关键字找不到的原因分析为:调用了strerror(num)函数。strereror是系统库函数,根据num数字以及系统的不同,会返回不同的字符串。
3、 broken pipe错误
与上一错误类似,查找 broken pipe关键字没有找到,分析后发现也是调用strerror函数返回的字符串;通过error - unable to send conrol message关键字发现了在src/iperf_strerror.c文件中,当int_error=IESENDMESSAGE时,报出关键字。
在main.c文件中调用run函数,在iperf_client_api.c文件中调用iperf_run_client函数。
但是在iperf_run_client函数中,调用iperf_set_send_state函数。