سؤال

لا أعرف كيف أكتب التطبيقات في 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.

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