【问题标题】:How to measure time taken for sending data from client to server如何测量从客户端发送数据到服务器所花费的时间
【发布时间】:2021-06-07 16:00:58
【问题描述】:

我正在将数据从客户端发送到服务器。我想准确计算数据到达目的地所需的时间。客户端和服务器在不同的PC上,所以我认为使用系统时间是不明智的,因为它们在不同的系统上。

请告知测量数据到达目的地所用时间的最准确方法。

【问题讨论】:

  • 为什么不使用客户端和服务器系统时间?你想要亚秒级的精度吗?

标签: c++ performance http websocket latency


【解决方案1】:

close 将阻塞直到所有数据都发送完毕,因此如果您从write 开始时间,并在close 之后结束,您将拥有发送时间。对于UDP,数据已经传输,对于TCP,它已经被确认。如果你发送到火星车,那么时间会是往返,但通常确认时间很短。

start_time = someTimeFunc();
char *foo = buf;
while (size) {
    ssize_t sent = send(sock,foo,size,flags);
    if (sent <= 0)
        fail;
    foo += sent;
    size -= sent;
}
close(sock);
end_time = someTimeFunc();

【讨论】:

    【解决方案2】:

    当应用“发送”数据时,实际上并没有立即传输数据。它被放入操作系统内核中的队列中,然后将控制权返回给应用程序。内核将在自己的时间在后台传输排队的数据。无法知道内核何时实际传输,或者数据到达目的地需要多长时间。即使这样,数据也会被放入接收端的另一个内核队列中,等待接收应用程序从该队列中提取数据。

    因此,按照您的要求进行操作的唯一方法是让接收方显式向发送方发送确认,指定何时接收方实际读取数据。发送方和接收方必须就时间尺度达成一致,例如 UTC,并且还必须将它们的时钟同步到一个公共源。然而,这并不是 transmission 时间的真实反映,但如果发送方和接收方都及时处理各自的套接字 I/O,它可能会 close方式。

    【讨论】:

    • 假设我们采用这种方法,此时服务器应该将 ACK 发送回客户端?假设我们同时维护客户端和服务器,但我们如何识别服务器已解析整个请求正文?
    • @quintin 接收者(服务器)在完全接收到完整消息后会等待将 ACK 发送回发送者(客户端)。
    • 是的,如果服务器是我创建的 Spring Boot 应用程序,那么我可以说是的,我已经收到了完整的请求。我在谈论春天提供的任何东西? stackoverflow.com/questions/67769170/…
    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2013-04-11
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多