【问题标题】:How can I get the "Latency" of a process that has a TCP connection open?如何获得打开 TCP 连接的进程的“延迟”?
【发布时间】:2011-03-04 14:13:13
【问题描述】:

我正在寻找 TCP 连接的“延迟”字段。我注意到 Windows 资源监视器有这个字段,我想知道是否有办法找到它。最好不使用 WMI。

如果您不确定我在说什么字段,请打开任务管理器,转到“性能”选项卡并点击“资源监视器”按钮。

资源监视器打开后,展开 TCP 连接区域,您将看到延迟字段。有没有办法以编程方式访问它?

谢谢!

【问题讨论】:

  • 这个神秘的“资源监视器”按钮在哪里?
  • @d03boy:Vista & 7 有资源监视器,XP 没有。我猜你在 XP 上?

标签: c# networking


【解决方案1】:

我假设资源监视器查看给定 TCP 表条目的往返时间 (RTT)。这给出了整体网络延迟的合理指示。

您可以使用一个 API 来访问这些统计信息,即GetPerTcpConnectionEStats。这使您可以检索有关特定 TCP 连接的大量统计信息。

基本上你首先使用GetTcpTable获取tcp连接列表,然后找到你想要的行,并将它传递给GetPerTcpConnectionEStats,使用TcpConnectionEstatsPath作为EstatsType参数,这样你应该得到一个@987654325 @ 结构体。

此结构中包含许多 RTT 统计信息,其中最有用的可能是 SumRtt 和 CountRtt 成员,您可以使用它们来获取特定 TCP 表行的平均 RTT 计算。

请注意,这些功能只存在于Vista及以上版本中,但资源监视器也存在,所以我认为没关系。

【讨论】:

    【解决方案2】:

    我认为您无法通过任何 API 访问此信息。资源监视器可能通过查看数据包被回复所需的时间来计算它。

    要在您的应用中执行此操作,请执行以下操作(伪代码):

    startTime = now
    socket = openSocket()
    endTime = now
    latency = endTime - startTime
    

    它不会非常精确,但应该非常接近实际的网络延迟。但是请记住,Nagle's algorithm 可能会影响延迟计算。

    【讨论】:

    • 知道是否有办法获取连接的套接字或 ip 吗?问题是我需要监控一个可以连接到 40 个不同 IP 的程序,但我不知道所有这些。
    • 我不确定使用套接字打开时间是计算延迟的最佳方法,因为可能需要进行 ARP 解析,从而增加了所需的时间。
    猜你喜欢
    • 2018-01-02
    • 2017-11-01
    • 2011-07-21
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多