سؤال

أنا أعمل حاليا على UDP socket التطبيق و لا تحتاج إلى بناء في دعم بحيث IPV4 و IPV6 اتصالات يمكن إرسال الحزم إلى ملقم.

كنت آمل أن شخصا ما يمكن أن تساعدني و لي نقطة في الاتجاه الصحيح ؛ الغالبية العظمى من الوثائق التي وجدت لم تكن كاملة.سيكون من المفيد أيضا إذا كنت يمكن أن نشير أي خلافات بين Winsock و BSD مآخذ.

شكرا مقدما!

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

المحلول

أفضل نهج هو خلق IPv6 خادم مأخذ يمكن أن نقبل أيضا IPv4 اتصالات.أن تفعل ذلك ، إنشاء العادية IPv6 مأخذ ، بدوره قبالة خيار مأخذ IPV6_V6ONLY, ربط "أي" عنوان والبدء في تلقي.عناوين IPv4 سيتم عرض عناوين IPv6 ، IPv4 تعيينها تنسيق.

الفرق الرئيسي عبر الأنظمة سواء IPV6_V6ONLY هو a) المتاحة ، ب) تشغيل أو إيقاف تشغيله بشكل افتراضي.فإنه يتم إيقاف تشغيل بشكل افتراضي على لينكس (أيمما يسمح المزدوج كومة مآخذ دون setsockopt) و قيد على معظم الأنظمة الأخرى.

بالإضافة إلى ذلك ، IPv6 كومة على ويندوز XP لا يدعم هذا الخيار.في هذه الحالات, سوف تحتاج إلى إنشاء منفصلين خادم مآخذ ، ووضعها في تحديد أو في مواضيع متعددة.

نصائح أخرى

ويخضع API مأخذ من قبل المراجع IETF، وينبغي أن تكون هي نفسها في جميع المنصات بما فيها ويندوز WRT الإصدار IPv6.

لتطبيقات عناوين IPv4 / الإصدار IPv6 انها <م> ALL حول getaddrinfo() وgetnameinfo(). getaddrinfo هو عبقري - ينظر إلى DNS، أسماء الساحلية وقدرات العميل لحل مسألة الأبدي "يمكنني استخدام عناوين IPv4 و IPv6 أو كليهما للوصول إلى وجهة معينة؟" أو إذا كنت تسير في الطريق المزدوج المكدس و تريد أن تعود عناوين IPv6 تعيين عناوين IPv4، انها لن تفعل ذلك أيضا.

وويوفر بنية sockaddr * المباشر الذي يمكن توصيله إلى bind()، recvfrom()، sendto() والأسرة عنوان socket() ... وفي كثير من الحالات، وهذا يعني عدم وجود هياكل sockaddr_in(6) فوضوي لملء والتعامل معها.

لتطبيقات UDP سأكون حذرا حول إعداد مآخذ المزدوج كومة أو بصورة أعم، ملزمة لجميع واجهات (INADDR_ANY). قضية الكلاسيكية هي أنه عندما لا يتم تأمين عناوين أسفل (انظر bind()) إلى واجهات محددة والنظام لديه عدة طلبات واجهات، والاستجابات يجوز العبور من عناوين مختلفة لأجهزة الكمبيوتر مع عناوين متعددة تقوم على أهواء الجدول OS التوجيه، الخلط بين التطبيق بروتوكولات خاصة أي الأنظمة مع متطلبات المصادقة.

لتطبيقات UDP حيث هذه ليست مشكلة، أو TCP، يمكن مآخذ كومة مزدوجة يوفر الكثير من الوقت عندما IPV * -enabling النظام الخاص بك. يجب على المرء أن يكون حريصا على عدم الاعتماد كليا على ثنائي كومة حيث سيصدره ليس ضروريا على الاطلاق كما أن هناك أي نقص في منصات معقولة (قديم لينكس، BSD، ويندوز 2003) نشرت مع الإصدار IPv6 المداخن يست قادرة على مآخذ كومة مزدوجة.

ولقد لعب مع هذا تحت ويندوز، وأنه في الواقع لا يبدو أن قضية الأمن هناك، إذا كنت ربط عنوان الاسترجاع ثم لا بد المقبس ب IPv6 بشكل صحيح ل[:: 1] ولكن المقبس عناوين IPv4 المعين هو منضمة إلى INADDR_ANY، لذلك لديك (المفترض) يتعرض التطبيق بأمان المحلية فقط في الواقع إلى العالم.

المراجع لا حقا تحديد وجود IPV6_V6ONLY مأخذ الخيار, لكن إذا كان غائبا المراجع واضحة جدا أن التنفيذ يجب أن يكون كما لو أن هذا الخيار هو زائف.

حيث الخيار هو الحاضر ، أنا أزعم أنه يجب الافتراضي كاذبة ، ولكن لأسباب عابرة الفهم ، BSD و تطبيقات ويندوز الافتراضي إلى TRUE.هناك غريبة تدعي أن هذا القلق لأنه غير عارف IPv6 مبرمج يمكن ربط التفكير في أنها ملزمة فقط IN6ADDR_ANY فقط و IPv6 عن طريق الخطأ قبول IPv4 اتصال يسبب مشكلة أمنية.أعتقد أن هذا هو على حد سواء بعيدة المنال وسخيف بالإضافة إلى مفاجأة لأحد توقع متوافقة مع RFC التنفيذ.

في حالة ويندوز غير compiance وعادة لا تكون مفاجأة.في حالة BSD, وهذا أمر مؤسف في أحسن الأحوال.

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