كيف يمكنني حساب استخدام الشبكة لكل من الإرسال واستقبال
-
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- وظائف وهياكل لمعرفة ما إذا وجدت أي شيء مناسب لمهمتك.