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


Анализ примера - часть 2


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

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

Если отправлены еще не все данные, то на следующем шаге функция попытается отправить следующую порцию.

Вы также не сможете и принять сразу большую порцию данных. Поэтому необходимо таким же образом запустить цикл, в котором будет приниматься большая порция данных. Но как определить, насколько велик этот кусок данных? Ведь при отправке известно количество данных, а при приеме — нет.

Решить эту проблему очень просто. Прежде чем отсылать данные, вы должны сообщить принимающей стороне количество байт, которые подлежат пересылке. Для этого должен быть заведомо определен протокол передачи данных. Например, когда приходит команда get, то после нее определенное количество байт можно отвести под значение размера отправляемых данных. Перед самими данными можно отправить команду data. Таким образом, клиент будет знать, сколько ему ожидать данных, и сможет получить их полностью. Код приема данных может выглядеть, как в листинге 4.15.

Листинг 4.15. Алгоритм получения данных большого объема
char szBuff[4096]; int nSendSize = 1000000; int iCurrPos = 0;

while(nSendSize >0) { int ret = recv(sock, &szBuff[iCurrPos], nSendSize, 0); if (ret == 0) break; else if (ret == SOCKET_ERROR) { // Произошла ошибка MessageBox(0, "Send failed", "Error", 0); break; } nSendSize -= ret; iCurrPos += ret; }


 




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



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