سؤال
لا أعرف كيف أكتب التطبيقات في C ، لكنني بحاجة إلى برنامج صغير يقوم:
lh = gethostbyname("localhost");
output = lh->h_name;
متغير الإخراج هو طباعة.
يتم استخدام الرمز أعلاه في برنامج تشغيل قاعدة بيانات PHP MongoDB للحصول على اسم مضيف الكمبيوتر (اسم المضيف هو جزء من إدخال لإنشاء معرف فريد). أنا متشكك في أن هذا سيعيد اسم المضيف ، لذلك أود بعض الأدلة.
أي أمثلة رمز ستكون مفيدة للغاية.
يوم سعيد.
المحلول
#include <stdio.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
struct hostent *lh = gethostbyname("localhost");
if (lh)
puts(lh->h_name);
else
herror("gethostbyname");
return 0;
}
إنها ليست طريقة موثوقة للغاية لتحديد اسم المضيف ، على الرغم من أنها قد تعمل في بعض الأحيان. (ما الذي يعود يعتمد على كيفية /etc/hosts
ينصب). إذا كان لديك خط مثل:
127.0.0.1 foobar localhost
... ثم سيعود "Foobar". إذا كان لديك عكس ذلك ، وهو أمر شائع أيضًا ، فسيعود فقط "المضيف المحلي". طريقة أكثر موثوقية هي استخدام gethostname()
وظيفة:
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
int main(int argc, char *argv[])
{
char hostname[HOST_NAME_MAX + 1];
hostname[HOST_NAME_MAX] = 0;
if (gethostname(hostname, HOST_NAME_MAX) == 0)
puts(hostname);
else
perror("gethostname");
return 0;
}
نصائح أخرى
في C/UNIX ، سيكون المكافئ شيئًا مثل:
#include <stdio.h>
#include <netdb.h>
int main (int argc, char *argv[]) {
struct hostent *hstnm;
if (argc != 2) {
fprintf(stderr, "usage: %s hostname\n", argv[0]);
return 1;
}
hstnm = gethostbyname (argv[1]);
if (!hstnm)
return 1;
printf ("Name: %s\n", hstnm->h_name);
return 0;
}
والدليل على أنه يعمل:
$ hstnm localhost
Name: demon-a21pht
لكن جربها بنفسك. شريطة أن يكون لديك البيئة الصحيحة ، يجب أن تكون على ما يرام.
ما المشكله؟
h_name
الاسم الرسمي للمضيف (الكمبيوتر). إذا كان استخدام DNS أو نظام دقة مماثل ، فإن اسم المجال المؤهل بالكامل (FQDN) هو الذي تسبب في إرجاع الخادم للرد. إذا كان استخدام ملف المضيفين المحليين ، فهو الإدخال الأول بعد عنوان IPv4.