Сокети (sockets) в UNIX і основи роботи з ними. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Сокети (sockets) в UNIX і основи роботи з ними.



Практичне заняття 10

Сокети (sockets) в UNIX і основи роботи з ними.

Мета: Організація зв'язку між видаленими процесами за допомогою датаграм. Мережний порядок байт. Функції htons(), htonl(), ntohs(), ntohl(). Функції перетворення IP-адрес inet_ntoa(), inet_aton(). Функція bzero(). Системні виклики socket(), bind(), sendto(), recvfrom(). Організація зв'язку між процесами за допомогою установки логічного з'єднання. Системні виклики connect(), listen(), accept(). Використовування інтерфейсу сокетів для інших сімейств протоколів. Файли типу "сокет".

Системні виклики sendto() і recvfrom()

Для відправки датаграм застосовується системний виклик sendto(). До числа параметрів цього виклику входять:

  • дескриптор сокета, через який відсилається датаграма;
  • адреса області пам'яті, де лежать дані, які повинні скласти змістовну частину датаграми, і їх довжина;
  • прапори, що визначають поведінку системного виклику (в нашому випадку вони завжди матимуть значення 0);
  • покажчик на структуру, що містить адресу сокета одержувача, і її фактична довжина.

Системний виклик повертає негативне значення при виникненні помилки і кількість реальна відісланих байт при нормальній роботі. Нормальне завершення системного виклику не означає, що датаграма вже покинула ваш комп'ютер! Датаграма спочатку поміщається в системний мережний буфер, а її реальна відправка може відбутися після повернення з системного виклику. Виклик sendto() може блокуватися, якщо в мережному буфері не вистачає місця для датаграми.

Для читання прийнятих датаграм і визначення адреси одержувача (при необхідності) служить системний виклик recvfrom(). До числа параметрів цього виклику входять:

  • Дескриптор сокета, через який приймається датаграма.
  • Адреса області пам'яті, куди слід покласти дані, складові змістовну частину датаграми.
  • Максимальна довжина, допустима для датаграми. Якщо кількість даних датаграми перевищує задану максимальну довжину, то виклик за умовчанням розглядає це як помилкову ситуацію.
  • Прапори, що визначають поведінку системного виклику (в нашому випадку вони вважатимуться рівними 0).
  • Покажчик на структуру, в яку при необхідності може бути занесена адреса сокета відправника. Якщо ця адреса не потрібна, то можна вказати значення NULL.
  • Покажчик на змінну, що містить максимально можливу довжину адреси відправника. Після повернення з системного виклику в неї буде занесена фактична довжина структури, що містить адресу відправника. Якщо попередній параметр має значення NULL, то і цей параметр може мати значення NULL.

Системний виклик recvfrom() за умовчанням блокується, якщо відсутні прийняті датаграми, до тих пір, поки датаграма не з'явиться. При виникненні помилки він повертає негативне значення, при нормальній роботі – довжину прийнятої датаграми.

Системні виклики sendto і recvfrom

Прототипи системних викликів

#include <sys/types.h>#include <sys/socket.h> int sendto(int sockd, char *buff int nbytes, int flags struct sockaddr *to, int addrlen);int recvfrom(int sockd, char *buff int nbytes, int flags struct sockaddr *from, int *addrlen);

Опис системних викликів

Системний виклик sendto призначений для відправки датаграм. Системний виклик recvfrom призначений для читання датаграм і визначення адреси відправника, що прийшли. За умовчанням за відсутності датаграм, що прийшли, виклик recvfrom блокується до тих пір, поки не з'явиться датаграма. Виклик sendto може блокуватися за відсутності місця під датаграму в мережному буфері. Даний опис не є повним описом системних викликів, а призначено тільки для використовування в нашому курсі. За повною інформацією звертайтеся до UNIX Manual.

Параметр sockd є дескриптором створеного раніше сокета, тобто значенням, поверненим системним викликом socket(), через який відсилатиметься або виходитиме інформація.

Параметр buff є адресою області пам'яті, починаючи з якою братиметься інформація для передачі або розміщуватиметься прийнята інформація.

Параметр nbytes для системного виклику sendto визначає кількість байт, яке повинне бути передано, починаючи з адресою пам'яті buff. Параметр nbytes для системного виклику recvfrom визначає максимальну кількість байт, яке може бути розміщене в приймальному буфері, починаючи з адресою buff.

Параметр to для системного виклику sendto визначає посилання на структуру, що містить адресу сокета одержувача інформації, яка повинна бути заповнена перед викликом. Якщо параметр from для системного виклику recvfrom не рівний NULL, то для випадку встановлення зв'язку через пакети даних він визначає посилання на структуру, в яку буде занесена адреса сокета відправника інформації після завершення виклику. В цьому випадку перед викликом цю структуру необхідно обнулити.

Параметр addrlen для системного виклику sendto повинен містити фактичну довжину структури, адреса якої передається як параметр to. Для системного виклику recvfrom параметр addrlen є посиланням на змінну, в яку буде занесена фактична довжина структури адреси сокета відправника, якщо це визначено параметром from. Помітимо, що перед викликом цей параметр повинен указувати на змінну, що містить максимально допустиме значення такої довжини. Якщо параметр from має значення NULL, то і параметр addrlen може мати значення NULL.

Параметр flags визначає режими використовування системних викликів. Розглядати його вживання ми в даному курсі не будемо, і тому беремо значення цього параметра рівним 0.

Значення, що повертається

У разі успішного завершення системний виклик повертає кількість реально відісланих або прийнятих байт. При виникненні якої-небудь помилки повертається негативне значення.

Системний виклик connect()

Прототип системного виклику

#include <sys/types.h>#include <sys/socket.h>int connect(int sockd struct sockaddr *servaddr int addrlen);

Опис системного виклику

Системний виклик connect служить для організації зв'язку клієнта з сервером. Частіше за все він використовується для встановлення логічного з'єднання, хоча може бути застосований і при зв'язку за допомогою датаграм (connectionless). Даний опис не є повним описом системного виклику, а призначено тільки для використовування в нашому курсі. Повну інформацію можна знайти в UNIX Manual.

Параметр sockd є дескриптором створеного раніше комунікаційного вузла, тобто значенням, яке повернув системний виклик socket().

Параметр servaddr є адресою структури, що містить інформацію про повну адресу сокета серверу. Він має тип покажчика на структуру-шаблон struct sockaddr, яка повинна бути конкретизована залежно від сімейства протоколів, що використовується, і заповнена перед викликом.

Параметр addrlen повинен містити фактичну довжину структури, адреса якої передається як другий параметр. Ця довжина міняється в зависмости від сімейства протоколів і розрізняється навіть в межах одного сімейства протоколів (наприклад, для UNIX Domain).

При встановленні віртуального з'єднання системний виклик не повертається до його встановлення або до закінчення встановленого в системі часу – timeout. При використовуванні його в connectionless зв'язку виклик повертається негайно.

Значення, що повертається

Системний виклик повертає значення 0 при нормальному завершенні і негативне значення, якщо в процесі його виконання виникла помилка.

Системний виклик listen()

Системний виклик listen() є першим з ще невідомих нам викликів, вживаним на TCP–сервері. В його задачу входить переклад TCP–сокета в пасивний (слухаюче) стан і створення черг для породжуваних при встановленні з'єднання приєднаних сокетів, що знаходяться в змозі не повністю встановленого з'єднання і повністю встановленого з'єднання. Для цього виклик має два параметри: дескриптор TCP–сокета і число, що визначає глибину створюваних черг.

 


Мал. 15-16.8. Схема встановлення TCP з'єднання

Системний виклик listen()

Прототип системного виклику

#include <sys/types.h>#include <sys/socket.h> int listen(int sockd, int backlog);

Опис системного виклику

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

Параметр sockd є дескриптором створеного раніше сокета, який повинен бути переведений в пасивний режим, тобто значенням, яке повернув системний виклик socket(). Системний виклик listen вимагає попередньої настройки адреси сокета за допомогою системного виклику bind().

Параметр backlog визначає максимальний розмір черг для сокетів, що знаходяться в станах повністю і не повністю встановлених з'єднань.

Значення, що повертається

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

Останній параметр на різних UNIX-подібних операційних системах і навіть на різних версіях однієї і тієї ж системи може мати різний сенс. Десь це сумарна довжина обох черг, десь він відноситься до черги не повністю встановлених з'єднань (наприклад, Linux до версії ядра 2.2) десь – до черги повністю встановлених з'єднань (наприклад, Linux, починаючи з версією ядра 2.2), десь – взагалі ігнорується.

Системний виклик accept()

Системний виклик accept() дозволяє серверу одержати інформацію про повністю встановлені з'єднання. Якщо черга повністю встановлених з'єднань не порожня, то він повертає дескриптор для першого приєднаного сокета в цій черзі, одночасно видаляючи його з черги. Якщо черга порожня, то виклик чекає появи повністю встановленого з'єднання. Системний виклик також дозволяє серверу взнати повну адресу клієнта, що встановив з'єднання. У виклику є три параметри: дескриптор слухаючого сокета, через який очікується встановлення з'єднання; покажчик на структуру, в яку при необхідності буде занесена повна адреса сокета клієнта, що встановив з'єднання; покажчик на цілу змінну, що містить максимально допустиму довжину цієї адреси. Як і у разі виклику recvfrom(), останній параметр є тим, що модернізується, а якщо нас не цікавить, хто з нами з'єднався, то замість другого і третього параметрів можна вказати значення NULL.

Системний виклик accept()

Прототип системного виклику

#include <sys/types.h>#include <sys/socket.h> int accept(int sockd struct sockaddr *cliaddr int *clilen);

Опис системного виклику

Системний виклик асcept використовується сервером, орієнтованим на встановлення зв'язку шляхом віртуального з'єднання, для прийому повністю встановленого з'єднання.

Параметр sockd є дескриптором створеного і набудованого сокета, попереднього переведеного в пасивний (слухаючий) режим за допомогою системного виклику listen().

Системний виклик асcept вимагає попередньої настройки адреси сокета за допомогою системного виклику bind().

Параметр cliaddr служить для отримання адреси клієнта, що встановив логічне з'єднання, і повинен містити покажчик на структуру, в яку буде занесена ця адреса.

Параметр clilen містить покажчик на цілу змінну, яка після повернення з виклику міститиме фактичну довжину адреси клієнта. Помітимо, що перед викликом ця змінна повинна містити максимально допустиме значення такої довжини. Якщо параметр cliaddr має значення NULL, то і параметр clilen може мати значення NULL.

Значення, що повертається

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

Практичне заняття 10

Сокети (sockets) в UNIX і основи роботи з ними.

Мета: Організація зв'язку між видаленими процесами за допомогою датаграм. Мережний порядок байт. Функції htons(), htonl(), ntohs(), ntohl(). Функції перетворення IP-адрес inet_ntoa(), inet_aton(). Функція bzero(). Системні виклики socket(), bind(), sendto(), recvfrom(). Організація зв'язку між процесами за допомогою установки логічного з'єднання. Системні виклики connect(), listen(), accept(). Використовування інтерфейсу сокетів для інших сімейств протоколів. Файли типу "сокет".



Поделиться:


Последнее изменение этой страницы: 2017-01-20; просмотров: 147; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.122.4 (0.015 с.)