Scroll to navigation

bind(2) System Calls Manual 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 للإشارة إلى الخطأ.

الأخطاء

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

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

أُذونات البحث مرفوضة في أحد مكونات بادئة المسار. (انظر أيضًا path_resolution(7).)
يشير addr إلى خارج فضاء العناوين القابل للوصول من قبل المستخدم.
تمت مصادفة عدد كبير جداً من الروابط الرمزية أثناء حل addr.
addr طويل جداً.
مكون في بادئة الدليل لاسم مسار المقبس غير موجود.
ذاكرة النواة المتوفرة غير كافية.
أحد مكونات بادئة المسار ليس دليلاً.
سيكون عقدة المقبس موجودة على نظام ملفات للقراءة فقط.

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

الإصدارات

يجب أن تضمن البرامج القابلة للنقل أن 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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

8 فبراير 2026 صفحات دليل لينكس 6.18