ТОП 10:

Структура найпростішого клієнта



Приклад луна-клієнта, що відсилає серверу дані, введені із клавіатури, і відобра­жає все отримане у відповідь, наведено нижче.

Сокет і виклик connecte ) створюються стандартним способом. Обмін даними відбувається в нескінченному циклі (для виходу потрібно ввести рядок "вихід", після чого з'єднання буде коректно закрите). Зазначимо, що для простоти весь код повного отримання даних наведено тільки для recv() :

 

// sockfd = sockete...), connecttsockfd. ...)

for (; ;) {

fgetstbuf. sizeof(buf), stdin);

if (strcmptbuf, "вихід\п") — 0) break;

stdin_read = strlen(buf);

send(sockfd. buf. stdin_read. 0);

for (pos - 0; pos < stdin_read; pos += net_read)

netread = recv(sockfd. &buf[pos]. stdinread - pos. 0): printfC'eifl сервера отримано: %s", buf);

} -• i tfwbwaw», . Ш: ї9п

close(sockfd);

 

Структура найпростішого багатопотокового сервера

Розглянемо, як можна вирішити проблему ітеративного сервера відповідно до підходів, описаних у розділі 15. У цьому розділі зупинимося на розробці найпро­стішого багатопотокового сервера, а у розділі 16.4.4 — на введенні-виведенні з по­відомленням на базі виклику selecto.

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

 

for(: ;) {

connfd = accept(Iistenfd. ...); pthread_attr_i ni t(&att r);

pthread_attr_setdetachstate(&attr. PTHREADCREATEDETACHED): pthread_create(&tid. &attr. &process_request. (void *) connfd);

}

 

Функція потоку перетворює параметр до цілочислового типу, виконує обмін даними із клієнтом і закриває сокет з'єднання:

 

void *process_request(void *data) { int connfd = (int) data; // ... обмін даними із клієнтом через connfd close(connfd);

 

Введення-виведення з повідомленням

 

Системний виклик selecto

 

У розділі 15.5.3 ішлося про особливості введення-виведення із повідомленням і загальні принципи використання системного виклику selecto. Зараз наведемо приклад використання selecto для повідомлення про стан сокетів у реалізації вже відомого луна-сервера.

Насамперед зауважимо, що select( ) в UNIX працює з усіма файловими деск­рипторами, доступними для процесу (серед них можуть бути дескриптори со­кетів). Ці дескриптори, як зазначалося в розділі 13, - цілі числа із послідовною нумерацією від нуля. Таке відображення визначає низку особливостей викори­стання виклику selecto.

Опишемо синтаксис select О:

 

#іпсіude <sys/select.h> #include <sys/time.h>

int select(int fdcount. fdset *readset. fd_set *writeset. fd_set *exceptset, const struct timeval *timeout);

де: fdcount — кількість дескрипторів, зміну стану яких потрібно відстежувати (оскільки дескриптори нумеруються від нуля, це число дорівнює максималь­ному номеру дескриптора плюс один);

 

 

Розділ 19

Завантаження операційних систем

 

♦ Загальні принципи організацГі' процесу завантаження

♦ Процес завантаження Linux і Windows ХР

 

Завантаження операційної системи — складний процес, що стосується більшості підсистем ОС. Його повне розуміння неможливе без наявності базових знань про структуру різних компонентів системи.

 

Загальні принципи завантаження ОС

 

Тут зробимо короткий огляд загальних принципів організації завантаження опе­раційних систем. Основну увагу буде приділено апаратній ініціалізації комп'ютера і принципам реалізації завантажувача ОС. Подальші етапи завантаження опише­мо коротко, докладніше їх буде розглянуто на прикладах у розділах, присвячених завантаженню Linux і Windows ХР.

 







Последнее изменение этой страницы: 2017-02-06; Нарушение авторского права страницы

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