الرئيسية > برمجة > جلب معلومات عن بطاقات الشبكة المتوفرة في جهازك بالسي، الجزء الأول Linux

جلب معلومات عن بطاقات الشبكة المتوفرة في جهازك بالسي، الجزء الأول Linux


السلام عليكم و رحمة الله و بركاته

اليوم سنتحدث عن طريقة جلب قائمة لبطاقات الشبكة المتوفرة في الجهاز، عادة نكون نملك واحدة فقط لكن بالنسبة لمن لديهم خادم في المنزل أو في العمل فسيكون هناك على الأقل بطاقتين، ما يهمنا من جلب العلومات هنا هو معرفة رقم الأيبي للبطاقة و كذا العنوان الفيزيائي(MAC Address) بالإضافة إن كانت البطاقة تعمل(up) أو ليست في حالة عمل(down) و ليست معطلة 😀.

تحتفظ النواة بسلسلة مترابطة(linked list) على مستوى الذاكرة لجميع معلومات بطاقات الشبكة المتوفرة على الجهاز، كل عقدة في هذه السلسلة تحتوي على struct ifaddrs يحوي جميع معلومات بطاقة الشبكة، شكله العام كالتالي:

struct ifaddrs {
struct ifaddrs  *ifa_next;    /* Next item in list */
char            *ifa_name;    /* Name of interface */
unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */
struct sockaddr *ifa_addr;    /* Address of interface */
struct sockaddr *ifa_netmask; /* Netmask of interface */
union {
struct sockaddr *ifu_broadaddr;
/* Broadcast address of interface */
struct sockaddr *ifu_dstaddr;
/* Point-to-point destination address */
} ifa_ifu;
#define              ifa_broadaddr ifa_ifu.ifu_broadaddr
#define              ifa_dstaddr   ifa_ifu.ifu_dstaddr
void            *ifa_data;    /* Address-specific data */
};

<pre>

ifa_next هو مؤشر للعقدة التالية في السلسلة يحوي معلومات بطاقة شبكة أخرى أو NULL.

ifa_name هو إسم بطاقة الشبكة.

ifa_flags مجموعة من البيتات كل بيت يمثل خاصية، نتعرف عليه أكثر فيما بعد.

ifa_addr أيبي البطاقة.

ifa_netmask العنوان الفيزيائي الخاص بالشبكة.

هذه ما يهمنا لحد الآن، توفر نواة Linux دالة بإسم getifaddrs.3 ذات وسيط واحد، نقوم بإعطائها مؤشرا ل struct ifaddrs فتقوم بإرجاع linked list تحتوي جميع بطاقات الشبكة المتوفرة.

مثال:

#include <sys/types.h>
#include <ifaddrs.h>
#include <stdlib.h> // perror(), exit()
#include <stdio.h>

int main(int argc, char **argv)
{
struct ifaddrs *net_cards, /*مؤشر في الذاكرة يحوي القائمة*/
*if_net;/*مؤشر يحوي النسخة الأصلية لإستخراج المعلومات لاحقا*/
char host[NI_MAXHOST]; /*هنا نحتفظ بأيبي البطاقة*/
if(getifaddrs(&net_cards) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE); /*في حالة حدث خطأ ما نخرج من البرنامج*/
}

if_net = net_cards; /*نسخ السلسلة*/
while(if_net != NULL) /*ما مدمنا لم نصل إلى نهاية السلسلة*/
{
if (if_net->ifa_addr != NULL) { /*نقوم بجلب فقط العنصر */
getnameinfo(if_net->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); /*هذه الدالة تقوم بتحويل أيبي إلى سلسلة نصية، نشرحها لاحقا*/
printf("Network card name: '%s' .\nIp Address: '%s' .\n", if_net->ifa_name, host);/*الآن نقوم بطابعة إسم الشبكة و عنوان الأيبي*/
}

if_net = if_net->ifa_next; /*التقدم بعقدة في السلسلة*/
}

freeifaddrs(net_cards); /*تحرير الذاكرة المحجوزة من طرف البرنامج بعد الإنتهاء*/
return 0;
}

في الدرس القادم إن شاء الله سنشرح كيفية فعل هذا في أنظمة BSD .

مصادر:

man 3 getifaddrs

man 3 getnameinfo

man 3 freeifaddrs

التصنيفات :برمجة الوسوم:, ,
  1. لا يوجد تعليقات.
  1. No trackbacks yet.

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

%d مدونون معجبون بهذه: