Корисні зауваження щодо winsock - Офіційний сайт компанії Гаджет Діжитал Зон
| Лише за успішної реалізації всіх перелічених у першій частині статті операцій може розпочатися обмін даними з допомогою звичайно програмування. Для пересилання даних можна використовувати команди write, read, send, recv. Команди write та read мають форму виклику: |
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 мережах
R=sendto(s, msg_buf, buflen, flags, adr_struc, adr_struc_len)
Або recvfrom(s, msg_buf, buflen, flags, adr_struc, adr_struc_len),
R=sendmsg(s, msg_struc, flags) [або recvmsg(s, msg_struc, flags)],
Взаємодія операторів 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), перелік яких представлений у таблиці.