НОУ ІНТУІТ, Лекція, Сокети

Які б чудові ідеї в галузі телекомунікацій, розподілених баз знань чи пошукових систем вам не спали на думку, реалізувати їх на практиці можна, лише написавши відповідну програму. Основні операційні середовища (Unix чи Windows) базуються нині на ідеології сокетів ( socket ). Ця технологія була розроблена в університеті міста Берклі (США) для системи Unix, тому з'єднувачі (сокети) іноді називають сокетами Берклі (berkeley sockets). Сокети реалізують механізм взаємодії як партнерів з телекомунікацій, а й процесів у ЕОМ взагалі (див. [2.15], і навіть http://book.itep.ru/7/sock_71.htm). Технологія сокетів є основою сучасного мережевого програмування.

p align="justify"> Робота з сокетами містить ряд етапів: сокет створюється, налаштовується на заданий режим роботи, застосовується для організації обміну і, нарешті, ліквідується. Технологія сокетів підтримує роботу з будь-якими стеками протоколів, суміщені процедури введення/виводу, використання великої кількості сервіс-провайдерів (серверів послуг), можливість групування сокетів, що дозволяє реалізувати їх пріоритетне обслуговування та багато іншого. Набір операторів, які підтримують інтерфейс провайдера, утворює окрему динамічну бібліотеку.

Для загальної синхронізації роботи сервіс-провайдерів та програм у winsock введено поняття об'єктів подій. Об'єкти подій служать, зокрема, для роботи суміщених за часом процесів інформаційного обміну. Тут доречним є зауваження щодо використання стандартних номерів портів. У багатозадачних, розрахованих на багато користувачів системах стандартні номери портів використовуються при ініціалізації процесу. Так як допускається кілька ідентичних з'єднань (наприклад, кілька одночасних FTP сесій ) між клієнтомта сервером, стандартними номерами портів тут не обійтися. Адже PsIPs сервер може відповідати кілька PcIPc клієнта.

s = socket (INT AF, INT type, INT protocol);

де всі параметри цілі, AF (address_family) характеризує набір протоколів, відповідний даному сокету (це може бути набір Internet, Unix, Appletalk і т.д.). Для Інтернету AF може приймати лише значення PF_INET, для Unix PF_UNIX. Аргумент type визначає тип комунікацій ( SOCK_STREAM , SOCK_RAW і SOCK_DGRAM ). Аргумент protocol задає код конкретного протоколу із зазначеного набору (заданого AF ), який буде реалізований у цьому з'єднанні. Протоколи позначаються символьними константами з префіксом IPPROTO_ (наприклад, IPPROTO_TCP або IPPROTO_UDP). Дозволяється значення protocol=0 (протокол не вказано), у цьому випадку використовується значення за промовчанням для цього виду з'єднань. Значення AF і type зазвичай можна знайти у файлі socket .h>. Повертається параметр S є дескриптором сокету. Параметр SOCK_STREAM говорить про те, що ви маєте намір створити надійний двонаправлений канал обміну, орієнтований на з'єднання (TCP для Інтернет). Зв'язок з іншим процесом у разі встановлюється оператором connect . Після встановлення з'єднання дані можуть надсилатися оператором send або одержуватися за допомогою оператора recv. Параметр SOCK_DGRAM характеризує канал, не орієнтований з'єднання, з пакетами фіксованого розміру (наприклад, UDP у разі AF= PF_INET ). Такий канал дозволяє використовувати оператори sendto і recvfrom. Параметр SOCK_RAW визначає третій режим, у якому можливе використання протоколів нижнього рівня, наприклад, ICMP і навіть IP . Таким чином, формування сокету - це створення описує його структури даних.

Якщо операція socket завершилася успішно, s дорівнює дескриптору сокету, інакше s=INVALID_SOCKET (1) . За допомогою оператора WSAGetLastError можна отримати код помилки, який пояснює причину негативного результату.

Дескриптор сокету вказує на елемент таблиці дескрипторів, який відповідає цьому сокету. Оператор socket відводить місце у цій таблиці. Елемент такої таблиці має вигляд: