Программирование на C++ глазами хакера


Запуск библиотеки


Прежде чем начать работу с сетью, нужно загрузить необходимую версию библиотеки. В зависимости от этого изменяется набор доступных функций. Если использовать первую версию библиотеки, а вызвать функцию из второй, то произойдет сбой в работе программы. Если не загрузить библиотеку, то любой вызов сетевой функции вернет ошибку WSANOTINITIALISED.

Для загрузки библиотеки используется функция WSAStartup, которая выглядит следующим образом:

int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );

Первый параметр (wVersionRequested) — это запрашиваемая версия библиотеки. Младший байт указываемого числа определяет основной номер версии, а старший байт — дополнительный номер. Чтобы легче было работать с этим параметром, я советую использовать макрос MAKEWORD(i, j), где i — это старший байт, a j — младший.

Второй параметр функции WSAStartup — это указатель на структуру WSADATA, в которой после выполнения функции будет находиться информация о библиотеке.

Если загрузка прошла успешно, то результат будет нулевым, иначе — произошла ошибка.

Посмотрите пример использования функции WSAStartup для загрузки библиотеки WinSock 2.0:

WSADATA wsaData;

int err = WSAStartup(MAKEWORD(2, 0), &wsaData); if (err != 0) { // Tell the user that WinSock not loaded // ( Сказать пользователю, что библиотека не загружена ) return; }

Обратите внимание, что сразу после попытки загрузить библиотеку идет проверка возвращенного значения. Если функция отработала правильно, то она должна вернуть нулевое значение. Приведу основные коды ошибок:

  • WSASYSNOTREADY — основная сетевая подсистема не готова к сетевому соединению;
  • WSAVERNOTSUPPORTED — запрашиваемая версия библиотеки не поддерживается;
  • WSAEPROCLIM — превышен предел поддерживаемых ОС задач;
  • WSAEFAULT — неправильный указатель на структуру WSAData.

Структура WSADATA выглядит следующим образом:

typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+l]; char szSystemStatus[WSASYS_STATOS_LEN+l]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; } WSADATA, FAR * LPWSADATA;




Начало  Назад  Вперед



Книжный магазин