2009-07-14 2 views
8

Linux 및 MacOSX에서 C 네트워크 통계를 얻는 방법을 찾고 있습니다. 특히, 시스템의 각 네트워크 어댑터에서 업로드 및 다운로드 한 바이트 수를 모니터링해야합니다. 패킷 검사를 수행하거나 프로토콜을 구분할 필요가 없습니다. 간격을두고 폴링 할 수있는 '총 바이트 수'카운터 좋아. Windows에서는 GetIfTable (네트워크 어댑터 목록 표시) 및 GetIfEntry (통계 읽기)를 통해 iphlpapi.dll 라이브러리를 사용하여이 작업을 수행 할 수 있지만 Linux/OSX에 해당하는 항목을 찾을 수 없습니다. C에 대한 지식은 상당히 기본적인 것이므로 너무 복잡하지 않은 해결책을 고맙게 생각합니다. 어떤 도움을 많이 주시면 감사하겠습니다!linux/Mac OSX에서 네트워크 어댑터 통계를 얻는 방법은 무엇입니까?

리눅스에
+0

에서 : 여기 OSX에에서 밖으로 바이트 수를 출력하는 코드이다. 리눅스는이 정보를 유지하기 위해 파일 시스템을 사용하고 시스템이 파일을 읽는 일반적인 쿼리 방법을 사용합니다. OSX에서는 정보가 메모리와 애매한 파일에 저장됩니다. – Armand

답변

2

:

  • 낮은 수준 : /sys/class/net/eth0/statistics/
  • 에게 약간 높은 수준을 확인하십시오 ip -s link show eth0
  • 그래픽 : iftop
  • 대화 형 : iptraf
+4

제목은 OSX입니다. 처음 두 가지는 OSX에서 작동하지 않습니다. 아래 두 가지는 그래픽과 대화식으로 질문하는 데 적합하지 않습니다. – Purrell

+2

질문의 타일과 본문에는 Linux와 OSX가 나와 있습니다. 이것은 리눅스 부분에 관한 부분입니다 – Javier

1

내가 말할 수 없습니다 OSX하지만 리눅스에서는/proc/net/dev을 살펴보십시오.

'cat/proc/net/dev'를 실행하면 인터페이스에서 전송하거나 수신 한 총 바이트 수인 '바이트'를 포함한 통계를 볼 수 있습니다. 자신의 프로그램 내에서 파일을 읽을 수 있습니다.

편집 :

나는 당신의 모든 질문을 읽어 보지 않았다. This article은/proc을 시작하는 데 도움이되며/proc/net/dev에 대한 섹션이 있습니다.

또한 인터페이스를 나열하려면 ioctlSIOCGIFCONF 옵션과 함께 호출 할 수 있습니다. 반환 된 데이터를 반복하는 방법에 대한 괜찮은 코드 예를 Google에서 얻을 수 있습니다. 또는 위에서 언급 한 /proc.net/dev 데이터에서 간단히 빼낼 수 있습니다. 더 쉬워야합니다.

+0

또는 하비에르의 대답에 따라'/ sys/class/net/{네트워크 인터페이스}/통계'파일에서 {{네트워크 인터페이스}}는 네트워크 이름입니다 당신이보고 싶은 인터페이스, 예. 첫 번째 이더넷 인터페이스의 경우 'eth0'. sysfs ('/ sys')는 procfs ('/ proc'에)보다 새로운 것입니다. –

20

Darwin netstat 소스 코드는 sysctl을 사용합니다. 내가 지금까지 발견 한 무엇을, 당신은 두 플랫폼 모두에 공통 코드를 사용할 수 있도록하지 않을

#import <Foundation/Foundation.h> 
#include <sys/sysctl.h> 
#include <netinet/in.h> 
#include <net/if.h> 
#include <net/route.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    int mib[] = { 
     CTL_NET, 
     PF_ROUTE, 
     0, 
     0, 
     NET_RT_IFLIST2, 
     0 
    }; 
    size_t len; 
    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { 
     fprintf(stderr, "sysctl: %s\n", strerror(errno)); 
     exit(1); 
    } 
    char *buf = (char *)malloc(len); 
    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { 
     fprintf(stderr, "sysctl: %s\n", strerror(errno)); 
     exit(1); 
    } 
    char *lim = buf + len; 
    char *next = NULL; 
    u_int64_t totalibytes = 0; 
    u_int64_t totalobytes = 0; 
    for (next = buf; next < lim;) { 
     struct if_msghdr *ifm = (struct if_msghdr *)next; 
     next += ifm->ifm_msglen; 
     if (ifm->ifm_type == RTM_IFINFO2) { 
      struct if_msghdr2 *if2m = (struct if_msghdr2 *)ifm; 
      totalibytes += if2m->ifm_data.ifi_ibytes; 
      totalobytes += if2m->ifm_data.ifi_obytes; 
     } 
    } 
    printf("total ibytes %qu\tobytes %qu\n", totalibytes, totalobytes); 
    [pool drain]; 
    return 0; 
} 
+0

이것은 시뮬레이터에서 잘 작동합니다. 그러나 장치에 오류를줍니다. one3/app2/app2/main.m : 13 : 10 : 치명적인 오류 : 'net/route.h'파일에서 오류가 -/Users/praveendala/Desktop/all을 찾을 수 없습니다. – virata

+0

나는 이것이 OSX를 위해다는 것을 알고있다. 하지만 장치가 필요해. 무슨 생각? – virata

+0

멋지게 완료되었습니다. 나는 Objective-C 솔루션을 제공하기를 좋아합니다. – Armand

관련 문제