2011-01-04 3 views
2

Linux에서 프로그래밍 방식으로 단일 TCP 연결에 대한 통계를 가져 오는 방법이 있습니까? 내가 찾고있는 통계는 netstat -s에 의해 인쇄되는 정렬이지만 모든 연결에서 집계보다는 단일 연결에 대한 것입니다. 몇 가지 예를 들면 : 바이트 입/출력, 재전송, 패킷 손실 등.단일 연결에 대한 Netstat?

소켓을 소유 한 프로세스 내에서 코드를 실행할 수 있으며 소켓 파일 설명자를 부여 할 수 있습니다. 데이터를 송수신하는 코드는 도달 범위를 벗어나므로, 예를 들어 recv()/send()을 감싸서 바이트를 카운트/아웃하는 방법은 없습니다.

나는 모든 언어로 답변을 수락하지만 C 또는 Java는 특히 태그와 관련이 있습니다.

답변

1

netstat -s에서 볼 수있는 대부분의 통계는 연결 기준으로 추적되지 않으며 전반적인 카운터 만 존재합니다. 당신이 할 수있는 일

는/proc 디렉토리/그물/TCP

첫째, readlink를()은/proc/셀프/FD에, 당신은 그 심볼릭 링크에서 inode 번호를 구문 분석 할의 정보를 뽑아이며,/proc/net/tcp에있는 동일한 inode 번호를 가진 라인과 일치 시키십시오.이 소켓/소켓에 관한 기본적인 정보가 들어 있습니다. 이 파일은 문서화가 잘되어 있지 않으므로 Google에 시간을 할애하고 리눅스 커널 소스 코드를 읽으면 해석 할 수 있습니다. 그것은 자바 소켓 API를 통해 노출되지 않는이 리눅스가 특정 한, 불행하게도

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

:

2

정보 nos는에 함께 C에서 사용할 수 있습니다 의미합니다. 원시 파일 기술자를 소켓에서 얻는 방법이 있다면 이것을 원시 메소드로 구현할 수 있습니다.

설명자를 얻는 방법이 없습니다. 그러나 자신의 SocketImplFactorySocketImpl으로 가능할 수 있습니다.

그것은 TCP(7) manual page이 재 TCP_INFO 말한다 지적 아마 가치 :

이 옵션은 이식을 목적으로하는 코드에 사용해서는 안가.
+0

'getsockopt'의 다섯 번째 매개 변수는'info'의 크기를 유지하는'socklen_t'에 대한 포인터 여야합니다. –

+0

고마워요 @ 리차드 Fearn, 나는 그것을 해결했습니다. –

관련 문제