socket(2)

الاسم
socket - إنشاء نقطة نهاية للاتصال

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

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

int socket(int domain, int type, int protocol);

الوصف
تنشئ socket() نقطة نهاية للاتصال وتُعيد واصف ملف يشير إلى تلك النقطة. سيكون واصف الملف المُعاد من استدعاء ناجح هو واصف الملف ذو الرقم الأصغر غير المفتوح حالياً للعملية.

يُحدد الوسيط domain نطاق اتصال؛ يختار هذا عائلة البروتوكول التي ستُستخدم للاتصال. تُعرّف هذه العائلات في <sys/socket.h>. تتضمن الصيغ التي يفهمها نواة لينكس حالياً:
الاسم | الغرض | صفحة دليل
AF_UNIX | اتصال محلي | unix(7)
AF_LOCAL | مرادف AF_UNIX |
AF_INET | بروتوكولات الإنترنت IPv4 | ip(7)
AF_AX25 | بروتوكول الراديو الهاوي AX.25 | ax25(4)
AF_IPX | IPX - بروتوكولات Novell |
AF_APPLETALK | AppleTalk | ddp(7)
AF_X25 | بروتوكول ITU-T X.25 / ISO/IEC 8208 | x25(7)
AF_INET6 | بروتوكولات الإنترنت IPv6 | ipv6(7)
AF_DECnet | مقابس بروتوكول DECet
AF_KEY | بروتوكول إدارة المفاتيح، طُوّر أصلاً للاستخدام مع IPsec
AF_NETLINK | جهاز واجهة مستخدم النواة | netlink(7)
AF_PACKET | واجهة حزم منخفضة المستوى | packet(7)
AF_RDS | بروتوكول مقابس البيانات الموثوقة (RDS) | rds(7) rds-rdma(7)
AF_PPPOX | طبقة نقل PPP عامة، لإعداد أنفاق L2 (L2TP و PPPoE)
AF_LLC | بروتوكول التحكم بالارتباط المنطقي (IEEE 802.2 LLC)
AF_IB | عنونة InfiniBand الأصلية
AF_MPLS | تبديل الوسوم متعدد البروتوكولات
AF_CAN | بروتوكول ناقل شبكة منطقة التحكم للسيارات
AF_TIPC | بروتوكول TIPC، "مقابس المجال العنقودي"
AF_BLUETOOTH | بروتوكول مقبس بلوتوث منخفض المستوى
AF_ALG | واجهة إلى واجهة برمجة التشفير للنواة
AF_VSOCK | بروتوكول VSOCK (في الأصل "VMWare VSockets") لاتصال المشرف الضيفي | vsock(7)
AF_KCM | واجهة KCM (مُضاعف اتصال النواة)
AF_XDP | واجهة XDP (مسار البيانات السريع)

يمكن العثور على تفاصيل إضافية لعوائل العناوين المذكورة أعلاه، بالإضافة إلى معلومات عن عدة عوائل عناوين أخرى، في address_families(7).

للمقبس نوع محدد، والذي يحدد دلالات الاتصال. الأنواع المعرفة حالياً هي:

SOCK_STREAM
    يوفر تيارات بايت متسلسلة، موثوقة، ثنائية الاتجاه، قائمة على الاتصال. قد تكون آلية نقل بيانات خارج النطاق مدعومة.

SOCK_DGRAM
    يدعم الرزم (رسائل غير متصلة، غير موثوقة ذات طول أقصى ثابت).

SOCK_SEQPACKET
    يوفر مسار نقل بيانات متسلسل، موثوق، ثنائي الاتجاه قائم على الاتصال لرزم ذات طول أقصى ثابت؛ يُطلب من المستهلك قراءة رزمة كاملة مع كل استدعاء نظام إدخال.

SOCK_RAW
    يوفر وصولاً خاماً لبروتوكول الشبكة.

SOCK_RDM
    يوفر طبقة رزم موثوقة لا تضمن الترتيب.

SOCK_PACKET
    مهمل ويجب عدم استخدامه في البرامج الجديدة؛ انظر packet(7).

قد لا تُنفذ بعض أنواع المقابس بواسطة جميع عوائل البروتوكولات.

منذ لينكس 2.6.27، يخدم وسيط النوع غرضاً ثانياً: بالإضافة إلى تحديد نوع مقبس، قد يتضمن OR أحادي البت لأي من القيم التالية، لتعديل سلوك socket():

SOCK_NONBLOCK
    اضبط علامة حالة الملف O_NONBLOCK على وصف الملف المفتوح (انظر open(2)) المشار إليه بواسطة واصف الملف الجديد. استخدام هذه العلامة يوفر استدعاءات إضافية لـ fcntl(2) لتحقيق النتيجة نفسها.

SOCK_CLOEXEC
    اضبط علامة الإغلاق عند التنفيذ (FD_CLOEXEC) على واصف الملف الجديد. انظر وصف العلامة O_CLOEXEC في open(2) للأسباب التي تجعل هذا مفيدًا.

يحدد البروتوكول بروتوكولاً معيناً لاستخدامه مع المقبس. عادةً يوجد بروتوكول واحد فقط لدعم نوع مقبس معين ضمن عائلة بروتوكول معينة، وفي هذه الحالة يمكن تحديد البروتوكول كـ 0. ومع ذلك، من الممكن وجود العديد من البروتوكولات، وفي هذه الحالة يجب تحديد بروتوكول معين بهذه الطريقة. رقم البروتوكول المراد استخدامه خاص بـ "مجال الاتصال" الذي سيتم فيه الاتصال؛ انظر protocols(5). انظر getprotoent(3) حول كيفية تعيين سلاسل أسماء البروتوكولات إلى أرقام البروتوكولات.

مقابس من نوع SOCK_STREAM هي تيارات بايت ثنائية الاتجاه كاملة. لا تحافظ على حدود السجلات. يجب أن يكون مقبس التيار في حالة متصل قبل أن يمكن إرسال أو استقبال أي بيانات عليه. يُنشأ اتصال بمقبس آخر باستدعاء connect(2). بمجرد الاتصال، يمكن نقل البيانات باستخدام استدعاءات read(2) و write(2) أو بعض المتغيرات من استدعاءات send(2) و recv(2). عند اكتمال جلسة، يمكن تنفيذ close(2). يمكن أيضًا نقل البيانات خارج النطاق كما هو موصوف في send(2) واستقبالها كما هو موصوف في recv(2).

تضمن بروتوكولات الاتصال التي تنفذ SOCK_STREAM عدم فقدان البيانات أو تكرارها. إذا تعذر إرسال قطعة بيانات تتوفر لها مساحة مخزن مؤقت في بروتوكول النظير بنجاح خلال فترة زمنية معقولة، فإن الاتصال يُعتبر ميتاً. عند تمكين SO_KEEPALIVE على المقبس، يتحقق البروتوكول بطريقة خاصة بالبروتوكول مما إذا كان الطرف الآخر لا يزال حياً. تُثار إشارة SIGPIPE إذا أرسلت أو استقبلت عملية على تيار مكسور؛ يتسبب هذا في خروج العمليات الساذجة التي لا تعالج الإشارة. تستخدم مقابس SOCK_SEQPACKET نفس استدعاءات النظام مثل مقابس SOCK_STREAM. الفرق الوحيد هو أن استدعاءات read(2) ستعيد فقط كمية البيانات المطلوبة، وسيتم تجاهل أي بيانات متبقية في الرزمة الواردة. كما يتم الحفاظ على جميع حدود الرسائل في الرزم الواردة.

تسمح مقابس SOCK_DGRAM و SOCK_RAW بإرسال رزم إلى المراسلين المذكورين في استدعاءات sendto(2). تُستقبل الرزم عموماً باستخدام recvfrom(2)، والذي يعيد الرزمة التالية مع عنوان مرسلها.

SOCK_PACKET هو نوع مقبس مهمل لاستقبال رزم خام مباشرة من برنامج تشغيل الجهاز. استخدم packet(7) بدلاً من ذلك.

يمكن استخدام عملية fcntl(2) F_SETOWN لتحديد عملية أو مجموعة عمليات لتلقي إشارة SIGURG عند وصول البيانات خارج النطاق أو إشارة SIGPIPE عند انقطاع اتصال SOCK_STREAM بشكل غير متوقع. يمكن أيضًا استخدام هذه العملية لتعيين العملية أو مجموعة العمليات التي تستقبل الإدخال/الإخراج والإشعار غير المتزامن لأحداث الإدخال/الإخراج عبر SIGIO. استخدام F_SETOWN يعادل استدعاء ioctl(2) مع وسيط FIOSETOWN أو SIOCSPGRP.

عندما تشير الشبكة إلى حالة خطأ لوحدة البروتوكول (مثلاً، باستخدام رسالة ICMP لـ IP) يتم تعيين علم الخطأ المعلق للمقبس. ستعيد العملية التالية على هذا المقبس رمز الخطأ للخطأ المعلق. بالنسبة لبعض البروتوكولات، من الممكن تمكين قائمة انتظار أخطاء لكل مقبس لاسترجاع معلومات مفصلة عن الخطأ؛ انظر IP_RECVERR في ip(7).

يتم التحكم في تشغيل المقابس بواسطة خيارات على مستوى المقبس. تُعرف هذه الخيارات في <sys/socket.h>. تُستخدم الدالتان setsockopt(2) و getsockopt(2) لتعيين الخيارات والحصول عليها.

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

الأخطاء

EACCES
    يُرفض الإذن لإنشاء مقبس من النوع و/أو البروتوكول المحدد.

EAFNOSUPPORT
    التنفيذ لا يدعم عائلة العناوين المحددة.

EINVAL
    بروتوكول غير معروف، أو عائلة بروتوكول غير متوفرة.

EINVAL
    أعلام غير صالحة في type.

EMFILE
    وُصل إلى الحد الأقصى لواصفات الملفات المفتوحة لكل عملية.

ENFILE
    وُصل إلى الحد الأقصى لإجمالي عدد الملفات المفتوحة على مستوى النظام.

ENOBUFS أو ENOMEM
    ذاكرة غير كافية متوفرة. لا يمكن إنشاء المقبس حتى يتم تحرير موارد كافية.

EPROTONOSUPPORT
    نوع البروتوكول أو البروتوكول المحدد غير مدعوم ضمن هذا النطاق.

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

الإصدارات
يحدد POSIX.1-2024 SOCK_CLOFORK، لكن لينكس لا يدعمه.

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

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

إنه قابل للنقل عموماً من/إلى الأنظمة غير التابعة لـ BSD التي تدعم نسخاً من طبقة مقابس BSD (بما في ذلك متغيرات System V).

الثوابت الظاهرية المستخدمة تحت 4.x BSD لعائلات البروتوكولات هي PF_UNIX و PF_INET وهكذا، بينما تُستخدم AF_UNIX و AF_INET وهكذا لعائلات العناوين. ومع ذلك، يعد دليل BSD بالفعل: "عائلة البروتوكول هي نفسها عائلة العنوان بشكل عام"، والمعايير اللاحقة تستخدم AF_* في كل مكان.

SOCK_NONBLOCK
SOCK_CLOEXEC
    POSIX.1-2024.

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

انظر أيضًا
accept(2)، bind(2)، close(2)، connect(2)، fcntl(2)، getpeername(2)، getsockname(2)، getsockopt(2)، ioctl(2)، listen(2)، read(2)، recv(2)، select(2)، send(2)، shutdown(2)، socketpair(2)، write(2)، getprotoent(3)، address_families(7)، ip(7)، socket(7)، tcp(7)، udp(7)، unix(7)

“دروس تمهيدية في الاتصال بين العمليات لنظام 4.3BSD” و“دروس الاتصال بين العمليات لنظام BSD”، معاد طباعتها في الوثائق التكميلية لمبرمجي يونكس المجلد 1.

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

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

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