ІНТЕРФЕЙС WINDOWS SOCKETS - Студопедія

Сокети, датаграми та канали зв'язку

У локальних і світових мережах є два принципово різних методу передачі.

Перший з них передбачає посилку пакетів даних від одного вузла іншому (або відразу кільком вузлам) без отримання підтвердження про доставку і навіть без гарантії того, що пакети, що передаються, будуть отримані в правильній послідовності. Прикладом такого протоколу може бути протокол UDP (User Datagram Protocol), який використовується в мережах TCP/IP, або протокол IPX, який є базовим у мережах Novell NetWare.

Основні переваги датаграмних протоколів полягають у високій швидкодії та можливості широкомовної передачі даних, коли один вузол відправляє повідомлення, а інші їх отримують, причому всі одночасно.

Другий спосіб передачі даних передбачає створення каналу передачі між двома різними вузлами мережі. При цьому канал створюється засобами датаграмних протоколів, проте доставка пакетів каналу є гарантованою. Пакети завжди доходять у цілісності та безпеці, причому в правильному порядку, хоча швидкодія виходить у середньому нижче за рахунок посилення підтверджень. Прикладами протоколів, що використовують канали зв'язку, можуть бути протоколи TCP і SPX (протокол NETBIOS допускає передачу даних з як датаграм, і каналів зв'язку).

Для передачі даних з використанням будь-якого з наведених вище способів кожен додаток повинен створити об'єкт, який називається сокетом.

За своїм призначенням сокет найбільше нагадує ідентифікатор файлу (file handle), який потрібен до виконання над файлом операцій читання чи записи. Перш ніж програма, запущена на вузлі мережі, зможе виконувати передачу або прийомданих, воно має створити сокет та проініціалізувати його, вказавши деякі параметри.

Щодо останнього параметра (тип сокету), то існують сокети двох типів. Перший тип призначений передачі даних як датаграм, другий - з допомогою каналів зв'язку.

Ініціалізація програми та завершення його роботи

У процесі ініціалізації програма має зареєструвати себе в бібліотеці WSOCK32.DLL, яка надає програмам інтерфейс Windows Sockets у середовищі операційних систем Microsoft Windows 95 та Microsoft Windows NT.

Для ініціалізації необхідно викликати функцію WSAStartup, визначену таким чином:

int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData);

У параметрі wVersionRequested ви повинні вказати версію інтерфейсу Windows Sockets, необхідну для роботи вашої програми. Старший байт параметра вказує молодший номер версії (minor version), молодший байт – старший номер версії (major version).

Перед викликом функції WSAStartup параметр lpWSAData повинен містити вказівник на структуру типу WSADATA , в яку будуть записані відомості про конкретну реалізацію інтерфейсу Windows Sockets.

У разі успіху функція WSAStartup повертає нульове значення. Якщо відбувається помилка, повертається одне з наступних значень:

ЗначенняОпис
WSASYSNOTREADYМережеве програмне забезпечення не готове до роботи
WSAVERNOTSUPPORTEDФункція не підтримується реалізацією інтерфейсу Windows Sockets
WSAEINVALБібліотека DLL, що забезпечує інтерфейс Windows Sockets, не відповідає версії, зазначеної додатком зазначеної у параметрі wVersionRequested

Нижче мипредставили фрагмент вихідного тексту програми SERVER, яка буде описана нижче, що виконує ініціалізацію інтерфейсу Windows Sockets:

rc = WSAStartup (MAKEWORD(1, 1), &WSAData);

MessageBox(NULL, "WSAStartup Error", "Error", MB_OK);

// Відображаємо опис та версію системи Windows Sockets

// у вікні керування Statusbar

wsprintf(szTemp, "Server use %s %s",

hwndSb = CreateStatusWindow(WS_CHILD WS_VISIBLE

WS_BORDER SBARS_SIZEGRIP, szTemp, hWnd, IDS_STATUSBAR);

У операційних системах Microsoft Windows 95 і Microsoft Windows NT версії 3.51 вбудовано систему Windows Sockets версії 1.1, тому саме це значення ми вказали під час виклику функції WSAStartup .

У наступних кількох рядках щойно наведеного фрагмента коду вміст двох полів структури типу WSADATA відображається у вікні керування Statusbar.

Визначення структури WSADATA та покажчика на неї виглядають так:

typedef struct WSAData

unsigned short iMaxSockets;

unsigned short iMaxUdpDg;

char FAR *lpVendorInfo;

typedef WSADATA FAR *LPWSADATA;

Використані поля szDescription і szSystemStatus після виклику функції WSAStartup містять, відповідно, опис конкретної реалізації інтерфейсу Windows Socket і поточний стан цього інтерфейсу у вигляді текстових рядків.

У полях wVersion та wHighVersion записані, відповідно, версія специфікації Windows Socket, яку використовуватиме програма, і версія специфікації, якій відповідає конкретна реалізація інтерфейсу Windows Socket.

Програма може одночасно створювати кілька сокетів, наприклад, для використання в різних підзавдання одного процесу. У полі iMaxSocketsзберігається максимальна кількість сокетів, яку можна одержати для одного процесу.

У полі iMaxUdpDg записується максимальний розмір пакета даних, який можна надіслати за допомогою датаграмного протоколу UDP .

І, нарешті, поле lpVendorInfo містить покажчик додаткову інформацію, формат якої залежить від фірми-виробника конкретної реалізації системи Windows Sockets.

Перед тим, як завершити свою роботу, програма має звільнити ресурси, отримані в операційній системі для роботи з Windows Sockets. Для виконання цього завдання додаток повинен викликати функцію WSACleanup , визначену так, як показано нижче:

int WSACleanup (void);

Ця функція може повернути нульове значення у разі успіху або значення SOCKET_ERROR у разі помилки.

Для отримання коду помилки ви повинні скористатися функцією з ім'ям WSAGetLastError:

int WSAGetLastError (void);

Функція WSAGetLastError дозволяє визначити код помилки під час невдалого завершення практично всіх функцій інтерфейсу Windows Sockets. Ви повинні викликати її відразу за функцією, що завершилася невдало.

Якщо помилка виникла під час виконання функції WSACleanup , функція WSAGetLastError може повернути одне з наступних значень:

ЗначенняОпис
WSANOTINITIALISEDІнтерфейс Windows Sockets не був проініціалізований функцією WSAStartup
WSAENETDOWNЗбій мережного програмного забезпечення
WSAEINPROGRESSПід час виклику функції WSACleanup виконувалася одна з блокуючих функцій інтерфейсу Windows Sockets

Зробимо невеликі пояснення щодо останньої помилки, наведеної в цьому списку, і код WSAEINPROGRESS .

Деякі функції інтерфейсу Windows Sockets здатні блокувати роботу програми, оскільки вони не повертають керування до завершення. У операційних системах, що використовують витісняючу мультизадачність, до яких належать Microsoft Windows 95 і Microsoft Windows NT, це не призводить до блокування всієї системи. Як ви побачите далі, можна уникнути використання блокуючих функцій, оскільки для них в інтерфейсі Windows Sockets існує заміна.

Чи не знайшли те, що шукали? Скористайтеся пошуком:

Вимкніть adBlock! і оновіть сторінку (F5)дуже потрібно