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

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


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

في المرة السابقة رأينا كيف نقول بجلب قائمة ببطاقات الشبكة المتوفرة في Linux، هذه المرة سنقوم بنفس العمل في FreeBSD حيث أن الإختلاف ليس كبير سوى في ال struct ifaddrs تختلف فيه بعض عناصره في التسمية، يكون struct ifaddrs في FreeBSD كالتالي:

struct ifaddrs {
struct ifaddrs  *ifa_next;
char        *ifa_name;
u_int         ifa_flags;
struct sockaddr    *ifa_addr;
struct sockaddr    *ifa_netmask;
struct sockaddr    *ifa_dstaddr;
void        *ifa_data;
};

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

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

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

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

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

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

مثال:

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

#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netdb.h>

#include <ifaddrs.h> // getifaddrs
#include <netinet/in.h> // struct sockaddr_in

int main(int argc, char **argv)
{
struct ifaddrs *net_cards, *if_net;
int family, s;
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 && if_net->ifa_addr->sa_family == AF_INET) {
s = 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;
}

الإختلاف الذي طرأ في هذا المثال هو أنه قمنا بتضمين المكتبة netinet/in.h من أجل struct sockaddr_in، الشيء الآخر أنه في < FreeBSD 8.x أصبح النظام يدعم إقتناص البيانات المرسلة عبر منافذ ال USB، أي أن USB أصبح يعامل و كأنه بطاقة شبكة لهذا أضفنا التالي لهذا السطر:

if (if_net->ifa_addr != NULL <strong>&& if_net->ifa_addr->sa_family == AF_INET</strong>)

هنا نقوم بالتحقق من أن هذا ينتمي إلىIPv4.

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

أضف تعليقاً

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

WordPress.com Logo

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

صورة تويتر

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

Facebook photo

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

Google+ photo

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

Connecting to %s

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