سؤال

أحاول ترحيل بعض التعليمات البرمجية من Windows 32 بت (XP و Server 2003) إلى Windows 7 بت 64 بت ، وأنا أواجه مشكلة غريبة مع GethostbyName.

أنا أفعل شيئًا كهذا:

struct hostent *hp;
hp = gethostbyname( host );

بعد مكالمة إلى gethostbyname ، المؤشر hp-> h_addr_list غير صالح. إنه يحتوي على جميع الأرقام الصحيحة ، ولكن يبدو أن مؤشر 32 بت محشوة في الفضاء الخاطئ بطريقة أو بأخرى.

على سبيل المثال ، ما أحصل عليه

hp-> h_addr_list = 0x0064bdd800000000

إذا قمت بتبديل النصف الأول والأخير يدويًا بحيث يكون HP-> H_ADDR_LIST = 0x00000000000064BDD8 ، فإن المؤشر صالح ويشير إلى البيانات الصحيحة.

أحيانًا أحصل على BAADF00D بدلاً من الأصفار أيضًا (أي HP-> H_ADDR_LIST = 0x0064BDD8BAADF00D) ،

بقدر ما أستطيع أن أقول أن كل شيء مرتبط بالإصدار الصحيح 64 بت من مكتبات Winsock ، لذلك لست متأكدًا من ما يمكن أن يسبب هذا النوع من المشكلة.

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

المحلول

قد ترغب في محاولة استخدام getaddrinfo() في حين أن . ال مستندات لـ gethostbyname أوضح أن استخدامه قد تم إحباطه وأنه تم إهماله الآن (لذلك قد يكون هناك أخطاء فيه). لم يكن لدي أي خبرة في المشكلة التي تواجهها ولكني أعلم أن الكود الذي لدي يستخدم getaddrinfo() يعمل بشكل جيد عبر XP عبر Windows 7 على X86 و X64.

نصائح أخرى

BAADF00D يستخدم من قبل Microsoft للإشارة إلى ذاكرة الكومة غير المخصصة غير المخصصة ، لذلك ربما يكون التخلص من ذلك فكرة جيدة. اختبار للتأكد.

بقدر تبديل البتات العالية والمنخفضة ، حقك ، فقد تم وضعه في المكان الخطأ. خلل برمجي؟

واجهت نفس القضية. كانت المشكلة أنه في إعدادات المشروع ، تم تعيين خيار محاذاة عضو الهيكل على 4 بايت (/ZP4). لقد عدت هذا الخيار إلى الافتراضي وهذا حل المشكلة.

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