fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Технології

Корисні зауваження winsock

Лише при успішній реалізації всіх перерахованих у першій частині статті операцій може початися обмін даними з допомогою звичайно ж програмування. Для пересилання даних можуть використовуватися команди write, read, send, recv. Команди read write і мають форму виклику:
R=write(s, buf, len) або R=read(s, buf, len),
де s – дескриптор з’єднувача, buf – ім’я масиву, який підлягає пересиланні (або призначеного для прийому), len – довжина масиву. Оператор writev відрізняється від write тим, що дані можуть не лежати у вигляді безперервного масиву:
R=writev(s, io_vect, vectlen) або R=readv(s, io_vect, vectlen),
де s – дескриптор з’єднувача, io_vect – вектор-вказівник на список покажчиків, vectlen – довжина списку покажчиків. Команда виконується повільніше, ніж write або read.
Команди send(s, msg_buf, buflen, flags) і recv мають аналогічний формат, але серед параметрів звернення містять змінну flags, яка служить для цілей діагностики і керування передачею даних (наприклад, пересилання інформації з високим пріоритетом (MSG_OOB – Message Out Of Band), що використовується, зокрема, при передачі звукових повідомлень). При роботі з операторами send або recv треба бути впевненим, що приймаюча сторона знає, що їй слід робити з цими пріоритетними повідомленнями.Часто використовується в супутникових мережах
Інший можливий прапор, який визначається константою MSG_PEEK, дозволяє аналізувати запити з вхідної черги транспортного рівня. Зазвичай після зчитування даних з вхідної черги, вони знищуються. Коли MSG_PEEK=1, дані з вхідної черги не стираються. Цей прапор використовується, наприклад, програмою FTP. При успішному виконанні команди буде повернуто число переданих байтів, в іншому випадку -1.використовується в vsat мережах
Всі перераховані вище оператори розраховані на використання в рамках протоколів, орієнтованих на встановлення з’єднання (TCP), де не вимагається зазначення адреси місця призначення. У протоколах типу UDP (не орієнтованих на з’єднання для передачі інформації використовуються оператори sendto, recvfrom або sendmsg:
R=sendto(s, msg_buf, buflen, flags, adr_struc, adr_struc_len)
або recvfrom(s, msg_buf, buflen, flags, adr_struc, adr_struc_len),
де s – дескриптор з’єднувача, msg_buf – покажчик на буфер, де лежить повідомлення, buflen – довжина цього буфера (довжина повідомлення), adr_struc – адресна структура, яка містить вичерпну інформацію про адресата, adr_struc_len – довжина цієї структури. Оператор recvfrom приймає всі дані, що приходять на його порт. Прийнявши дейтограмму, recvfrom записує також адресу, звідки ця дейтограмма отримана. Сервер може посилати за цією адресою дейтограмму-відгук. Виклик оператора sendmsg має форму:
R=sendmsg(s, msg_struc, flags) [або recvmsg(s, msg_struc, flags)],
де s – дескриптор з’єднувача, msg_struc – інформаційна структура, формат якої показаний нижче на малюнку 4. Застосування структур робить програмування пересилання повідомлень більш гнучким. Слід враховувати, що для обмінів, не орієнтованих на з’єднання, з’єднувач як би складається лише з однієї половини (IP-адресу та номер порту). Вони можуть приймати пакети від інших аналогічних оединителей самі посилати їм дейтограммы (лапки тут пов’язані з тим, що це не реальний з’єднувач і ніякого з’єднання тут не здійснюється).
Взаємодія операторів winsock для систем, не орієнтованих на з’єднання, показано на малюнку 5. Тут також як і в випадку, орієнтованому на з’єднання, сервер викликає socket і bind, після чого звертається до процедури recvfrom (замість read або recv). Програма-клієнт в даній схемі звертається до оператора bind і зовсім не використовує оператор connect (адже попереднього з’єднання не потрібно). Для передачі запитів і прийому відгуків тут служать оператори sendto і recvfrom, відповідно.
Крім вже описаних операторів для роботи з з’єднувачами (sockets) є ще один – select, досить часто використовуваний серверами. Оператор select дозволяє процесу відстежувати стан одного або декількох з’єднувачів. Для кожного з’єднувача викликає програма може запросити інформацію про статус read, write або error. Форма звернення має вигляд:
R=select(num_of_socks, read_socks, write_socks, error_socks, max_time),
де num_of_socks – число контрольованих з’єднувачів (в деяких реалізаціях не використовується і є необов’язковим, за замовчуванням це число не повинно перевищувати 64). В Берклі версії read_socks, write_socks і error_socks являють собою побітові маски, що визначають тип з’єднувача. Параметр read_socks являє собою вказівник на структуру, що описує набір з’єднувачів, стан яких контролюється на можливість читання (версія winsock). Якщо з’єднувач знаходиться в стані listen, він буде позначений як отов для чтенияпри умови, що запит на з’єднання вже отримано. Це передбачає виконання оператора accept без блокування. Для інших з’єднувачів отовность до чтениюодразумевает наявність у черзі запитів читання. Для з’єднувачів типу SOCK_STREAM це означає, що віртуальний з’єднувач, відповідний даному соединителю закрився, і оператори recv або recvfrom будуть виконані без блокування. Якщо віртуальне з’єднання закрито коректно, оператор recv поверне код 0, в іншому випадку (наприклад, примусове закриття) буде повернуто код WSAECONNRESET. Параметр write_socks – вказівник на набір з’єднувачів, стан яких контролюється на можливість запису. Якщо з’єднувач знаходиться в процесі виконання процедури connect, пособность до записизначает, що встановлення зв’язку завершено. Для інших з’єднувачів це означає, що операції send або sendto будуть виконані без блокування. Параметр error_socks – це покажчик на набір з’єднувачів, контрольованих на помилки. У деяких реалізаціях цей аргумент ідентифікує список з’єднувачів, позначених як пріоритетні. З’єднувач позначається як пріоритетний, якщо опція SO_OOBINLINE=FALSE. На випадок помилки оператор select зазначає з’єднувач, де це сталося. select працює лише з тими з’єднувачами, які були виділені за допомогою масок. При успішному виконанні оператор повертає число з’єднувачів, готових до операцій введення/виводу і модифікує коди масок у відповідності з станом з’єднувачів. Прикладна програма може використовувати результати виклику оператора select, аналізуючи отримані коди масок. Аргумент max_time визначає максимальний час, виділений select для завершення своєї роботи. Для уточнення типу помилки, що виникла при виконанні операції select, можна скористатися процедурою WSAGetLastError.
Іншим важливим є оператором closesocket(s), який закриває канал з’єднувача з однією з сторін. Всі описані вище оператори (крім socket, bind і listen) блокують роботу програми до свого завершення. Практично будь-яка операція, що безпосередньо пов’язана з виконанням процедур вводу/виводу, може блокувати виконання інших прикладних функцій winsock.
Для обслуговування прикладних процесів (наприклад, WWW-сервера, робота з розподіленими базами даних тощо) розроблено багато інших сервісних програм (WINSOCK.DLL), перелік яких представлений у таблиці.
Ім’я команди Призначення
Getdomainname Повертає ім’я домену
Gethostbyname Повертає IP-адресу для заданого мережевого імені.
Gethostname Повертає ім’я ЕОМ (зазвичай її ім’я домену).
Gethostadr Повертає IP-адреса ЕОМ.
Getnetaddr Повертає адресу мережі.
Getnetname Повертає ім’я мережі.
Getpeername Повертає ім’я партнера, підключеного до соединителю.
Getportbyname Повертає ім’я і код протоколу для вказаної назви (наприклад, ICMP, UDP або TCP)
Getportbynumber Повертає ім’я протоколу для зазначеного його коду
Getservbyname Витягує з бази даних назву протоколу і номер порту для зазначеного імені мережевий послуги
Getservbyport Повертає ім’я мережевий послуги для заданого номера порту
Getsockname Повертає місцевий адреса з’єднувача.
Getsockopt Запитує інформацію про з’єднувачі.
Htonl Перетворює порядок байтів 32-розрядного коду з машинного у мережній.
Htons Перетворює порядок байтів 16-розрядного коду з машинного у мережній.
inet_addr Перетворює символьну рядок IP-адреси з десятково-точкового формату в 32-розрядний код з мережевим порядком байтів.
inet_ntoa Перетворює IP-адресу в десятково-точковий формат.
Ioctlsocket Управляє параметрами з’єднувача, пов’язаними з обробкою операцій вводу/виводу.
Ntohl Перетворює порядок байтів 32-розрядного коду з мережевого в машинний.
Ntohs Перетворює порядок байтів 16-розрядних кодів з мережевого в машинний.
Ethostname Встановлює ім’я ЕОМ.
Setsockopt Встановлює опції з’єднувача.
Socketpair Генерує пару з’єднувачів.
Море IT – Інтернет портал