- •Національний авіаційний університет
- •Лабораторний практикум з дисципліни «Мультиплатформені операційні середовища»
- •Визначення, позначення і скорочення
- •2.2. Використання клавіатури пк в ос qnx
- •2.3. Основні команди в ос qnx
- •2.4. Робота в файловій системі ос qnx
- •2.5. Ініціювання і завершення роботи в графічній оболонці Photon
- •3. Зміст звіту про лабораторну роботу
- •4. Питання для самоконтролю
- •5. Завдання на лабораторну роботу
- •Лабораторна робота № 2. Компіляція програм Короткі теоретичні відомості
- •Мікроядро
- •Системні і користувацькі процеси
- •Драйвери пристроїв
- •Зв'язок між процесами (ipc)
- •Qnx як мережа
- •Текст програми
- •Лабораторна робота №4. Повідомлення Короткі теоретичні відомості Архітектура і структура обміну повідомленнями
- •Текст програми
- •Послідовність дій
- •Результати
- •Лабораторна робота № 5. Тайм-аути Короткі теоретичні відомості Тайм-аути ядра
- •Текст програми
- •Текст програми
- •Послідовність дій
- •Результати
- •Послідовність дій
- •Результати
- •Лабораторна робота № 8. Створення найпростішого сервера в ос qnx
- •Короткі теоретичні відомості Функція Socket
- •Функція Bind
- •Функції listen і accept
- •Читання з сокета
- •Запис в сокет
- •Закриття сокета
Закриття сокета
Після закінчення обміну даними програма повинна закрити сокет, викликавши функцію close(). Вона має наступний прототип:
Сlose(S)
де S - дескриптор сокета, що закривається.
Текст програми, що створює сервер.
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
int main (void)
{ int S, K, New;
char bufer[250], buf[]="Server create.";
struct sockaddr_in serv =
{ sizeof (struct sockaddr_in),
AF_INET,
htons (3128),
INADDR_ANY
};
S=socket (AF_INET,SOCK_STREAM,0);
bind (S, (struct sockaddr*)&serv, sizeof(serv));
listen (S,10);
for (;;)
{
K=sizeof (serv);
New=accept (S, (struct sockaddr*)&serv,&K);
read (New,bufer,sizeof (bufer));
write (New,buf,sizeof(buf));
close (New);
}
close (S);
}
Опишемо функції, які ми використовували в даній програмі:
Для створення сокета використовується функція socket:
S = socket (protocol_family, socket_type, protocol);
де:
- Protocol_family - група або сімейство, до якої належить протокол, наприклад TCP/IP. У нашому випадку ми використовуємо комунікаційний домен AF_INET, що містить Internet протоколи.
- Socket_type - тип сокета, задає режим з'єднання: Датаграммним або орієнтований на потік байтів. В нашому випадку тип сокета - SOCK_STREAM - забезпечує послідовний, надійний, орієнтований на встановлення двостороннього зв'язку потік байтів.
- Protocol - визначає протокол, з яким працюватиме сокет. У нашому випадку для створення сокета з протоколом TCP даний параметр функції встановлюємо рівним 0.
Функція bind закладає здатність програми очікувати появи запиту від клієнта. Вона дозволяє пов'язати сокет з адресою і номером порту.
Адреса мережі інтернет називається IP-адресою. Якщо комп'ютер підключений до мережі інтернет, то відповідно він має IP-адресу. Довжина адреси Інтернет становить 4 байти або 32 біти. На одному комп'ютері може працювати кілька додатків, тому другою складовою адреси інтернет є порт. У термінології TCP/IP поняття «порт» дуже схоже на IP-адресу. Відмінності: порт позначає додаток, а IP-адресу - мережевий комп'ютер. В адресації Інтернет порт займає 2 байта або 16 біт (тип - integer).
bind (S, local_address, address_length);
де:
- S це дескриптор сокета, отриманий від функції socket.
- Local_address - локальна адреса сокета, який є покажчиком на структуру даних адреси сокета спеціального виду.
- Address_length - вказує довжину структури даних адреси сокета.
Коли сервер бажає запропонувати один зі своїх сервісів, він пов'язує сокет з загальновідомою адресою, що асоціюється з даним сервером, і пасивно слухає цей сокет. Для цих цілей використовується виклик функції listen:
listen (S, qlength);
де:
- S - дескриптор сокета.
- Qlength - максимальна кількість запитів на встановлення зв'язку, які можуть стояти в черзі, чекаючи обробки сервером. Виберемо qlength = 10.
Коли сервер отримує запит від клієнта і приймає рішення про встановлення зв'язку, він створює новий сокет і пов'язує його з асоціацією (в internet домені асоціація складається з локальної і віддаленої адреси і з локального і віддаленого порту), еквівалентної «слухаючому сокету». Для цього використовується виклик функції accept:
New = аccept (S, clientaddr, clientaddrlen);
Сокет, асоційований клієнтом, і сокет, який був повернутий функцією accept, використовуються для встановлення зв'язку між сервером і клієнтом.
Коли зв'язок встановлено, може початися процес передачі даних. Посилати і отримувати повідомлення можна за допомогою функцій write і read відповідно:
write (S, buffer, sizeof (buffer));
read (S, buffer, sizeof (buffer));
де:
- S - дескриптор сокета;
- Buffer - буфер повідомлення, вказує на буфер, тобто область пам'яті, в якій розташовані передані дані.
- Sizeof (buffer) - довжина буфера, тобто кількість даних для передачі.
Закривається сокет за допомогою функції close:
Сlose (S)
де S - дескриптор закривається сокета.
Після запуску, дана програма створює найпростіший Web-сервер, який постійно запущений. Щоб звернутися до цього сервера, необхідно в командному рядку браузера написати IP адресу комп'ютера, на якому запущений сервер і порт (в нашому випадку порт 3128). На рис. 5 представлений приклад звернення до сервера.
Рис. 5. Приклад звернення до сервера
