2010-06-16 3 views
3

Je cherche à obtenir le champ "latence" d'une connexion TCP. Je remarque Windows Resource Monitor a ce champ, et je me demandais si je pouvais le trouver. Préférentiellement sans utiliser WMI.Comment puis-je obtenir la "Latence" d'un processus qui a une connexion TCP ouverte?

Si vous n'êtes pas sûr du champ dont je parle, ouvrez le Gestionnaire des tâches, accédez à l'onglet Performances et cliquez sur le bouton Moniteur de ressources.

Une fois le moniteur de ressources ouvert, développez la zone Connexions TCP et vous verrez un champ de latence. Y a-t-il de toute façon accès à ce programme?

Merci!

+0

Où est ce mythique bouton "Resource Monitor"? –

+0

@ d03boy: Vista et 7 ont un moniteur de ressources, pas XP. Je suppose que vous êtes sur XP? –

Répondre

0

Je ne pense pas que vous pouvez accéder à ces informations via une API. Le moniteur de ressources le calcule probablement en voyant combien de temps il faut pour que les paquets reçoivent une réponse.

Pour ce faire, dans votre application, faire quelque chose comme ça (pseudo-code):

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

Il ne sera pas très précis, mais il devrait être assez proche de la latence du réseau réel. Cependant, gardez à l'esprit que Nagle's algorithm peut jouer avec les calculs de latence.

+0

Une idée s'il y a un moyen d'obtenir quelles sockets ou l'ip que la connexion est? Le problème est que j'ai besoin de surveiller un programme qui peut se connecter à 40 IP différents, et je ne les connais pas tous. – Dave

+0

Je ne suis pas sûr que l'utilisation du temps d'ouverture du socket soit la meilleure façon de calculer la latence, car une résolution ARP peut être nécessaire, ce qui augmente le temps nécessaire. – Kazar

2

Je suppose que le moniteur de ressources examine le temps RTT (Round Trip Time) pour une entrée de table TCP donnée. Cela donne une indication raisonnable du délai global du réseau.

Il existe une API que vous pouvez utiliser pour accéder à ces statistiques, à savoir GetPerTcpConnectionEStats. Cela vous permet de récupérer beaucoup de statistiques sur une connexion TCP spécifique.

Vous obtenez essentiellement la liste des connexions tcp utilisant d'abord GetTcpTable, puis trouver la ligne que vous voulez, et passer à GetPerTcpConnectionEStats, avec le TcpConnectionEstatsPath comme paramètre EstatsType, de sorte que vous devriez obtenir une structure TCP_ESTATS_PATH_ROD_v0. Cette structure contient un certain nombre de statistiques RTT, dont la plus utile est probablement les membres SumRtt et CountRtt, que vous pouvez utiliser pour obtenir un calcul RTT moyen pour cette ligne de table TCP particulière. Notez que ces fonctions n'existent que dans Vista et au-dessus, mais que le moniteur de ressources existe aussi, donc je pense que c'est OK.

Questions connexes