如何获得打开TCP连接的进程的“延迟”?

时间:2010-06-16 17:18:06

标签: c# networking

我希望得到TCP连接的“Latency”字段。我注意到Windows资源监视器有这个字段,我想知道是否有一种方法可以找到它。最好不使用WMI。

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

资源监视器打开后,展开“TCP连接”区域,您将看到“延迟”字段。无论如何以编程方式访问它?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

您基本上首先使用GetTcpTable获取tcp连接列表,然后找到所需的行,并将其传递给GetPerTcpConnectionEStats,并将TcpConnectionEstatsPath作为EstatsType参数,以便你应该得到一个TCP_ESTATS_PATH_ROD_v0结构。

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

请注意,这些功能仅存在于Vista及更高版本中,但资源监视器也是如此,所以我认为没问题。

答案 1 :(得分:0)

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

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

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

它不会非常精确,但它应该非常接近实际的网络延迟。但请注意,Nagle's algorithm可能会导致延迟计算混乱。