bind(2)

الاسم
bind - ربط اسم بمقبس

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

موجز
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr,
         socklen_t addrlen);

الوصف
عند إنشاء مقبس باستخدام socket(2)، فإنه يوجد في فضاء أسماء (عائلة عناوين) ولكن لا يوجد عنوان مخصص له. تقوم bind() بتعيين العنوان المحدد بواسطة addr للمقبس المشار إليه بواصف الملف sockfd. يحدد addrlen الحجم بالبايت لبنية العنوان المشار إليها بواسطة addr. تقليدياً، تسمى هذه العملية “تعيين اسم لمقبس”.

من الضروري عادةً تعيين عنوان محلي باستخدام bind() قبل أن يتمكن مقبس SOCK_STREAM من استقبال الاتصالات (انظر accept(2)).

تختلف القواعد المستخدمة في ربط الأسماء بين عائلات العناوين. راجع الإدخالات اليدوية في القسم 7 للحصول على معلومات مفصلة. بالنسبة لـ AF_INET، انظر ip(7)؛ لـ AF_INET6، انظر ipv6(7)؛ لـ AF_UNIX، انظر unix(7)؛ لـ AF_APPLETALK، انظر ddp(7)؛ لـ AF_PACKET، انظر packet(7)؛ لـ AF_X25، انظر x25(7)؛ ولـ AF_NETLINK، انظر netlink(7).

ستعتمد البنية الفعلية الممررة لوسيطة addr على عائلة العنوان. تُعرف بنية sockaddr بشيء مثل:

    struct sockaddr {
        sa_family_t sa_family;
        char        sa_data[14];
    }

الغرض الوحيد من هذه البنية هو تحويل مؤشر البنية الممرر في addr لتجنب تحذيرات المترجم. انظر الأمثلة أدناه.

قيمة الإرجاع
عند النجاح، يُعاد الصفر. وعند حدوث خطأ، يُعاد الرقم -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EACCES
    العنوان محمي، والمستخدم ليس المستخدم الفائق.

EADDRINUSE
    العنوان المعطى قيد الاستخدام بالفعل.

EADDRINUSE
    (مقابس نطاق الإنترنت) تم تحديد رقم المنفذ كصفر في بنية عنوان المقبس، ولكن عند محاولة الربط بمنفذ مؤقت، تبين أن جميع أرقام المنافذ في نطاق المنافذ المؤقتة قيد الاستخدام حالياً. انظر مناقشة /proc/sys/net/ipv4/ip_local_port_range ip(7).

EBADF
    sockfd ليس واصف ملف صالحاً.

EINVAL
    المقبس مربوط بالفعل بعنوان.

EINVAL
    addrlen خاطئ، أو addr ليس عنواناً صالحاً لنطاق هذا المقبس.

ENOTSOCK
    واصف الملف sockfd لا يشير إلى مقبس.

EADDRNOTAVAIL
    تم طلب واجهة غير موجودة أو العنوان المطلوب ليس محلياً.

الأخطاء التالية خاصة بمقابس نطاق UNIX (AF_UNIX):

EACCES
    أُذونات البحث مرفوضة في أحد مكونات بادئة المسار. (انظر أيضًا path_resolution(7).)

EFAULT
    يشير addr إلى خارج فضاء العناوين القابل للوصول من قبل المستخدم.

ELOOP
    تمت مصادفة عدد كبير جداً من الروابط الرمزية أثناء حل addr.

ENAMETOOLONG
    addr طويل جداً.

ENOENT
    مكون في بادئة الدليل لاسم مسار المقبس غير موجود.

ENOMEM
    ذاكرة النواة المتوفرة غير كافية.

ENOTDIR
    أحد مكونات بادئة المسار ليس دليلاً.

EROFS
    سيكون عقدة المقبس موجودة على نظام ملفات للقراءة فقط.

قد تتولد أخطاء أخرى بواسطة وحدات البروتوكول الأساسية.

الإصدارات
يجب أن تضمن البرامج القابلة للنقل أن addr.sun_path هي سلسلة منتهية بـ null لمقابس AF_UNIX.

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

التاريخ
POSIX.1-2001،‏ SVr4،‏ 4.2BSD.

العلل
خيارات الوكيل الشفاف غير موصوفة.

أمثلة
يمكن العثور على مثال لاستخدام bind() مع مقابس نطاق الإنترنت في getaddrinfo(3).

المثال التالي يوضح كيفية ربط مقبس دفق في نطاق UNIX (AF_UNIX)، وقبول الاتصالات:

    #include <err.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>

    #define MY_SOCK_PATH "/somepath"
    #define LISTEN_BACKLOG 50

    int
    main(void)
    {
        int                 sfd, cfd;
        socklen_t           peer_addr_size;
        struct sockaddr_un  my_addr, peer_addr;

        sfd = socket(AF_UNIX, SOCK_STREAM, 0);
        if (sfd == -1)
            err(EXIT_FAILURE, "socket");

        memset(&my_addr, 0, sizeof(my_addr));
        my_addr.sun_family = AF_UNIX;
        strncpy(my_addr.sun_path, MY_SOCK_PATH,
                sizeof(my_addr.sun_path) - 1);

        if (bind(sfd, (struct sockaddr *) &my_addr,
                 sizeof(my_addr)) == -1)
            err(EXIT_FAILURE, "bind");

        if (listen(sfd, LISTEN_BACKLOG) == -1)
            err(EXIT_FAILURE, "listen");

        /* الآن يمكننا قبول الاتصالات الواردة
           واحدة تلو الأخرى باستخدام accept(2). */

        peer_addr_size = sizeof(peer_addr);
        cfd = accept(sfd, (struct sockaddr *) &peer_addr,
                     &peer_addr_size);
        if (cfd == -1)
            err(EXIT_FAILURE, "accept");

        /* كود للتعامل مع الاتصال(ات) الواردة... */

        if (close(sfd) == -1)
            err(EXIT_FAILURE, "close");

        if (unlink(MY_SOCK_PATH) == -1)
            err(EXIT_FAILURE, "unlink");
    }

انظر أيضًا
accept(2), connect(2), getsockname(2), listen(2), socket(2), getaddrinfo(3), getifaddrs(3), ip(7), ipv6(7), path_resolution(7), socket(7), unix(7)

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

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

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