كيف يمكنني حساب استخدام الشبكة لكل من الإرسال واستقبال

StackOverflow https://stackoverflow.com/questions/1525507

  •  20-09-2019
  •  | 
  •  

سؤال

كيف يمكنني حساب استخدام الشبكة لكلا الإرسال واستلام إما باستخدام C أو برنامج نصي Shell؟

نظامي هو نظام Linux مضمن. تتمثل الطريقة الحالية في بايتات المسجلة المستلمة (B1)، انتظر 1 ثانية، ثم سجلت مرة أخرى (B2). ثم معرفة سرعة الارتباط، أحسب النسبة المئوية لعروض النطاق الترددي المستخدمة.

تلقي الاستفادة = ((((B2 - B1) * 8) / link_speed) * 100

هل هناك طريقة أفضل؟

هل كانت مفيدة؟

المحلول 2

بفضل "CSL" لافتا لي في اتجاه VNSTAT. استخدام مثال VNSTAT هنا هو كيفية حساب استخدام الشبكة.

#define FP32 4294967295ULL
#define FP64 18446744073709551615ULL
#define COUNTERCALC(a,b) ( b>a ? b-a : ( a > FP32 ? FP64-a-b : FP32-a-b))
int sample_time = 2; /* seconds */
int link_speed = 100; /* Mbits/s */
uint64_t rx, rx1, rx2;
float rate;

/* 
 * Either read:
 * '/proc/net/dev' 
 * or 
 * '/sys/class/net/%s/statistics/rx_bytes'
 * for bytes received counter
 */

rx1 = read_bytes_received("eth0"); 
sleep(sample_time); /* wait */
rx2 = read_bytes_received("eth0");

/* calculate MB/s first the convert to Mbits/s*/
rx = rintf(COUNTERCALC(rx1, rx2)/(float)1048576);
rate = (rx*8)/(float)sample_time;

percent = (rate/(float)link_speed)*100;

نصائح أخرى

تحقق من برامج مفتوحة المصدر التي تفعل شيئا مشابها.

بدأ بحثي أداة صغيرة تسمى VNSTAT..

يحاول الاستعلام عن نظام ملفات / بروك، إذا كان ذلك متاحا ويستخدم getifaddrs. للأنظمة التي لا تملكها. ثم قم بإلغاء واجهة AF_LINK الصحيحة، ويحوم بتحويل IF_DATA المقابلة ثم يقرأ البايتات المرسلة والمستلمة، مثل هذا:

ifinfo.rx = ifd->ifi_ibytes;
ifinfo.tx = ifd->ifi_obytes;

تذكر أيضا أن النوم () قد ينام لفترة أطول من ثانية واحدة بالضبط، لذلك ربما يجب عليك استخدام مؤقت عالي الدقة (ساعة الحائط) في معادلةك - أو يمكنك الخوض في IF- وظائف وهياكل لمعرفة ما إذا وجدت أي شيء مناسب لمهمتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top