НАЗВА

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&amp;from=man%2Fman2%2Fsocket.2&amp;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&amp;from=man%2Fman2%2Fsocket.2&amp;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&amp;from=man%2Fman2%2Fsocket.2&amp;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&amp;from=man%2Fman2%2Fsocket.2&amp;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&amp;from=man%2Fman2%2Fsocket.2&amp;do=create" rel="nofollow">?</a>**ddp**(7)</span>
--------------+------------------------------+------------
 PF_PACKET    | Низькорівневий пакетний      | <span class="createlink"><a href="/cgi-bin/ikiwiki.cgi?page=man%2Fman7%2Fpacket.7&amp;from=man%2Fman2%2Fsocket.2&amp;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).


Переклав українською Віталій Цибуляк