inet_pton(3)

الاسم
inet_pton - تحويل عناوين IPv4 و IPv6 من نص إلى شكل ثنائي

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <arpa/inet.h>

int inet_pton(int af, const char *restrict src, void *restrict dst);

الوصف
تحوّل هذه الدالة سلسلة المحارف src إلى بنية عنوان شبكة في عائلة العناوين af، ثم تنسخ بنية عنوان الشبكة إلى dst. يجب أن تكون وسيطة af إما AF_INET أو AF_INET6. يُكتب dst بترتيب البايت الشبكي.

عناوين العائلات التالية مدعومة حالياً:

AF_INET
    يشير src إلى سلسلة محارف تحتوي على عنوان شبكة IPv4 بتنسيق عشري منقوط، "ddd.ddd.ddd.ddd"، حيث ddd هو رقم عشري يصل إلى ثلاثة أرقام في النطاق 0 إلى 255. يُحوَّل العنوان إلى struct in_addr ويُنسخ إلى dst، الذي يجب أن يكون طوله sizeof(struct in_addr) (4) بايت (32 بت).

AF_INET6
    يشير src إلى سلسلة محارف تحتوي على عنوان شبكة IPv6. يُحوَّل العنوان إلى struct in6_addr ويُنسخ إلى dst، الذي يجب أن يكون طوله sizeof(struct in6_addr) (16) بايت (128 بت). تتبع التنسيقات المسموح بها لعناوين IPv6 هذه القواعد:

    •   التنسيق المفضل هو x:x:x:x:x:x:x:x. يتكون هذا الشكل من ثمانية أرقام ست عشرية، كل منها يعبر عن قيمة 16 بت (أي كل x يمكن أن يصل إلى 4 أرقام ست عشرية).

    •   يمكن اختصار سلسلة من القيم الصفرية المتجاورة في التنسيق المفضل إلى ::. يمكن أن يحدث مثيل واحد فقط من :: في العنوان. على سبيل المثال، يمكن اختصار عنوان الاسترجاع 0:0:0:0:0:0:0:1 كـ ::1. يمكن كتابة عنوان البدل، المكون من جميع الأصفار، كـ ::.

    •   التنسيق البديل مفيد للتعبير عن عناوين IPv6 المعينة بـ IPv4. يُكتب هذا الشكل كـ x:x:x:x:x:x:d.d.d.d، حيث الستة xs الرائدة هي قيم ست عشرية تحدد الأجزاء الستة الأكثر أهمية من 16 بت من العنوان (أي 96 بت)، وتعبر ds عن قيمة بتدوين عشري منقوط تحدد أقل 32 بت أهمية من العنوان. مثال على هذا العنوان هو ::FFFF:204.152.189.116.

    انظر RFC 2373 لمزيد من التفاصيل حول تمثيل عناوين IPv6.

قيمة الإرجاع
تُرجع inet_pton() 1 عند النجاح (تم تحويل عنوان الشبكة بنجاح). تُرجع 0 إذا كان src لا يحتوي على سلسلة محارف تمثل عنوان شبكة صالح في عائلة العنوان المحددة. إذا كان af لا يحتوي على عائلة عنوان صالحة، تُرجع -1 ويُضبط errno على EAFNOSUPPORT.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
inet_pton() | سلامة الخيوط | المنطقة (locale) آمنة لتعدد المسالك (MT-Safe)

الإصدارات
على عكس inet_aton(3) و inet_addr(3)، تدعم inet_pton() عناوين IPv6. من ناحية أخرى، تقبل inet_pton() فقط عناوين IPv4 بالتدوين العشري المنقوط، بينما تسمح inet_aton(3) و inet_addr(3) بالتدوين الأكثر عمومية للأرقام والنقاط (تنسيقات الأرقام الست عشرية والثمانية، والتنسيقات التي لا تتطلب كتابة جميع البايتات الأربعة صراحة). لواجهة تتعامل مع كل من عناوين IPv6 وعناوين IPv4 بتدوين الأرقام والنقاط، انظر getaddrinfo(3).

المعايير
POSIX.1-2008.

التاريخ
POSIX.1-2001.

العلل
لا يتعرف AF_INET6 على عناوين IPv4. يجب توفير عنوان IPv6 معين بـ IPv4 صريح في src بدلاً من ذلك.

أمثلة
يوضح البرنامج أدناه استخدام inet_pton() و inet_ntop(3). فيما يلي بعض الأمثلة على التشغيل:

    $ ./a.out i6 0:0:0:0:0:0:0:0
    ::
    $ ./a.out i6 1:0:0:0:0:0:0:8
    1::8
    $ ./a.out i6 0:0:0:0:0:FFFF:204.152.189.116
    ::ffff:204.152.189.116

  مصدر البرنامج
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define streq(...)  (strcmp(__VA_ARGS__) == 0)

    int
    main(int argc, char *argv[])
    {
        unsigned char buf[sizeof(struct in6_addr)];
        int domain, s;
        char str[INET6_ADDRSTRLEN];

        if (argc != 3) {
            fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        domain = streq(argv[1], "i4") ? AF_INET :
                 streq(argv[1], "i6") ? AF_INET6 : atoi(argv[1]);

        s = inet_pton(domain, argv[2], buf);
        if (s <= 0) {
            if (s == 0)
                fprintf(stderr, "Not in presentation format");
            else
                perror("inet_pton");
            exit(EXIT_FAILURE);
        }

        if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) {
            perror("inet_ntop");
            exit(EXIT_FAILURE);
        }

        printf("%s\n", str);

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
getaddrinfo(3), inet(3), inet_ntop(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.