Netstat для одного подключения? - PullRequest
2 голосов
/ 04 января 2011

В Linux, есть ли способ программно получить статистику для одного соединения TCP?Статистические данные, которые я ищу, распечатываются netstat -s, но для одного соединения, а не в совокупности по всем соединениям.Чтобы привести несколько примеров: входящие / исходящие байты, повторные передачи, потерянные пакеты и т. Д.

Я могу запустить код внутри процесса, которому принадлежит сокет, и ему может быть предоставлен дескриптор файла сокета.Код, который отправляет / получает данные, недоступен, поэтому, например, нет способа обернуть recv()/send() для подсчета байтов в / из.

Я приму ответы на любом языке, кроме C или Javaособенно актуальны, поэтому теги.

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Информация, на которую ссылается nos , доступна от C с:

#include <linux/tcp.h>
...
struct tcp_info info;
socklen_t optlen;
getsockopt(sd, IPPROTO_TCP, TCP_INFO, &info, &optlen)

К сожалению, поскольку это специфично для Linux, оно не раскрывается через Java Socket API. Если есть способ получить необработанный дескриптор файла из сокета, вы можете реализовать его как собственный метод.

Я не вижу способа добраться до дескриптора. Однако это может быть возможно с вашими SocketImplFactory и SocketImpl .

Вероятно, стоит отметить, что на странице справки TCP (7) говорится следующее: TCP_INFO:

Эта опция не должна использоваться в коде, предназначенном для переносимости.
1 голос
/ 04 января 2011

Большая часть статистики, которую вы видите с помощью netstat -s, не отслеживается отдельно для каждого соединения, существуют только общие счетчики.

Что вы можете сделать, это вытащить информацию в / proc / net / tcp

Во-первых, readlink () в / proc / self / fd, вы хотите проанализировать номер инода из этой символической ссылки и сопоставить его со строкой с таким же номером инода в / proc / net / tcp, которая будет содержать некоторые элементарная информация об этом сокете / соединении. Этот документ, хотя и не очень хорошо документирован, поэтому стоит потратить некоторое время на Google и на чтение исходного кода ядра Linux для их интерпретации.

...