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


Обмен данными


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

Сразу замечу, что функции создавались тогда, когда еще не было даже разговоров о UNICODE (универсальная кодировка, позволяющая работать с любым языком). Поэтому, чтобы отправить данные в этой кодировке, нужно привести их к типу char*, а длину умножить на 2, потому что каждый символ в UNICODE занимает 2 байта (в отличие от ASCII, где символ равен одному байту).

Чтобы принять данные, нужно их сначала отправить. Поэтому начну рассмотрение функций обмена данными с этого режима. Для передачи данных серверу существуют функции send и WSASend (для WinSock2). Функция send выглядит следующим образом:

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

Функция передает следующие параметры:

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

  • 0 — флаги не указаны;
  • MSG_DONTROUTE — отправляемые пакеты не надо маршрутизировать. Если транспортный протокол, который отправляет данные, не поддерживает этот флаг, то он игнорируется;
  • MSG_OOB — данные должны быть отправлены вне очереди (out of band), т.е. срочно.

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

int WSASend ( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE );

Рассмотрим параметры этой функции:

  • s — сокет, через который будет происходить отправка данных;
  • lpBuffers — структура или массив структур типа WSABUF. С этой структурой вы познакомились, когда рассматривали функцию connect. Эта же структура использовалась для отправки данных во время соединения;



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



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