c - 套接字 : measure data transfer rate (in bytes/second) between 2 applications

标签 c performance sockets

我有一个使用 TCP 套接字不断向第二个应用程序(消费者应用程序)发送数据的应用程序。如何计算从第一个应用程序发送数据到第二个应用程序接收数据所需的总时间?这两个应用程序均使用 C/C++ 进行编码。 我目前的方法如下(伪代码):

struct packet{
   long sent_time;  
   char* data;  
}

第一个应用程序(发射器):

packet p = new packet();
p.data = initialize data (either from file or hard coded)
p.sent_time = get current time (using gettimeofday function)

//send the packet struct (containing sent time and packet data)
send (sockfd, p, ...); 

第二个应用(消费者)

packet p = new packet();
nbytes = recv (sockfd, p, .....); // get the packet struct (which contains the sent time and data)
receive_time = get current time
data transfer time = receive time - p.senttime (assume I have converted this to second)
data transfer rate = nbytes / data transfer time; // in bytes per second

然而,这样做的问题是 2 个应用程序(发射器和消费者)之间的本地时钟时间不同,因为它们都在不同的计算机上运行,​​导致这个结果完全无用。 有没有其他更好的方法以正确的方式(以编程方式)执行此操作,并获得尽可能准确的数据传输速率?

最佳答案

如果您的协议(protocol)允许,您可以从服务器发回对接收到的数据包的确认。如果您想确保服务器接收/处理数据,这也是必须的。

如果有,您可以简单地计算客户端的费率。只需从发送+ACK 间隔的长度中减去 RTT,您就会得到非常准确的测量结果。

或者,您可以使用诸如 NTP 之类的时间同步工具来同步两台服务器上的时钟。

关于c - 套接字 : measure data transfer rate (in bytes/second) between 2 applications,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754883/

相关文章:

c++ - C 程序 : Get inode header fields and information by inode number

c++ - Eigen 中立方根的性能改进

performance - 重构存储过程

c++ - 使用与 O_CLOEXEC 相同的 accept4() 设置 SOCK_CLOEXEcflags的目的是什么

java - 采用冷熔接的 socket 连接

c - sbrk(0) 和 sbrk(size) 都返回相同的地址

检查 char 是否以\xHH 表示法写入

sql-server - Join 会减慢 sql

c - UDP 客户端没有从 C 中的服务器接收任何内容

c - 这段代码如何打印用户输入的最后一个词?