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


. Использование сокетов через события Windows


Функция select введена в библиотеку WinSock для совместимости с аналогичными библиотеками других платформ. Для программирования в Windows более мощной является функция WSAAsyncSelect, которая позволяет отслеживать состояние сокетов с помощью сообщений Windows. Таким образом, вы сможете получать сообщения в функции WndProc, и нет необходимости замораживать работу программы для ожидания доступности сокетов.

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

int WSAAsyncSelect ( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent );

Рассмотрим каждый параметр:

  • s — сокет, события которого необходимо ловить;
  • hWnd — окно, которому будут посылаться события при возникновении сетевых сообщений. Именно у этого окна (или родительского) должна быть функция WndProc, которая будет получать сообщения;
  • wMsg — сообщение, которое будет отсылаться окну. По его типу можно определить, что это событие сети;
  • lEvents — битовая маска сетевых событий, которые нас интересуют. Этот параметр может принимать любую комбинацию из следующих значений:

  • FD_READ — готовность к чтению;
  • FD_WRITE — готовность к записи;
  • FD_OOB — получение срочных данных;
  • FD_ACCEPT — подключение клиентов;
  • FD_CONNECT — соединение с сервером;
  • FD_CLOSE — закрытие соединения;
  • FD_QOS — изменения сервиса QoS (Quality of Service);
  • FD_GROUP_QOS — изменение группы QoS.

Если функция отработала успешно, то она вернет значение больше нуля, если произошла ошибка — SOCKET_ERROR.

Функция автоматически переводит сокет в неблокирующий режим, и нет смысла вызывать функцию ioctlsocket.

Вот простой пример использования WSAAsyncSelect:

WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE);

После выполнения этой строчки кода окно hWnd будет получать событие wMsg каждый раз, когда сокет s будет готов принимать и отправлять данные. Чтобы отменить работу события, необходимо вызвать эту же функцию, но в качестве четвертого параметра указать 0:

WSAAsyncSelect(s, hWnd, 0, 0);

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




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



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