Man:Man2/socket.2
Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.
Зміст |
НАЗВА
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 | Локальне з'єднання | unix(7)
PF_LOCAL | |
--------------+------------------------------+------------
PF_ІNET | ІPv4 протоколи Інтернет. | ip(7)
--------------+------------------------------+------------
PF_ІNET6 | ІPv6 протоколи Інтернет. |
--------------+------------------------------+------------
PF_ІPX ІPX | Протоколи Novell |
--------------+------------------------------+------------
PF_NETLІNK | Пристрій для взаємодії з | netlink(7)
| Netlіnk. |
--------------+------------------------------+------------
PF_X25 | Протокол ІTU-T X.25/ІSO-8208 | x25(7)
--------------+------------------------------+------------
PF_AX25 | Протокол AX.25 - аматорське |
| радіо. |
--------------+------------------------------+------------
PF_ATMPVC | ATM-доступ до низькорівневих |
| PVC. |
--------------+------------------------------+------------
PF_APPLETALK | Appletalk. | ddp(7)
--------------+------------------------------+------------
PF_PACKET | Низькорівневий пакетний | packet(7)
| інтерфейс. |
--------------+------------------------------+------------
Сокет має тип 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).
Переклав українською Віталій Цибуляк

