לינוקס: מה ההבדל בין socketpair () לבין socket ()?


תשובה 1:

שקעי יוניקס הם בדיוק כמו FIFOs דו כיווניים. עם זאת, כל תקשורת הנתונים תתבצע דרך ממשק השקעים, ולא דרך ממשק הקבצים. למרות ששקעי יוניקס הם קובץ מיוחד במערכת הקבצים (ממש כמו FIFOs), לא תשתמש בקריאה פתוחה () וקריאה () - תשתמש בשקע (), bind (), recv () וכו '.

לדוגמה, כשאתה מתאר באיזה שקע Unix אתה רוצה להשתמש (כלומר, הנתיב לקובץ המיוחד שהוא השקע), אתה משתמש ב- sockaddr_un

struct sockaddr_un {לא חתום sun_family; / * AF_UNIX * / char sun_path [108];}

זהו המבנה שתעבור לפונקציית bind (), אשר משייכת מתאר שקעים (מתאר קבצים) לקובץ מסוים (השם שלו נמצא בשדה שביל sun_).

שקעי שקע הם שקעים AF_UNIX רגילים, מה שאומר שניתן להעביר עליהם הודעות נלוות כמו SCM_RIGHTS ו- SCM_CREDENTIALS.

אם רצית צינור (), אך רצית להשתמש בצינור בודד כדי לשלוח ולקבל נתונים משני הצדדים? מכיוון שצינורות אינם כיווניים (עם חריגים ב- SYSV), אינכם יכולים לעשות זאת! אולם יש פיתרון: השתמש בשקע תחום של יוניקס, מכיוון שהם יכולים להתמודד עם נתונים דו כיווניים.

יש יופי של שיחת מערכת המכונה socketpair () זה נחמד מספיק כדי להחזיר לך זוג שקעים שכבר מחוברים

if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) == -1) {perror ("socketpair"); יציאה (1); }