C++ 使用C+测量网络上两个应用程序之间的数据传输速率(带宽)+;,如何得到公正、准确的结果?

C++ 使用C+测量网络上两个应用程序之间的数据传输速率(带宽)+;,如何得到公正、准确的结果?,c++,performance,sockets,network-programming,bandwidth,C++,Performance,Sockets,Network Programming,Bandwidth,我试图测量两个模拟应用程序(用C++编写)之间的IO数据传输速率(带宽)。我创建了一个非常简单的perfclient和perfserver程序,只是为了在实际应用程序中实现此计算方法之前验证我计算网络带宽的方法是否正确。因此,在这种情况下,我需要通过编程(而不是使用Iperf)来完成 我尝试在不同的域(本地主机、连接到以太网的计算机和连接到无线连接的计算机)上运行我的perfclient和perfserver程序。然而,我总是在这些不同的主机上获得相似的带宽,大约1900 Mbps(使用1472

我试图测量两个模拟应用程序(用C++编写)之间的IO数据传输速率(带宽)。我创建了一个非常简单的perfclient和perfserver程序,只是为了在实际应用程序中实现此计算方法之前验证我计算网络带宽的方法是否正确。因此,在这种情况下,我需要通过编程(而不是使用Iperf)来完成

我尝试在不同的域(本地主机、连接到以太网的计算机和连接到无线连接的计算机)上运行我的perfclient和perfserver程序。然而,我总是在这些不同的主机上获得相似的带宽,大约1900 Mbps(使用1472字节的数据大小进行测试)。这是一个合理的结果,还是可以得到更好更准确的带宽

我是否应该使用1472(即以太网MTU,不包括标头)作为每个send()和recv()的最大数据大小,以及为什么/为什么不?我还尝试使用不同的数据大小,这里是我得到的平均带宽(使用以太网连接测试),这对我来说没有意义,因为这个数字超过了1Gbps,达到了28 Gbps左右

SIZE    BANDWIDTH
1KB     1396 Mbps
2KB     2689 Mbps
4KB     5044 Mbps
8KB     9146 Mbps
16KB    16815 Mbps
32KB    22486 Mbps
64KB    28560 Mbps
以下是我目前的做法:
我做了一个基本的乒乓式循环,客户端不断地向服务器程序发送字节数的数据流。服务器将读取这些数据,并将数据反射(发送)回客户端程序。然后,客户端将读取这些反射数据(双向传输)。上述操作重复1000次,然后我将时间除以1000得到平均延迟时间。接下来,我将平均延迟时间除以2,得到单向传输时间。然后,带宽可以按如下方式计算:

bandwidth = total bytes sent / average 1-way transmission time
我的方法有什么问题吗?我怎样才能确保我的结果没有偏见?一旦我做对了,我需要在我的原始应用程序中测试这种方法(不是这个简单的测试应用程序),我想把这个性能测试结果写在一篇科学论文中

编辑:
我已经解决了这个问题。请查看我在下面发布的答案。

除非您需要重新发明车轮,否则车轮就是为了解决这个问题而制造的

Iperf由NLANR/DAST开发,作为测量最大TCP和UDP带宽性能的现代替代方案。Iperf允许调整各种参数和UDP特性。Iperf报告带宽、延迟抖动、数据报丢失


我终于能够想出并解决这个问题:-)
正如我在问题中提到的,无论我使用的网络体系结构如何(本地主机、1Gbps以太网卡、无线连接等),我实现的带宽都可以扩展到28Gbps。我尝试将服务器IP地址绑定到几个不同的IP地址,如下所示:

127.0.0.1  
IP address given by my LAN connection  
IP address given by my wireless connection
所以我认为这应该给我正确的结果,事实上它没有。 这主要是因为我在同一台计算机上运行客户机和服务器程序(不同的终端窗口,即使客户机和服务器都绑定到不同的IP地址)。我猜这是由内部回环引起的。这就是结果如此偏颇和不准确的主要原因

不管怎样,我试着在一台工作站上运行客户端,在另一台工作站上运行服务器,并使用不同的网络连接对它们进行了测试,结果如预期的那样工作:-)

在1Gbps连接上,我获得了约9800 Mbps(0.96 Gbps),在10Gbps连接上,我获得了约10100 Mbps(9.86 Gbps)。因此,这项工作完全符合我的预期。所以我的方法是正确的。太好了

是的,我可以使用Iperf在常规设置下监控我的网络带宽。我需要的是测量我编写的两个特定模拟应用程序(不是这些perfclient和perfserver应用程序)之间的数据传输速率。它们都在相互通信,通信涉及数据IO交换。所以我希望能够测量这两个模拟应用程序之间的IO数据传输带宽。