Перейти к содержанию
    

Сервер На Wiznet W5500, передать изображение

Выходит надо учитывать переменную ret. Это число реально переданных байт..... заголовка к каждой части посылки остается открытым.

 

1) я пытался обратить Ваше внимание на ПРИЁМ. Т.е. Не факт, что к Вам пришло все 2048 байт!

2) На передаче, если кол-во переданных байт НЕ равно реально переданных - то это ОДНОЗНАЧНО ошибка канала.

Т.е. нехватка памяти, разрыв и т.д..

3) По заголовку странный вопрос. Т.к. его очень просто проверить в любом php каком нить и джэльтменском наборе

писателя вэбовских дел типа дэнвера. И сетевого анализатора. Этого полностью достаточно для детального ковыряния и быстрого

достижения цели(на самом деле хватает ышо меньше - анализатора и любого инет броузера) Если у Вас по логике HTTP уровня

должен отдаваться заголовок - значит да. Если нет - значит нет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И всё равно я не могу передать изображение :( Взял 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 байт. Последние байты не отображаются. Т.е. не передаются.

post-51457-1431877831_thumb.png

Я не понимаю почему так. Хоть убейте. Почему при вызове функции send второй раз она ничего не передает??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опять же, попробуйте так:

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;).

Изменено пользователем AlanDrakes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...