كيف يمكنني العثور على اسم المضيف الجهاز الحالي الكامل في C (المضيف ومعلومات المجال)؟
-
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 للحصول على نطاق وأخشى.
وأعتقد كنت تبحث عن:
ومجرد تمريرها IP المضيف المحلي.
وهناك أيضا الدالة gethostbyname، وهذا هو أيضا من المفيد.
وطريقة سهلة، حاول uname ()
إذا لم يفلح ذلك، استخدم gethostname () ثم ل gethostbyname ()، وأخيرا gethostbyaddr ()
ويجب أن يكون h_name من hostent {} FQDN الخاص