Сокети Берклі - це

API сокетів Берклі сформував de facto стандарт абстракції для мережевих сокетів. Більшість інших мов програмування використовують інтерфейс, схожий з API мови Сі.

API інтерфейсу транспортного рівня (TLI), заснований на STREAMS, являє собою альтернативу сокетних API. Проте, API сокетів Берклі значно переважає в популярності і кількості реалізацій.

Інтерфейс сокета Берклі

Інтерфейс сокета Берклі - API. дозволяє реалізацію взаємодії між комп'ютерами або між процесами на одному комп'ютері. Дана технологія може працювати з безліччю різних пристроїв введення / виводу і драйверів. незважаючи на те, що їх підтримка залежить від реалізації операційної системи. Подібна реалізація інтерфейсу лежить в основі TCP / IP. завдяки чому вважається однією з фундаментальних технологій, на яких ґрунтується Інтернет. Технологія сокетов вперше була розроблена в Каліфорнійському університеті Берклі для застосування на Юнікс-системах. Всі сучасні операційні системи мають ту чи іншу реалізацію інтерфейсу сокетів Берклі, так як це стало стандартним інтерфейсом для підключення до мережі Інтернет.

Програмісти можуть отримувати доступ до інтерфейсу сокетів на трьох різних рівнях, найбільш потужним і фундаментальним з яких є рівень сирих сокетів. Досить невелика кількість додатків потребує обмеження контролю над вихідними сполуками, реалізованими ними, тому підтримка сирих сокетів замислювалася бути доступною тільки на комп'ютерах, що застосовуються для розробки на основі технологій, пов'язаних з Інтернет. Згодом, в більшості операційних систем була реалізована їх підтримка, включаючи Windows XP.

заголовки

Програмна бібліотека сокетів Берклі включає в себе безліч пов'язаних заголовків файлів. В тому числі:

socket () створює кінцеву точку з'єднання і повертає дескриптор. socket () приймає три аргументи:

  • domain. вказує сімейство протоколів створюваного сокета. наприклад:
    • PF_INET для мережевого протоколу IPv4 або
    • PF_INET6 для IPv6.
    • PF_UNIX для локальних сокетов (використовуючи файл).
  • type (тип) один з:
    • SOCK_STREAM (надійна потокооріентірованная служба (сервіс) або потоковий сокет)
    • SOCK_DGRAM (служба датаграмм або Датаграммним сокет)
    • SOCK_SEQPACKET (надійна служба послідовних пакетів) або
    • SOCK_RAW (Сирий сокет - сирої протокол на основі мережевого рівня).
  • protocol визначає використовуваний транспортний протокол. Найпоширеніші - це IPPROTO_TCP. IPPROTO_SCTP. IPPROTO_UDP. IPPROTO_DCCP. Ці протоколи вказані в . Значення «0» може бути використано для вибору протоколу за замовчуванням із зазначеного сімейства (domain) і типу (type).

Функція повертає -1 у разі помилки. Інакше, вона повертає ціле число, що представляє присвоєний дескриптор.

gethostbyname () і gethostbyaddr ()

Функції повертають NULL-покажчик в разі помилки. У цьому випадку може бути перевірена додаткова ціла h_errno для виявлення помилки або неправильного або невідомого хоста. В іншому випадку повертається коректна struct hostent *.

connect () Повертає ціле число, яке представляє код помилки: 0 означає успішне виконання, а -1 свідчить про помилку.

Завантажений сервер може відкинути спробу з'єднання, тому в деяких видах програм необхідно передбачити повторні спроби з'єднання.

Повертає 0 при успіху і -1 при виникненні помилки.

listen () готує прив'язувати сокет до прийняття вхідних з'єднань. Ця функція може бути застосована тільки до типам сокетов SOCK_STREAM і SOCK_SEQPACKET. Приймає два аргументи:

  • sockfd - коректний дескриптор сокета.
  • backlog - ціле число, що означає число встановлених з'єднань, які можуть бути оброблені в будь-який момент часу. Операційна система зазвичай ставить його рівним максимальному значенню.

Після прийняття з'єднання воно виводиться з черги. При вдалому завершенні повертає 0, в разі виникнення помилки повертається -1.

accept () використовується для прийняття запиту на встановлення з'єднання від віддаленого хоста. Приймає наступні аргументи:

Функція повертає дескриптор сокета, пов'язаний з прийнятим з'єднанням, або -1 у випадку виникнення помилки.

Розширені можливості пошуку для гнізд

Після створення сокета можна задавати для нього додаткові параметри. Ось деякі з них:

  • TCP_NODELAY відключає алгоритм Негл (англ. Nagle's_algorithm)
  • SO_KEEPALIVE включає періодичні перевірки на наявність 'ознак життя', якщо це підтримується ОС.

Блокуючі і неблокірующіх сокети

Сокети Берклі можуть працювати в одному з двох режимів: блокирующем або неблокірующіх. Блокуючий сокет не повертає контроль поки не відішле (або поки не отримає) всі дані, зазначені для операції. Це вірно лише для Linux-систем. В інших системах, наприклад у FreeBSD, цілком природно для блокуючого сокета посилати не всі дані. Додаток має перевіряти повертається значення для відстеження того, скільки байт було послано / отримано і, відповідно, перепосилать необроблену на даний момент інформацію [1]. Це може привести до проблем, якщо сокет продовжує «слухати»: програма може зависнути через те, що сокет чекає даних, які можуть ніколи не прибути.

Сокет зазвичай вказується блокуючим або неблокуючим за допомогою функцій fcntl () або ioctl ().

Передача даних

Для передачі даних можна користуватися стандартними функціями читання / запису файлів read і write. але є спеціальні функції для передачі даних через сокети:

Потрібно звернути увагу, що при використанні протоколу TCP (сокети типу SOCK_STREAM) є ймовірність отримати менше даних, ніж було передано, так як ще не всі дані були передані, тому потрібно або дочекатися, коли функція recv поверне 0 байт, або виставити прапор MSG_WAITALL для функції recv. що змусить її дочекатися закінчення передачі. Для інших типів сокетів прапор MSG_WAITALL нічого не змінює (наприклад, в UDP весь пакет = ціле повідомлення). Дивись також главу «Блокуючі і неблокірующіх сокети».

вивільнення ресурсів

Система не звільняє ресурси, виділені при виклику socket (). поки не відбудеться виклику close (). Це особливо важливо в разі, якщо виклик connect () пройшов невдало і може бути повторений. Кожен виклик socket () повинен мати відповідний виклик close () у всіх можливих шляхах виконання. Необхідно додавати заголовки для підтримки функції закриття.

Результатом виконання системного виклику close () є тільки звернення до інтерфейсу для закриття сокета, а не закриття самого сокета. Це є командою для ядра закрити сокет. Іноді, на серверній стороні сокет може перейти в режим очікування TIME_WAIT до 4 хвилин. [2]

Приклад клієнта і сервера, що використовують TCP

TCP реалізує концепцію з'єднання. Процес створює TCP-сокет викликом функції socket () з параметрами PF INET або PF_INET6. а також SOCK_STREAM (Потоковий сокет) і IPPROTO_TCP.

Створення найпростішого TCP-сервера складається з наступних кроків:

  • Створення TCP-сокетів викликом функції socket ().
  • Прив'язка сокета до прослуховувати порту викликом функції bind (). Перед викликом bind () програміст повинен оголосити структуру sockaddr_in. очистити її (за допомогою memset ()), потім sin_family (PF_INET або PF_INET6) і заповнити поля sin_port (прослуховується порт, вказати у вигляді послідовності байтів). Перетворення short int в порядок байтів може бути виконано за допомогою виклику функції htons () (скорочення від «від хоста в мережу»).
  • Підготовка сокета до прослуховування на предмет з'єднань (створення прослуховується сокета) за допомогою виклику listen ().
  • Ухвалення вхідних з'єднань через виклик accept (). Це блокує сокет до отримання вхідного з'єднання, після чого повертає дескриптор сокета для прийнятого з'єднання. Початковий дескриптор залишається прослуховується дескриптором, а accept () може бути викликаний знову для цього сокета в будь-який час (поки він закритий).
  • З'єднання з віддаленим хостом, яке може бути створене за допомогою send () і recv () або write () і read ().
  • Підсумкове закриття кожного відкритого сокета, який більше не потрібен, відбувається за допомогою close (). Необхідно відзначити, що якщо були будь-які виклики fork (). то кожен процес повинен закрити відомі йому сокети (ядро відстежує кількість процесів, що мають відкритий дескриптор), а крім того, два процеси не повинні використовувати один і той же сокет в один час.

Створення TCP-клієнта відбувається наступним чином:

Приклад клієнта і сервера, що використовують UDP

Код може створювати UDP-сервер на порту 7654 наступним чином:

Такий нескінченний цикл отримує все UDP-датаграми, що приходять на порт 7654, за допомогою recvfrom (). Функція використовує параметри:

Визначення стандарту «де юре» інтерфейсу сокетів, що міститься в стандарті POSIX. більш відоме як:

Дивитися що таке "Сокети Берклі" в інших словниках:

Сокет (програмний інтерфейс) - Цей термін має також інші значення див. Сокет. Сокети (англ. Socket поглиблення, гніздо, роз'єм) назва програмного інтерфейсу для забезпечення обміну даними між процесами. Процеси при такому обміні можуть виконуватися як на ... ... Вікіпедія

Програмування мережевих завдань - В області комп'ютеризації поняття програмування мережевих задач чи інакше званого мережевого програмування (англ. Network programming), досить сильно схожого з поняттями програмування сокетів і клієнт серверне програмування, ... ... Вікіпедія

Unix domain socket - (Доменний сокет Unix) або IPC сокет (сокет взаємодії між процесами) кінцева точка обміну даними, схожа з Інтернет сокетом, але не використовує мережевий протокол для взаємодії (обміну даними). Він використовується в операційних системах, ... ... Вікіпедія

Сирий сокет - інтерфейс програмування додатків (API), різновид сокетов Берклі, що дозволяє збирати TCP / IP пакети, контролюючи кожен біт заголовка і відправляючи в мережу нестандартні пакети. Приклад Створення сокета. Код на мові Сі. int i32SocketFD ... Вікіпедія

UNIX - Генеалогічне древо UNIX систем UNIX (читається юнікс) сімейство переносите, багатозадачних і розрахованих на багато користувачів ... Вікіпедія

UX - Генеалогічне древо UNIX систем UNIX (читається юнікс) група переносите, багатозадачних і багатокористувацьких операційних систем. Перша система UNIX була розроблена в 1969 р в підрозділі Bell Labs компанії AT T. З тих пір було створено ... Вікіпедія

Unix - Генеалогічне древо UNIX систем UNIX (читається юнікс) група переносите, багатозадачних і багатокористувацьких операційних систем. Перша система UNIX була розроблена в 1969 р в підрозділі Bell Labs компанії AT T. З тих пір було створено ... Вікіпедія

ЮНИКС - Генеалогічне древо UNIX систем UNIX (читається юнікс) група переносите, багатозадачних і багатокористувацьких операційних систем. Перша система UNIX була розроблена в 1969 р в підрозділі Bell Labs компанії AT T. З тих пір було створено ... Вікіпедія

Юнекс - Генеалогічне древо UNIX систем UNIX (читається юнікс) група переносите, багатозадачних і багатокористувацьких операційних систем. Перша система UNIX була розроблена в 1969 р в підрозділі Bell Labs компанії AT T. З тих пір було створено ... Вікіпедія

Інтерфейс транспортного рівня - В області проектування комп'ютерних мереж Інтерфейс транспортного рівня (від англ. Transport Layer Interface) (TLI) був мережевим API, підтримуваним AT T UNIX System V Release 3 (SVR3) і Release 4 (SVR4). TLI був двійником (але в System V) ... ... Вікіпедія