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函数。

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中。

 

posted @ 2024-06-13 19:45  yunqing  阅读(673)  评论(0编辑  收藏  举报