كيف يمكنني العثور على اسم المضيف الجهاز الحالي الكامل في C (المضيف ومعلومات المجال)؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

في مشروع C (POSIX)، كيف يمكنني الحصول على اسم مؤهل بشكل كامل للنظام الحالي؟

وعلى سبيل المثال، ويمكنني أن مجرد الحصول على اسم المضيف من الجهاز الخاص بي عن طريق القيام gethostname() من unistd.h. قد يعطي هذا لي machine3 في العودة، ولكن أنا فعلا تبحث عن machine3.somedomain.com على سبيل المثال.

وكيف أذهب حول الحصول على هذه المعلومات؟ أنا لا أريد أن استخدام المكالمة إلى نظام () للقيام بذلك، إذا كان ذلك ممكنا.

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

المحلول

لتحصل على اسم مؤهل بشكل كامل لجهاز، يجب علينا أولا الحصول على اسم المضيف المحلي، ومن ثم البحث الاسم المقبول.

وأسهل طريقة للقيام بذلك هو عن طريق الحصول على أول اسم المضيف المحلي باستخدام uname() أو gethostname() ثم إجراء بحث مع gethostbyname() والنظر إلى عضو h_name من البنية فإنها ترجع. إذا كنت تستخدم ANSI ج، كنت <م> يجب استخدام uname() بدلا من gethostname().

مثال:

char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
printf("Hostname: %s\n", hostname);
struct hostent* h;
h = gethostbyname(hostname);
printf("h_name: %s\n", h->h_name);

ولسوء الحظ، تم إهمال gethostbyname() في مواصفات POSIX الحالية، لأنه لا يلعب بشكل جيد مع الإصدار IPv6. سيكون هناك نسخة أكثر حداثة من هذا الرمز استخدام getaddrinfo().

مثال:

struct addrinfo hints, *info, *p;
int gai_result;

char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; /*either IPV4 or IPV6*/
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME;

if ((gai_result = getaddrinfo(hostname, "http", &hints, &info)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gai_result));
    exit(1);
}

for(p = info; p != NULL; p = p->ai_next) {
    printf("hostname: %s\n", p->ai_canonname);
}

freeaddrinfo(info);

وبطبيعة الحال، هذا العمل إلا إذا كان الجهاز يحتوي على FQDN لإعطاء - إن لم يكن، نتيجة getaddrinfo() ينتهي به الأمر إلى نفس اسم المضيف غير المشروط

نصائح أخرى

وبلدي الحل:

#ifdef WIN32
    #include <Windows.h>
    #include <tchar.h>
#else
    #include <unistd.h>
#endif

void GetMachineName(char machineName[150])
{
    char Name[150];
    int i=0;

    #ifdef WIN32
        TCHAR infoBuf[150];
        DWORD bufCharCount = 150;
        memset(Name, 0, 150);
        if( GetComputerName( infoBuf, &bufCharCount ) )
        {
            for(i=0; i<150; i++)
            {
                Name[i] = infoBuf[i];
            }
        }
        else
        {
            strcpy(Name, "Unknown_Host_Name");
        }
    #else
        memset(Name, 0, 150);
        gethostname(Name, 150);
    #endif
    strncpy(machineName,Name, 150);
}

وgethostname() طريقة POSIX للحصول على اسم المضيف المحلي. تحقق من man.

وBSD ظيفة getdomainname() يمكن أن تعطيك اسم النطاق حتى تتمكن من بناء اسم مضيف مؤهل بشكل كامل. لا توجد وسيلة POSIX للحصول على نطاق وأخشى.

وأعتقد كنت تبحث عن:

gethostbyaddress

ومجرد تمريرها IP المضيف المحلي.

وهناك أيضا الدالة gethostbyname، وهذا هو أيضا من المفيد.

وطريقة سهلة، حاول uname ()

إذا لم يفلح ذلك، استخدم gethostname () ثم ل gethostbyname ()، وأخيرا gethostbyaddr ()

ويجب أن يكون h_name من hostent {} FQDN الخاص

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