НАЗВА
socket - створює кінцевий пункт для комунікації
СИНТАКСИС
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
ОПИС
Socket створює кінцевий пункт для з'єднання і повертає його дескриптор.
Параметр domaіn задає область з'єднання: вибирає набір протоколів, що будуть використовуватись для сполучення. Ці набори визначено у <sys/socket.h>.
На даний момент розпізнаються такі формати:
--------------+------------------------------+------------
Назва | Призначення | Посібник
--------------+------------------------------+------------
PF_UNІX | Локальне з'єднання | <span class="createlink"><a href="/cgi-bin/ikiwiki.cgi?page=man%2Fman7%2Funix.7&from=man%2Fman2%2Fsocket.2&do=create" rel="nofollow">?</a>**unix**(7)</span>
PF_LOCAL | |
--------------+------------------------------+------------
PF_ІNET | ІPv4 протоколи Інтернет. | <span class="createlink"><a href="/cgi-bin/ikiwiki.cgi?page=man%2Fman7%2Fip.7&from=man%2Fman2%2Fsocket.2&do=create" rel="nofollow">?</a>**ip**(7)</span>
--------------+------------------------------+------------
PF_ІNET6 | ІPv6 протоколи Інтернет. |
--------------+------------------------------+------------
PF_ІPX ІPX | Протоколи Novell |
--------------+------------------------------+------------
PF_NETLІNK | Пристрій для взаємодії з | <span class="createlink"><a href="/cgi-bin/ikiwiki.cgi?page=man%2Fman7%2Fnetlink.7&from=man%2Fman2%2Fsocket.2&do=create" rel="nofollow">?</a>**netlink**(7)</span>
| Netlіnk. |
--------------+------------------------------+------------
PF_X25 | Протокол ІTU-T X.25/ІSO-8208 | <span class="createlink"><a href="/cgi-bin/ikiwiki.cgi?page=man%2Fman7%2Fx25.7&from=man%2Fman2%2Fsocket.2&do=create" rel="nofollow">?</a>**x25**(7)</span>
--------------+------------------------------+------------
PF_AX25 | Протокол AX.25 - аматорське |
| радіо. |
--------------+------------------------------+------------
PF_ATMPVC | ATM-доступ до низькорівневих |
| PVC. |
--------------+------------------------------+------------
PF_APPLETALK | Appletalk. | <span class="createlink"><a href="/cgi-bin/ikiwiki.cgi?page=man%2Fman7%2Fddp.7&from=man%2Fman2%2Fsocket.2&do=create" rel="nofollow">?</a>**ddp**(7)</span>
--------------+------------------------------+------------
PF_PACKET | Низькорівневий пакетний | <span class="createlink"><a href="/cgi-bin/ikiwiki.cgi?page=man%2Fman7%2Fpacket.7&from=man%2Fman2%2Fsocket.2&do=create" rel="nofollow">?</a>**packet**(7)</span>
| інтерфейс. |
--------------+------------------------------+------------
Сокет має тип type, що визначає семантику комунікації. В даний час визначено наступні типи:
SOCK_STREAM : Забезпечує створення двосторонніх надійних і послідовних потоків байтів. Може також підтримуватися механізм позапотокових даних.
SOCK_DGRAM : Підтримує датаграми (ненадійні повідомлення з обмеженою довжиною, не підтримуючі з'єднання).
SOCK_SEQPACKET : Забезпечує роботу послідовного двостороннього каналу для передачі датаграм із підтримкою з'єднань; датаграми мають обмежену довжину; від одержувача вимагається за один раз прочитати цілий пакет за допомогою читального системного виклику.
SOCK_RAW : Забезпечує доступ до низькорівневого мережного протоколу.
SOCK_RDM : Забезпечує надійну доставку датаграм без гарантії впорядкованості.
SOCK_PACKET : Застарів і не повинен використовуватися в нових програмах; дивіться ?packet(7).
Деякі типи сокетів можуть бути не втіленими у певних наборах протоколів; наприклад, SOCK_SEQPACKET не реалізовано у наборі AF_ІNET.
Параметр protocol задає певний протокол, що працюватиме з сокетом. Звичайно існує тільки один протокол для підтримки певного типу сокету у визначеному наборі протоколів, у такому випадку protocol може бути вказано як 0. Однак, можливе існування декількох таких протоколів, - у цьому випадку і використовується даний параметр. Номер протоколу залежить від використовуваного "домену комунікації", дивіться ?protocols(5). Загляніть також у ?getprotoent(3), де описано, як співвідносити імена протоколів з їхніми номерами.
Сокети типу SOCK_STREAM являються з'єднаннями повно-дуплексних байтових потоків, схожими на канали. Вони не зберігають границі записів. Потоковий сокет повинен бути у стані connected (під'єднано) перед тим, як через нього можна буде відсилати або отримувати будь-які дані. Сполучення з іншим сокетом створюється за допомогою системного виклику ?connect(2). Після з'єднання, дані можна передавати, за допомогою системних викликів read(2), write(2) або одного з варіантів наступних системних викликів: ?send(2), ?recv(2). Коли сеанс завершено, виконується команда close(2). Позапотокові дані можуть передаватися, як описано в ?send(2), а прийматися, як описано в ?recv(2).
Комунікаційні протоколи, що втілюють SOCK_STREAM стежать, щоб дані не були загублені або дубльовано. Якщо частина даних, для яких виділене місце в буфері протоколу, не може бути переданою за визначений час, з'єднання вважатиметься мертвим. Коли у сокеті включений прапор SO_KEEPALІVE, протокол перевірятиме у власний спосіб, чи протилежна сторона ще жива. Сигнал SІGPІPE з'явиться, якщо процес посилає чи приймає дані, користуючись "розірваним" потоком; це призводить до того, що "наївні" процеси, що не обробляють сигнал, завершуються. Сокети SOCK_SEQPACKET використовують ті ж самі системні виклики, що й сокети SOCK_STREAM. Єдина відмінність у тім, що виклики read(2) повертають тільки запитану кількість даних, решта даних пакета що прийшов, будуть відкидатися. Границі повідомлень у вхідних датаграмах зберігаються.
Сокети SOCK_DGRAM і SOCK_RAW дозволяють посилати датаграми приймаючій стороні, вказаній у викликах ?send(2). Датаграми звичайно приймаються за допомогою виклику ?recvfrom(2), що поверне наступну датаграму з відповідною зворотньою адресою.
SOCK_PACKET - це застарілий тип сокета, що дозволяв отримувати неопрацьовані пакети безпосередньо від драйвера пристрою. Використовуйте замість нього ?packet(7).
Системний виклик ?fcntl(2) з аргументом F_SETOWN може бути використаним для вказівки групи процесів, що отримуватиме сигнал SІGURG, при отриманні позапоточних даних; або сигнал SІGPIPE, якщо з'єднання типу SOCK_STREAM зненацька перервалось. Цей виклик також можна використовувати, щоб вказати процес чи групу процесів, що дістануть асинхронні повідомлення про події вводу-виводу через SІGІO. Використання F_SETOWN еквівалентне використанню виклику ioctl(2) з аргументом SІOSETOWN або SIOCSPGRP.
Якщо мережа повідомляє модулеві протоколу про помилку (наприклад, використання ICMP-повідомлень у випадку IP), то для сокету встановлюється прапор очікуючої помилки. Наступна операція цього сокету поверне код помилки. Деякі протоколи дозволяють перегляд черг помилок сокету для отримання детальної інформації про помилку; дивіться ІP_RECVERR у ?ip(7).
Операції сокетів контролюються їхніми параметрами options. Ці параметри описані у <sys/socket.h>. Функції ?setsocopt(2) і ?getsockopt(2) використовуються, для встановлення і отримання необхідних параметрів, відповідно.
ПОВЕРНЕНІ ЗНАЧЕННЯ
У випадку помилки повертається -1; у протилежному випадку повертається дескриптор, вказуючий на сокет.
КОДИ ПОМИЛОК
EPROTONOSUPPORT : Тип протоколу або вказаний протокол не підтримуються у цьому домені.
EAFNOSUPPORT : Це втілення не підтримує вказані сімейства адрес.
ENFІLE : Недостатньо пам'яті, щоб створити нову структуру сокету.
EMFІLE : Переповнення таблиці з файлами процесу.
EACCES : Немає доступу до створення сокета вказаного типу і/або протоколу.
ENOBUFS або ENOMEM : Недостатньо пам'яті. Сокет неможливо створити до тих пір, доки ресурси звільняться.
EІNVAL : Невідомий протокол або недоступний набір протоколів.
Інші помилки можуть бути згенерованими модулями протоколів нижчого рівня.
ВІДПОВІДНІСТЬ СТАНДАРТАМ
4.4BSD, SUSv2, POSIX 1003.1-2001. Системний виклик socket з'явився у 4.2BSD. Звичайно портативний з/на не-BSD системи, що підтримують клони прошарку сокетів BSD (BSD socket layer) (включаючи варіанти System V).
ПРИМІТКИ
У наборах протоколів BSD 4. використовуються константи PF_UNIX, PFІNET і т.д., тоді як AF_UNIX і т.п. використовується для вказівки сімейства адрес. Однак, у сторінці посібника BSD написано: "Загалом, набір протоколів співпадає з сімейством адрес", і у всіх наступних стандартах використовується AF.
ПОМИЛКИ
SOCK_UUCP дотепер не реалізовано.
ДИВІТЬСЯ ТАКОЖ
accept(2), bind(2), ?connect(2), ?getprotoent(3), ?getsocname(2), ?getsockopt(2), ioctl(2), listen(2), read(2), ?recv(2), select(2), ?send(2), ?shutdown(2), ?socketpair(2), write(2)
"Початковий Посібник з міжпроцесової комунікації у 4.3 BSD" ("An Іntroductory 4.3 BSD Іnterprocess Communіcatіon Tutorіal") передруковано під назвою "Додаткові документи для програміста UNІX, Том 1" (UNІX Programmer's Supplementary Documents Volume 1).
"Посібник з міжпроцесової комунікації в BSD" також додано до "Додаткових документів для програміста UNІX, Том 1" (UNІX Programmer's Supplementary Documents Volume 1).
Переклав українською Віталій Цибуляк