2009-07-14 10 views
8

मैं लिनक्स और मैकॉक्स पर सी में नेटवर्क आंकड़ों को पकड़ने का एक तरीका ढूंढ रहा हूं। विशेष रूप से, मुझे सिस्टम पर प्रत्येक नेटवर्क एडाप्टर से अपलोड और डाउनलोड किए गए बाइट्स की संख्या की निगरानी करने की आवश्यकता है - मुझे पैकेट निरीक्षण करने की आवश्यकता नहीं है, या प्रोटोकॉल के बीच अंतर करने की आवश्यकता नहीं है, केवल 'कुल बाइट्स' काउंटर जो मैं अंतराल पर मतदान कर सकता हूं ठीक रहो। विंडोज़ में मैं GetIfTable (नेटवर्क एडेप्टर सूचीबद्ध करने के लिए) और GetIfEntry (आंकड़े पढ़ने के लिए) के माध्यम से iphlpapi.dll लाइब्रेरी का उपयोग करके ऐसा कर सकता हूं, लेकिन मुझे लिनक्स/ओएसएक्स समकक्ष नहीं मिल रहे हैं। सी का मेरा ज्ञान काफी बुनियादी है इसलिए मैं ऐसे समाधान की सराहना करता हूं जो बहुत शामिल नहीं है। कोई भी सहायताकाफी प्रशंसनीय होगी!लिनक्स/मैक ओएसएक्स में नेटवर्क एडाप्टर आंकड़े कैसे प्राप्त करें?

+0

से मैं अब तक क्या पाया है, तो आप दोनों प्लेटफार्मों पर आम कोड का उपयोग करने में सक्षम हो नहीं जा रहे हैं: यहाँ कुछ कोड है कि अंदर और बाहर बाइट की संख्या प्रिंट पर OSX है। ऐसा लगता है कि लिनक्स इस जानकारी को बनाए रखने के लिए फ़ाइल सिस्टम का उपयोग करता है, और फाइलों को पढ़ने के लिए सिस्टम की क्वेरी की सामान्य विधि है। ओएसएक्स पर जानकारी स्मृति और अस्पष्ट फ़ाइलों में आयोजित की जाती है। – Armand

उत्तर

2
लिनक्स पर

:

  • निम्न स्तर: थोड़ा अधिक के स्तर की जाँच /sys/class/net/eth0/statistics/
  • : ip -s link show eth0
  • चित्रमय: iftop
  • इंटरैक्टिव: iptraf
+4

प्रश्न का शीर्षक ओएसएक्स है। पहले दो ओएसएक्स पर काम नहीं करते हैं। नीचे दो ग्राफिकल और इंटरैक्टिव होने के कारण या तो सवाल करने के लिए उपयुक्त नहीं हैं। – Purrell

+2

प्रश्न के टाइल और बॉडी दोनों लिनक्स और ओएसएक्स का उल्लेख करते हैं। इस लिनक्स हिस्सा – Javier

1

मैं से बात नहीं कर सकते ओएसएक्स लेकिन लिनक्स पर/proc/net/dev पर एक नज़र डालें।

यदि आप 'बिल्ली/proc/net/dev' करते हैं तो आपको 'बाइट्स' सहित आंकड़े देखना चाहिए - इंटरफ़ेस द्वारा प्रेषित या प्राप्त डेटा के बाइट्स की कुल संख्या। आप फ़ाइल को अपने प्रोग्राम के भीतर पढ़ सकते हैं।

संपादित करें:

मैं अपने पूरे सवाल पढ़ा नहीं था। This article आपको/proc के साथ शुरू करने में मदद करनी चाहिए और/proc/net/dev पर एक अनुभाग है।

इसके अलावा, इंटरफेस सूचीबद्ध करने के लिए आप पर SIOCGIFCONF विकल्प के साथ कॉल कर सकते हैं। आप लौटाए गए डेटा के माध्यम से लूप कैसे करें पर एक सभ्य कोड उदाहरण के लिए Google कर सकते हैं। या आप इसे ऊपर उल्लिखित /proc.net/dev डेटा से बाहर खींच सकते हैं, जो आसान होना चाहिए।

+0

के बारे में है या, जेवियर के जवाब के अनुसार, के तहत '/ sys/कक्षा/नेट/{अपने नेटवर्क इंटरफेस}/statistics', फ़ाइलें जहां' {अपने नेटवर्क इंटरफेस} 'नेटवर्क का नाम है पर देखने के इंटरफ़ेस जिसे आप देखना चाहते हैं, उदाहरण के लिए पहले ईथरनेट इंटरफ़ेस के लिए 'eth0'। sysfs ('/ sys' पर) procfs ('/proc' पर) से नया है। –

20

डार्विन नेटस्टैट स्रोत कोड 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

यह सिम्युलेटर पर ठीक काम करता है। लेकिन डिवाइस पर त्रुटि देता है। त्रुटि है-/उपयोगकर्ताओं/praveendala/डेस्कटॉप/सब में one3/APP2/APP2/main.m: 13: 10: गंभीर त्रुटि: 'शुद्ध/route.h' फ़ाइल नहीं मिली। – virata

+0

मैं जानता हूँ कि यह OSX के लिए है। लेकिन मुझे आईओएस डिवाइस पर चलाने की जरूरत है। कोई विचार? – virata

+0

अच्छी तरह से किया गया। मुझे लगता है कि आप एक उद्देश्य-सी समाधान भी प्रदान करते हैं। – Armand

संबंधित मुद्दे

 संबंधित मुद्दे