هل GethostbyName مضمون لإرجاع الهياكل العظمية مع عناوين IPv4؟

StackOverflow https://stackoverflow.com/questions/2783581

  •  03-10-2019
  •  | 
  •  

سؤال

لا أستطيع استخدام getaddrinfo(...) لحل أسماء المضيف وبالتالي يجب أن تلتزم gethostbyname(...)

هل gethostbyname(...) الوظيفة مضمونة لإرجاع الهياكل العظمية التي تحتوي فقط على عناوين IPv4 (AF_INET) على النجاح ، بحيث يؤدي الكود التالي دائمًا إلى عنوان IPv4:

int resolve(const char *name, struct in_addr *addr) {

    struct hostent *he = gethostbyname(name);

    if (!he)
        return 1;

    memcpy(addr,he->h_addr_list[0],4);

    return 0;
}
هل كانت مفيدة؟

المحلول

رقم، gethostbyname() يمكن إرجاع IPv4 (النقطة القياسية) أو IPv6 (القولون القياسي ، أو ربما DOT) ، على الأقل على Linux. ستحتاج إلى التعامل مع ذلك. أعتقد أن التطبيقات المختلفة لها تُرجع فقط IPv4 (على سبيل المثال بي أتش بي) ، ولكن كل منصة C التي استخدمتها يمكنها وسيعود إلى حد سواء.

إذا كان تطبيقك IPv4 فقط ، فليس من الصعب للغاية معرفة أنك تتعامل مع IPv6 والخطأ إذا لم يكن لدى المستخدم واجهة مناسبة للاتصال بالمضيف عن بُعد. حتى لو كان تطبيقك يدعم كليهما ، فماذا يفعل المستخدم دعم البوابة؟

أكثر من ثلاثة . أو وجود : .. ITS ITS6.

يحرر

h_addr هو مرادف ل h_addrlist_[0], ، في حين h_length هو طول جميع العناوين.

ربما لا أفهم سؤالك بشكل كاف؟

نصائح أخرى

يخبرك H_ADDRTYPE إذا كان H_ADDR_LIST يحتوي على IPv4 أو IPv6 أو أنواع أخرى من العناوين. يمكنك استخدام مفتاح لتغيير السطر: memcpy (addr ، He-> h_addr_list [0] ، 4) ؛ إلى memcpy (addr ، He-> h_addr_list [0] ، n) ؛ حيث N هو الطول المطلوب لنوع العنوان. لكل وثائق MSDN ، H_Length هو طول عنوان "كل".

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