kolobok0 0 14 мая, 2015 Опубликовано 14 мая, 2015 · Жалоба Выходит надо учитывать переменную ret. Это число реально переданных байт..... заголовка к каждой части посылки остается открытым. 1) я пытался обратить Ваше внимание на ПРИЁМ. Т.е. Не факт, что к Вам пришло все 2048 байт! 2) На передаче, если кол-во переданных байт НЕ равно реально переданных - то это ОДНОЗНАЧНО ошибка канала. Т.е. нехватка памяти, разрыв и т.д.. 3) По заголовку странный вопрос. Т.к. его очень просто проверить в любом php каком нить и джэльтменском наборе писателя вэбовских дел типа дэнвера. И сетевого анализатора. Этого полностью достаточно для детального ковыряния и быстрого достижения цели(на самом деле хватает ышо меньше - анализатора и любого инет броузера) Если у Вас по логике HTTP уровня должен отдаваться заголовок - значит да. Если нет - значит нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr_smit 0 17 мая, 2015 Опубликовано 17 мая, 2015 · Жалоба И всё равно я не могу передать изображение :( Взял png изображение размером 2179 байт. Открыл через HEX редактор. Создал массив байт: const char Img [2179] = { 0x89,0x50,0x4E,0x47,0x0D... ... }; И пробую передать по запросу в браузер. В состоянии http_state[sn]==HTTP_IDLE формирую заголовок: if(strcmp(url,"/test.png")==0) { strcpy((char*)buf,http_200); strcat((char*)buf, http_server); strcat((char*)buf,"Connection: close\r\n"); strcat((char*)buf,"Content-Length: "); itoa(sizeof(Img),str); strcat((char*)buf,str); strcat((char*)buf,"\r\n"); strcat((char*)buf,"Content-Type: image/png\r\n"); strcat((char*)buf, http_header_end); header_sz=strlen((char*)buf); http_state[sn]=HTTP_SENDING; } В состоянии http_state[sn]==HTTP_SENDING отправляю изображение по частям: if(http_state[sn]==HTTP_SENDING) { ret = send(sn,buf,header_sz); // заголовок ret = send(sn,&Img[0],2048); // первые 2048 байт изображения ret = send(sn,&Img[2048],130); // остаток HTTP_reset(sn); disconnect(sn); } В итоге при обращении по адресу 192.168.1.25/test.png браузер показывает изображение, но только эти первые 2048 байт. Последние байты не отображаются. Т.е. не передаются. Я не понимаю почему так. Хоть убейте. Почему при вызове функции send второй раз она ничего не передает?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 18 мая, 2015 Опубликовано 18 мая, 2015 (изменено) · Жалоба Опять же, попробуйте так: send_bytes: integer; .... send_bytes = 0; tmp = send(sn,buf,header_sz); // заголовок if (tmp < 0) { break; }; // Если ошибка - выход. while (send_bytes < sizeof(Img)) { tmp = (sizeof(Img) - send_bytes); // Пытаемся отправить по максимуму tmp = send(sn,&Img[send_bytes],2048); // первые 2048 байт изображения if (tmp < 0) { break; }; // Опять же, если ошибка.... // Если дошли до сюда... send_bytes += tmp; }; ... close(sn); PS: Рекомендую использовать отладку, чтобы видеть, что происходит. До закрытия сокета браузер будет пытаться получить картинку - это нормально - он ожидает ответа сервера (а сервер может задуматься). Если кажется, что код слишком компактно написан - разверните операторные скобки и ставьте точки останова на процедуре выхода (break;). Изменено 18 мая, 2015 пользователем AlanDrakes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться