هل GethostbyName مضمون لإرجاع الهياكل العظمية مع عناوين IPv4؟
-
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 هو طول عنوان "كل".