ما هو الفرق بين "struct sockaddr" و "struct sockaddr_in" على أنظمة Linux؟


الاجابه 1:

تم تصميم واجهة برمجة تطبيقات مآخذ بيركلي للعمل مع أنواع مختلفة من شبكات الكمبيوتر ، وليس فقط IPv4 ، وبالتالي هناك ضرورة لتكون قادرة على تمثيل "عنوان" عام بشكل مستقل عن تقنية الشبكة المحددة. على سبيل المثال ، راجع مآخذ Berkeley: بروتوكول وعائلات عنوان.

ضع في اعتبارك على سبيل المثال أنك تستدعي الوظائف ذاتها (مثل: bind () أو recvfrom () أو sendto () أو ما إلى ذلك) بغض النظر عما إذا كنت تعمل مع IPv4 أو IPv6 أو أي شيء آخر: كل هذه الوظائف (من API Berkeley sockets API) فقط تتطلب "عنوان" من نوع ما.

هذا يعني أن البنية sockaddr هي مجرد بنية غير شفافة تحتوي على مساحة كافية لاحتواء أي عنوان لعائلات العناوين المدعومة ، سواء كان AF_INET لـ IPv4 أو AF_INET6 لـ IPv6 أو AF_UNIX لمقابس مجال UNIX وما إلى ذلك).

للوصول إلى الحقول الفردية التي تشكل عنوان عائلة معينة ، يتعين على المرء تقليصها في بنية C المقابلة ، مما يعني إنشاء sockaddr_in لـ AF_INET ، و struct sockaddr_in6 لـ AF_INET6 ، و struct sockaddr_un لـ AF_UNIX وما إلى ذلك.

بهذه الطريقة ، لديك بنية عامة تمثل "عنوانًا من نوع ما" ، يمكن تحويله إلى بنية أكثر تحديدًا عندما تحتاج بعض التعليمات البرمجية إلى الوصول إلى تفاصيل العنوان ، ويمكن نسخها حرفيًا (مع memcpy () لـ مثال) عندما يحتاج الرمز إلى تمرير "عنوان" إلى وظيفة أخرى.