Мета роботи: Вивчити роботу з потоковими сокетами в режимі опиту. Створити сервер котрий буде відповідати на запити клієнтів.
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

4.1 Теоретичні відомості

Socket API був вперше реалізований в операційній системі UNIX. Зараз цей програмний інтерфейс доступний практично в будь-якій операційній системі. Хоча всі реалізації чимось відрізняються один від одного, основний набір функцій у них збігається. Спочатку сокети використовувалися в програмах на C/C++, але в даний час вони є майже в всіх нових мовах програмування (Perl, С#, Java та ін.).

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

Сокети підтримують багато стандартних мережевих протоколів (конкретний їх список залежить від реалізації) і надають уніфікований інтерфейс для роботи з ними. Найбільш часто сокети використовуються для роботи в IP-мережах.

Сокети, незалежно від виду, поділяються на три типи: потокові, сирі і дейтаграмні. Потокові сокети працюють з установкою з'єднання, забезпечуючи надійну ідентифікацію обох сторін і гарантують цілісність і успішність доставки даних, спираючись на протокол TCP. Дейтаграмні сокети працюють без встановлення з'єднання і не забезпечують ні ідентифікації відправника, ні контролю успішності доставки даних, зате вони швидше потокових, спираючись на протокол UDP. Сирі сокети, вони надають можливість ручного формування TCP \ IP-пакетів.

Також існує 2 види сокетів:

- Синхронні – затримують управління на час виконання операції;

- Асинхронні – повертають управління, але продовжують виконувати роботу в фоні та після закінчення повідомляють про це.

4.1.1 Робота з сокетами

В даному випадку розглянемо роботу з синхронними потоковими сокетами (TCP).

Реалізація сервера:

1 Підготувати бібліотеку до використання;

2 Створити об’єкт типу Socket;

3 Зв’язати цей об’єкт з локальною адресою/портом;

4 Перейти в режим очікування;

5 Витягнути із черги запит на з’єднання;

6 Прийняти/передати дані;

7 Закрити сокети, звільнити ресурси.

Реалізація клієнта:

1 Підготовити бібліотеку до використання;

2 Створити об’єкт типу Socket;

3 З’єднатися з сервером;

4 Прийняти/передати дані;

5 Закрити сокети, звільнити ресурси

4.1.2 Реалізація сервера

Крок перший. «Підготовка бібліотеки»

Для роботи з бібліотекою Winsock 2.x потрібно підключити директиву #include <winsock2.h> та підготувати саму бібліотеку. Для цього використаємо функцію WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData).

- wVersionRequestedпараметр типу WORD, приймає значення версії сокетів (старший байт слова – номер версії, молодший – номер під версії);

- lpWSAData – структура типу WSADATA, в котру при успішній ініціалізації буде занесена інформація про виробника бібліотеки.

Приклад:

WORD sockVersion;

WSADATA wsaData;

sockVersion = MAKEWORD(2,2);

WSAStartup(sockVersion, &wsaData);

В UNIX подібних системах потрібно підключити такі директиви:

#include <sys/types.h>

#include <sys/socket.h>

Крок другий. «Створення об’єкту типу Socket»

Створимо об’єкт типу socket. Використовуємо функцію SOCKET s (int af, int type, int protocol).

- аf - сімейство протоколів (Зазвичай використовують AF_INET, тобто Internet протоколи.);

- type – тип сокету – спосіб передачі даних через мережу. В даному курсі ми будемо використовувати: SOCK_STREAM з встановленням з’єднання, використовується в основному з TCP та SOCK_DFRAM без встановлення з’єднання, використовуються з UDP;

- protocol – протокол для передачі даних.

Функція повертає дескриптор сокету, інакше INVALID_SOCKET.

Приклад:

SOCKET s = socket (AF_INET, SOCK_STREAM, 0);

// 0 – параметр за про мовчанням, означає TCP.

Крок третій «З’єднання сокета з локальною адресою»

Клієнт при підключені повинен вказати адресу/порт сервера. Отже на стороні сервера ми повинні вказати адресу/порт, а потім поєднати їх з сокетом. Для цього потрібно використати функцію int bind(SOCKET s, const struct sockaddr FAR* name, int namelen).

s – дескриптор сокету з котрим ми поєднаємо адресу/порт;

name - структура sockaddr, котра містить адресу/порт;

namelen – довжина структури sockaddr.

Якщо все добре, то функція повертає «0».

Структура sockaddr має вигляд:

struct sockaddr { unsigned short sa_family; // сімейство адрес, AF_xxx char sa_data[14];// 14 байтів для // зберігання адреси}; Так як працювати з sockaddr не зручно, то можна використовувати альтернативну структуру sockaddr_in:struct sockaddr_in { short int sin_family; // сімейство адресів unsigned short int sin_port; // номер порта struct in_addr sin_addr; // IP-адреса unsigned char sin_zero[8]; // "доповнення" до // розміру структури // sockaddr};

Приклад:

sockaddr_in sin;

sin.sin_family = AF_INET;

sin.sin_port = htons(8888);

sin.sin_addr.s_addr = INADDR_ANY;

result = bind(s, (LPSOCKADDR)&sin, sizeof(sin));

Дата: 2016-10-02, просмотров: 188.