олить йому (чи ні) і породить новий socket, який буде кінцевою точкою зв'язку. Завдяки цьому, socket, за яким відбувалося прослуховування, не використовується для передачі даних і може перебувати в режимі прослуховування далі, «приймаючи» нових клієнтів.
Опис функцій WinSock.
У більшості випадків використовується версія WinSock 2.х, звичайно звана WinSock 2, тому відмінності невеликі. Останньою популярною версією до другої, був WinSock 1.1. Деякі можуть сказати, що треба використовувати саме цю версію, тому Windows 95 підтримує тільки її, але хто в наші дні користується Windows 95? Тому я рекомендую тобі використовувати WinSock версії 2. Дві основні версії WinSock «проживають» у двох .DLL - wsock32.dll і ws2_32.dll. У першій - версія 1.1, а в другій - WinSock2. У С ++ достатньо підключити windows.h і winsock2.h для використання функцій WinSock у своїй програмі. Далі в матеріалі буде розглянуто WinSock другий версіі.обеспечівает два інтерфейси: API і SPI (Service Provider Interface - Інтерфейс Забезпечення Служб). У цьому матеріалі буде розглянуто тільки API, в ньому містяться всі необхідні функції для використання потрібних протоколів. SPI - інтерфейс, який додає «постачальників
передачі даних »(Data Transport Providers) як, наприклад TCP/IP або IPX/SPX. Також SPI додає «постачальників іменних служб» (Name Space Service Providers), таких як DNS. Але всі ці додавання «прозорі» для користувачів API і не видні ім.
SAStartup і WSACleanupWSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData);
int WSACleanup ();
Перед викликом будь WinSock функції, необхідно ініціалізувати бібліотеку Ws2_32.dll. Це робиться за допомогою WSAStartup. Функція приймає два параметри:
wVersionRequested - Максимальна версія Windows Socket, яку може використовувати зухвала програма. Старший байт містить молодшу частину номера версії, молодший байт містить старшу частину номера версії.
lpWSAData - Покажчик на структуру WSADATA, яка, в результаті виконання функції, міститиме деталі реалізації Windows Sockets.
У разі успішного виконання, функція WSAStartup повертає 0. В іншому випадку повертається один з кодів помилки, наведених у таблиці. Якщо виконання функції WSAStartup закінчилося невдачею, невозіожно визначити код помилки за допомогою WSAGetLastError. Це виходить тому, що у разі збою, бібліотека Ws2_32.dll не завантажиться, і область пам'яті, де зберігається інформація про останню помилку, недоступна. Але при бажанні можна спробувати отримати код помилки за допомогою API функції GetLastError.
Це справедливо для додатків, написаних з використанням молодших версій, для успішної роботи зі старшими версіями бібліотеки. У цьому випадку додаток гарантує доступ тільки до функціональності, сумісної з синтаксису з поточною версією. Для повного доступу до нового синтаксису майбутніх реалізацій додаток повинен повністю відповідати цієї реалізації - Відкомпілювати з новими заголовками файлами, слінковано з новими бібліотеками.
Приклад використання цих функцій: int iReqWinsockVer=2;// Мінімальна необхідна версія
WSADATA wsaData; (WSAStartup (MAKEWORD (iReqWinsockVer, 0), amp; wsaData) == 0)
{
//Перевіряємо якщо старша версія більше або дорівнює необхідної
if (LOBYTE (wsaData.wVersion) gt;=iReqWinsockVer)
{
/* Викликаємо тут різні WinSock функції */
}
{
//Необхідна версія недоступна.
}
//Звільняємо WinSock (WSACleanup ()!=0)
{
//Звільнення не вдалося
}
}
{
//Ініціалізація не вдалася
} ()
SOCKET socket (int af, int type, int protocol);
Функція socket () створює новий socket і повертає його дескриптор. Тип цього дескриптора SOCKET, і він використовується у всіх функціях, що працюють з socketамі. Єдиним недійсним значенням дескриптора socketа є INVALID_SOCKET. Функція приймає три параметри: - address family, так зване, адресне сімейство. Цей параметр накладає певні обмеження на формат використовуються процесом адрес та їх інтерпретацію. Встанови цей параметр в значення AF_INET, щоб використовувати TCP і UDP «сімейство» .- тип створюваного socketа. Використовуй SOCK_STREAM для створення потокового socketа і SOCK_DGRAM для створення дейтаграммного socketа.- протокол, який буде використовуватися socketом. Цей параметр залежить від «адресного сімейства». Щоб створити TCP socket, Вам потрібно вказати IPPROTO_TCP.
Функція повертає дескриптор створеного socketа, або INVALID_SOCKET, якщо що то сталося не так. Функцію socket () можна використовувати таким чином: hSocket;=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (hSocket == INVALID_SOCKET)
{
//Дії у випадку помилки
}
int closesocket (SOCKET s);
Як зрозуміло з назви, ця функція закриває socket. Функція повертає нуль, як...