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


Обмен данными - часть 2


  • dwBufferCount — количество структур в параметре lpBuffers;
  • lpNumberOfBytesSent — количество переданных байт для завершенной операции ввода/вывода;
  • dwFlags — определяет метод отправки и может принимать такие же значения, как и параметр dwFlags функции send;
  • pOverlapped и pCompletionRoutine — задаются при использовании пере-крытого ввода/вывода (overlapped I/O). Это одна из моделей асинхронной работы сети, поддерживаемой WinSock.
  • Если функция send (или WSASend) отработала успешно, то она вернет количество отправленных байт, иначе — значение —1 (или константу SOCKET_ERROR, которая равна -1). Получив ошибку, вы можете проанализировать ее с помощью функции WSAGetLastError:

    • WSAECONNABORTED — соединение было разорвано, или вышло время ожидания или произошла другая ошибка;
    • WSAECONNRESET — удаленный компьютер разорвал соединение, и вам необходимо закрыть сокет;
    • WSAENOTCONN — соединение не установлено;
    • WSAETIMEDOUT — время ожидания ответа вышло.

    Для получения данных используются функции recv и WSARecv (для второй версии WinSock). Функция recv выглядит следующим образом:

    int recv ( SOCKET s, char FAR * buf, int len, int flags );

    Параметры очень похожи на те, которые описаны для функции send:

    • s — сокет, данные которого надо получить;
    • buf — буфер, в который будут помещены принятые данные;
    • len — длина буфера в параметре buf;
    • flags — флаги, определяющие метод получения. Здесь можно указывать сочетание из следующих значений:

    • 0 — флаги не указаны;
    • MSG_PEEK — считать данные из системного буфера без удаления. По умолчанию считанные данные стираются из системного буфера;
    • MSG_OOB — обработать срочные данные out of band.

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




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



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