سؤال

لدي تطبيق Linux يفتح مقبس UDP ويربطه بمنفذ.لم أواجه أي مشكلة في إرسال حزم البث الأحادي عبر المقبس.لقد أتيحت لي الفرصة لإرسال حزمة بث، لذلك قمت بتمكين SO_BROADCAST، مما سمح لحزم البث بالمرور، ولكن بعد ذلك لاحظت أنه يتم بث حزم البث الأحادي أيضًا.هل هذا هو السلوك المتوقع لمقبس UDP، أم أنه من المرجح أنني أخطأت في تكوين شيء ما؟

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

المحلول

ومن ما أفهم SO_BROADCAST هو خيار مأخذ. حتى إذا كنت تمكينه على المقبس الخاص بك وسوف تبث هذا المقبس. أعتقد أنك سوف تحتاج إلى فتح مآخذ مختلفة إذا كنت تريد أن تفعل الإرسال والبث من نفس القانون.

نصائح أخرى

وأنا لم تفعل أيدي كثيرة عن البرمجة هنا، ولكن ربما كنت بحاجة لتقديم مزيد من المعلومات حول المكتبة، وإصدار نظام التشغيل، رمز، وما إلى ذلك ربما نموذج التعليمات البرمجية؟

إذا أتذكر الكتب التي قرأتها، إذا قمت بتعيين العلم على مأخذ، والتي سوف تؤثر على كل مخططات المرسلة من مأخذ، لأن المقبس هو في الأساس بنية بيانات الأعلام شبكة + واصف الملف.

لقد اكتشفت نفس المشكلة على نظام Linux بشأن وجود مأخذ توصيل يحصل على البث الأحادي والبث في نفس الوقت.لقد قمت بحل المشكلة على النحو التالي (الرمز الزائف):

  1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • افتح المقبس
  2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
    • يسمح بالبث الوارد والصادر من هذا المقبس
  3. bind(sock, bindaddr, sizeof(struct sockaddr) مع

bindaddr.sin_family = AF_INET

bindaddr.sin_port = <YourPort>

bindaddr.sin_addr.s_addr = INADDR_ANY

  • احصل على جميع الرسائل الواردة على أي بطاقة ل <YourPort>

التحذير هو أنه لا يوجد تصفية (انظر التحذير في 3.).لذلك سوف تحصل على جميع الرسائل.تكون الرسائل المرسلة إما أحادية البث أو يتم بثها اعتمادًا على العنوان المحدد في sendto().

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