connect(2)

الاسم
connect - بدء اتصال على مقبس

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

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

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

الوصف
استدعاء النظام connect() يصل المقبس المشار إليه بواصف الملف sockfd بالعنوان المحدد بواسطة addr. تحدد الوسيطة addrlen حجم addr. يُحدد تنسيق العنوان في addr بمساحة عنوان المقبس sockfd؛ انظر socket(2) لمزيد من التفاصيل.

إذا كان المقبس sockfd من النوع SOCK_DGRAM، فإن addr هو العنوان الذي تُرسل إليه الرزم البياناتية مبدئياً، والعنوان الوحيد الذي تُستقبل منه الرزم البياناتية. إذا كان المقبس من النوع SOCK_STREAM أو SOCK_SEQPACKET، يحاول هذا الاستدعاء إنشاء اتصال بالمقبس المرتبط بالعنوان المحدد بواسطة addr.

بعض مقابس البروتوكول (مثل مقابس التدفق في نطاق UNIX) قد تنجح connect() مرة واحدة فقط.

بعض مقابس البروتوكول (مثل مقابس الرزم البياناتية في نطاقي UNIX والإنترنت) قد تستخدم connect() عدة مرات لتغيير ارتباطها.

بعض مقابس البروتوكول (مثل مقابس TCP وكذلك مقابس الرزم البياناتية في نطاقي UNIX والإنترنت) قد تحل الارتباط بالاتصال بعنوان مع تعيين العضو sa_family من sockaddr إلى AF_UNSPEC؛ بعد ذلك، يمكن توصيل المقبس بعنوان آخر. (AF_UNSPEC مدعوم منذ Linux 2.2.)

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

الأخطاء
ما يلي هو أخطاء مقابس عامة فقط. قد توجد رموز خطأ أخرى خاصة بالنطاق.

EACCES
    لمقابس نطاق UNIX، التي تُعرف باسم المسار: يُرفض إذن الكتابة على ملف المقبس، أو يُرفض إذن البحث لأحد الدلائل في بادئة المسار. (انظر أيضًا path_resolution(7).)

EACCES
EPERM
    حاول المستخدم الاتصال بعنوان بث دون تمكين علم البث للمقبس أو فشل طلب الاتصال بسبب قاعدة جدار ناري محلي.

EACCES
    قد يُعاد أيضًا إذا رفضت سياسة SELinux اتصالاً (مثلاً، إذا كانت هناك سياسة تنص على أن وكيل HTTP يمكنه الاتصال فقط بالمنافذ المرتبطة بخوادم HTTP، ويحاول الوكيل الاتصال بمنفذ مختلف).

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

EADDRNOTAVAIL
    (مقابس نطاق الإنترنت) لم يسبق ربط المقبس المشار إليه بـ sockfd بعنوان، وعند محاولة ربطه بمنفذ مؤقت (ephemeral)، تبيّن أن جميع أرقام المنافذ في نطاق المنافذ المؤقتة قيد الاستخدام حالياً. راجع النقاش حول /proc/sys/net/ipv4/ip_local_port_range في ip(7).

EAFNOSUPPORT
    لم يكن للعنوان المُمرّر عائلة العنوان الصحيحة في حقل sa_family الخاص به.

EAGAIN
    لمقابس نطاق UNIX غير المحجوبة، المقبس غير محجوب، ولا يمكن إكمال الاتصال فوراً. لعائلات المقابس الأخرى، توجد إدخالات غير كافية في خبيئة التوجيه.

EALREADY
    المقبس غير محجوب ولم تُكمل محاولة الاتصال السابقة بعد.

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

ECONNREFUSED
    وجدت connect() على مقبس تدفق عدم وجود من يستمع على العنوان البعيد.

EFAULT
    عنوان بنية المقبس خارج مساحة عنوان المستخدم.

EINPROGRESS
    المقبس غير محجوب ولا يمكن إكمال الاتصال فوراً. (فشلت مقابس نطاق UNIX مع EAGAIN بدلاً من ذلك.) من الممكن استخدام select(2) أو poll(2) للانتظار حتى الإكمال باختيار المقبس للكتابة. بعد أن يشير select(2) إلى قابلية الكتابة، استخدم getsockopt(2) لقراءة خيار SO_ERROR على المستوى SOL_SOCKET لتحديد ما إذا كانت connect() قد اكتملت بنجاح (SO_ERROR هو صفر) أو دون نجاح (SO_ERROR هو أحد رموز الخطأ المعتادة المدرجة هنا، موضحاً سبب الفشل).

EINTR
    قُطع استدعاء النظام بإشارة تم التقاطها؛ انظر signal(7).

EISCONN
    المقبس متصل بالفعل.

ENETUNREACH
    الشبكة غير قابلة للوصول.

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

EPROTOTYPE
    نوع المقبس لا يدعم بروتوكول الاتصالات المطلوب. يمكن أن يحدث هذا الخطأ، مثلاً، عند محاولة توصيل مقبس رزم بياناتية في نطاق UNIX بمقبس تدفق.

ETIMEDOUT
    انتهاء المهلة أثناء محاولة الاتصال. قد يكون الخادم مشغولاً جداً لقبول اتصالات جديدة. لاحظ أنه لمقابس IP قد تكون المهلة طويلة جداً عند تمكين ملفات تعريف الارتباط المتزامنة على الخادم.

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

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

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

ملاحظات
إذا فشلت connect()، اعتبر حالة المقبس غير محددة. يجب على التطبيقات المحمولة إغلاق المقبس وإنشاء واحد جديد لإعادة الاتصال.

أمثلة
مثال على استخدام connect() موضح في getaddrinfo(3).

انظر أيضًا
accept(2), bind(2), getsockname(2), listen(2), socket(2), path_resolution(7), selinux(8)

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

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

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