在进行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。
3、 broken pipe错误
与上一错误类似,查找 broken pipe关键字没有找到,通过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函数。
iperf_set_send_state函数在src/iperf_api.c函数中定义,当 Nwrite(test->ctrl_sck, (char*) &state, sizeof(state), Ptcp) < 0时, i_errno = IESENDMESSAGE。 Nwrite函数定义在src/net.c文件中,该函数内部定义r = write(fd, buf, nleft),,当r<0时会进入错误分支。 write函数为库函数,write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内,如果顺利write()会返回实际写入的字节数(len)。当有错误发生时则返回-1,错误代码存入errno中。 write函数详细介绍可以看这篇博客:https://blog.csdn.net/hhhlizhao/article/details/71552588#:~:text=1%E3%80%81write%20%28%29%E5%87%BD%E6%95%B0%E5%AE%9A%E4%B9%89%EF%BC%9Assize_t%20write%20%28int%20fd%2C%20const%20void,%2A%20buf%2C%20size_t%20count%29%3B%E5%87%BD%E6%95%B0%E8%AF%B4%E6%98%8E%EF%BC%9Awrite%20%28%29%E4%BC%9A%E6%8A%8A%E5%8F%82%E6%95%B0buf%E6%89%80%E6%8C%87%E7%9A%84%E5%86%85%E5%AD%98%E5%86%99%E5%85%A5count%E4%B8%AA%E5%AD%97%E8%8A%82%E5%88%B0%E5%8F%82%E6%95%B0fd%E6%89%80%E6%8C%87%E7%9A%84%E6%96%87%E4%BB%B6%E5%86%85%E3%80%82%20%E8%BF%94%E5%9B%9E%E5%80%BC%EF%BC%9A%E5%A6%82%E6%9E%9C%E9%A1%BA%E5%88%A9write%20%28%29%E4%BC%9A%E8%BF%94%E5%9B%9E%E5%AE%9E%E9%99%85%E5%86%99%E5%85%A5%E7%9A%84%E5%AD%97%E8%8A%82%E6%95%B0%EF%BC%88len%EF%BC%89%E3%80%82标签:E5%,BC%,E6%,pipe,descriptiopn,报错,error,iperf,select From: https://www.cnblogs.com/yiliu666-oo/p/18246662