Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HTTP сервер 
:(
    Опции темы
Сириус
  Дата 16.4.2007, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Здравствуйте
У меня в следующем проблема:

написал сервер  (на локальном компе 127.0.0.1 на порт 80)
Теперь когда клиент на сервер идет, устанавливается соединение и я ему посылаю картинку. 
Вот как я это делаю 

strcpy(szSendBuff, "<h2>hello</h2><img src='/mesto kartinki na moem kompe/pic1.jpg'>");
ret= send(sock, szSendBuff,strlen(szSendBuff),0);

Картинка отображается, но мне сказали что токо потау!! (ВНИМАНИЕ) что это работает на локальном компе, еслиб из ругого компа подключились, то у них картинка не отобразилась бы, мол это делается уже по иной структуре 
И сказали про след.  структуру:...
В начале идет просто запрос с картинкой

strcpy(szSendBuff, "<h2>hello</h2><img src='/адреса нет/pic1.jpg'>");
а потом клиент должен отправить ответ запрос что мол где находится картинка и я должен дальше отправить уже адрес.
 Прошу помочь..разьяснить все эти моменты. И еще один момент

когда я вместо картинки скажем пошлю апплет , указав его место на своем компе (в данном случае в текущем каталоге)

strcpy(szSendBuff, "<center><applet code='WelcomeApplet.class' width='400' height='100'></applet></center>");

то он должен как и картинку е го показать (хотя бы потаму что мы на локальном компе сервер наш),
но апплет не показывает..(с апплетом вообще-то все ок, в отдельном html доке он нормально отображается, а так черер запрос - нет) Почему?.. Вот..очень прошу помочь.

код не особо важен..но все же..

Код


    while(1)
    {


        ret=recv(sock,szRecvBuff, 1024, 0);
        if(ret==0)
            break;
        else if(ret== SOCKET_ERROR)
        {
            MessageBox(0, "Ne poluchili infu", "Error", 0);
            break;
        }
        szRecvBuff[ret]='\0';

        //strcpy(szSendBuff, "<h2>hello</h2><img src='pic1.jpg'>");
     strcpy(szSendBuff, "<center><applet code='WelcomeApplet.class' width='400' height='100'></applet></center>");
    //    strcpy(szSendBuff, "</applet></center></html>");
    

        ret= send(sock, szSendBuff,strlen(szSendBuff),0);
        if(ret==SOCKET_ERROR)
        {
            break;
        }

        
        
        ret=recv(sock,szRecvBuff, 1024, 0);
/*
        if(ret==0)
            break;
        else if(ret== SOCKET_ERROR)
        {
            MessageBox(0, "Ne poluchili infu", "Error", 0);
            break;
        }
        szRecvBuff[ret]='\0';
        
        cout<<szRecvBuff<<endl;

*/
        break;
    }


Это сообщение отредактировал(а) Сириус - 16.4.2007, 19:58
PM MAIL   Вверх
likehood
Дата 16.4.2007, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Совет: почитай повнимательней документацию по http и включи здравый смысл.
Как по-твоему картинка попадет на удаленный комп? Клиент должен послать get-запрос с адресом картинки, а сервер должен в ответе вернуть ему эту картинку, именно саму картинку, а не ее адрес (за подробностями обращайся к спецификации http). С апплетом тоже самое: код апплета нужно передават в ответ на запрос клиента. Кстати, на локальном машине твой апплет не работает скорее всего потому, что клиент не может его найти (ты ведь не указывал полный путь к файлу апплета).
PM MAIL   Вверх
Сириус
Дата 17.4.2007, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Странно, я читал что можно в поле Location: ставить скажем файл или тип MIME и тогда сервер оттуда сам вытащит и даст клиенту.
Ну ладно, но как у меня придет запрос на картинку?..в начале идет обычный запрос..(при соединении). Потом должен идти ответ от сервера типа с кодом состояние 300-399 что означает что клиент должен переадресовать свой запрос, и уже на картинку, чтоб я ему потом ее послал. Так? Ну ладно..пойду читать RFC. Просто его очень много по HTTP, если вдруг знаешь наизусть и можешь привести пример запросов - ответов именно с вариантом картинки или апплета (апплет там полный путь указан кстати) , то пожалуйста..
PM MAIL   Вверх
ptr
Дата 17.4.2007, 16:03 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



А при чём здесь HTTP? Протокол HTTP служит для передачи данных. Надо читать спецификацию не HTTP, а HTML.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Сириус
Дата 17.4.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Неужели никто не разбирается  в этом деле?..
likehood ptr написал сервер на С++. Он ждет подключений на 80 порт. Когда кто-то набирает ( у меня на компе) адрес 127.0.0.1 то подключается к моему жалкому серверу. И тут мой невероятно сложнейший вопрос.....Как сделать вывод картинок (если больше чем одна, да даже хотя бы одну). ? Когда клиент (в данном случае браузер IE) подключается к серверу, он посылает запрос. Могу привести код запроса, но стандартный запрос, ничего особого. Теперь, сервер должен послать ему тАКОЙ отклик чтоб могла отобразится моя картинка, я пробовал разными способами и RFC читал, но не получается. . Фуф.. smile 
Какой отклик слать чтобы клиент получил чертову картинку <img src='adres/pic1.jpg'>  и при этом чтоб еще одну мог получить картинку?..надеюсь никто не сердиться на вопрос. 
     
PM MAIL   Вверх
ptr
Дата 18.4.2007, 15:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Клиент(IE) тебе шлёт GET запрос. Тебе лишь нужно правильно его обрабатывать.
Например:
Запрос
Код

GET /pic1.jpg HTTP/1.1
Host: adres
Connection: close


Ответ
Код

HTTP/1.1 200 OK
Accept-Ranges:    bytes    
Content-Length:    654
Connection:    close
Content-Type:    image/jpg

<<Content>>

Картинку кстати надо читать как бинарный файл.
Да и чтобы посмотреть реальные запросы/ответы можно воспользоваться http://web-sniffer.net/.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Сириус
Дата 19.4.2007, 03:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Спасибо ptr ! Но дело в том что клиент не посылает мне этого запроса..он даже не в курсе что у меня картинка есть..вот в этом вся проблема, я должен ему как-то сообщить что имею картинку, чтоб потом он послал запрос на эту картинку. Я пробовал, но у меня не получается..первый запрос идет на общую страничку.. ( / или скажем index.html ), вот как сообщить клиенту, чтоб он запрос кинул на картинку, чтоб потом я ему его послал. Я пробовал перенаправление запроса типа с кодом 303, указывая  smile   Location: путь к картинке у себя на компе (по сути это ничего не должно говорить клиенту, за исключением того что надо послать запрос на получение картинки) но ничего не выходит.
 smile Помогите 
PM MAIL   Вверх
likehood
Дата 19.4.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Клиетну ничего сообщать не надо. Если на главной страничке index.html есть ссылка на картинку и если в браузере не отключен показ рисунков, клиент обязательно запросит картинку.
PM MAIL   Вверх
GremlinProg
Дата 24.4.2007, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



Сириус, ты когда-нибудь видел в коде HTML локальнуе пути? Т.Е что-то типа того:
<IMG SRC="C:\My Pictures\Picture.jpg">
likehood, верно говорит, включи здравый смысл. Запрос твой сервер не принимает, потому что ты редиректишь клиента черти-куда, он(клиент) даже не пытается ни чего спрашивать у сервера, потому что просто игнорирует неправильный ответ.(не трогай location)

Организуй анализ запроса клиента, при запросе типа GET / посылай ему свой текст HTML, при запросе типа GET /Picture.jpg посылай ему этот жипех файл в БИНАРНОМ виде. Не пробуй сразу использовать все возможности спецификации, двигайся постепенно, тогда все получится.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Сириус
Дата 24.4.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



GremlinProg, likehood, ptr  спасибо и вам за то что отозвались, 
Просто я уже по всякому пробую, сразу нападать не надо. Я с самого начала посылал ХТМЛ страницу на первый запрос GET, 
вот в таком виде 
Код

strcpy(szSendBuff, "<html><body><img src='ist2_2229748_snowflakes.jpg'></body></html>");
ret= send(sock, szSendBuff,strlen(szSendBuff),0);

Я уже 100 раз говорил, а вы мне 100 раз предлагаете включить здравый смысл. Очень ценный совет..
На такой запрос в ответ не идет никакого запроса на картинку. 
Я пробовал по всякому..скажем так src="http://127.0.0.1/ist2_2229748_snowflakes.jpg" , вообще без разницы, не посылается запроса на картинку. Я думаю что скорее всего делаю какую-то грубую синтаксическую ошибку. Может быть не просто посылать html код надо, а в формате его отлкика (ну там типа первая строчка HTTP/1.1 200 (или 303 как я пробовал) OK\r\n и так далее по формату).
Так тоже пробовал, но нет реакций.

#define    m "HTTP/1.1 200 OK\r\n Content-length:40\r\n Content-Type: image/jpeg; charset=windows-1251\r\n<img src='ist2_2229748_snowflakes.jpg'>\r\n"
Тут наверное ошибка, как я понимаю, после этого отклика должен приходить запрос на картинку ist2_2229748_snowflakes.jpg..и размер Content-length точный. Вот..

strcpy(szSendBuff, m);

    

        
PM MAIL   Вверх
GremlinProg
Дата 24.4.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



Цитата(Сириус @  24.4.2007,  15:01 Найти цитируемый пост)
#define    m "HTTP/1.1 200 OK\r\n Content-length:40\r\n Content-Type: image/jpeg; charset=windows-1251\r\n<img src='ist2_2229748_snowflakes.jpg'>\r\n"

Правильно понимаешь

1. Заголовки и контент должны разделяться двумя переводами строки \r\n\r\n (я вообще везде вместо \r\n использую только \n, так проще и структура пакута понятнее)

Добавлено через 6 минут и 33 секунды
2. Может повторюсь, но картинка должна посылаться в бинарном виде!!! т.е. вместо <img src='ist2_2229748_snowflakes.jpg'> тут должно быть содержимое файла жипега (да да, именно содержимое, открываем файл, читаем его размер, выделяем буфер, читаем его в буфер, посылаем его содержимое)

3. Content-length, соответственно должен содержать размер файла, который ты посылаешь, а не длину строки <img src='ist2_2229748_snowflakes.jpg'>. Об этой строку вообще забудь, её не должно быть.


ЗЫ: оказывается Ctrl-Enter тут сабмитит ответ, буду знать ))

Добавлено через 11 минут и 9 секунд
В принципе, первый пункт - это решение проблемы с ответом, но HTTP/1.1, это не то же самое, что HTTP/1.0, работают они по-разному, попробуй, по крайней мере на первое время, использовать HTTP/1.0.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 24.4.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



Чтобы проверить работоспособность сервера посылаю небольшую утилитку "MegaHttpExtractor", здесь архив из 2-х частей, делал на делфи, поэтому размер почти 400 Кб. Все по-русски и одна кнопка-грабер, думаю разберешся. 

"Адрес" можно вводить как числовой, так и доменный,
"Порт" - пиши свой,
"Запрос" по-умолчанию - стандартный "GET / HTTP/1.0" , тут так же можно экспериментировать
"Отправляемые заголовки" - соответственно, список клиентских заголовков, если нужно, можешь добавлять, они будут встроены автоматически, синтаксис, как в стандарте: одна строка - один заголовок.
"Приходящие заголовки" - соответственно, список всех заголовков, приходящих с сервера
Ну, и "контент", куда ж без него.

Довльно полезная утилитка при отладке стейт-машины на сервере CGI и/или Socket платформ, по крайней мемре на это она была изначально заточена.

Посмотри как раскрываются готовые сервера, для примера яндекс стоит по-умолчанию.
Если ответа нет несколько секунд, значит неправильно оформил пакет, пробуй иначе, тестируй...

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  MegaHttpExtractor.part1.rar 120,00 Kb


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 24.4.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



ЗЫ: Уже не первый раз приходится резать образы, все таки ограничение сверху в 120к лучше расширить. Где вы видели паскалевские программы такого размера?

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  MegaHttpExtractor.part2.rar 44,58 Kb


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Сириус
Дата 1.5.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Извини GremlinProg , но я не совсем понял, ты говорил 
"при запросе типа GET / посылай ему свой текст HTML, при запросе типа GET /Picture.jpg посылай ему этот жипех файл в БИНАРНОМ виде"  Так вот если все по порядку, у меня нет запроса на картинку, я пытаюсь сделать так чтоб он был!!! Но его нет! ПРосто нет и все тут! Есть запрос на страничку, в ответ на который я должен ему как ты сказал, посылать текст HTML, вот я и слал текст HTML, ожидая что в ответ он уже пошлет мне запрос на картинку, которую я уже пошлю ему в бинарном виде. Так вот..текст html состоит у меня в теге <center> и <img src="..." > чем не HTML текст? Может мне сразу посылать ему картинку в виде бинарном? Но ведь вы все говорили, что сначала должен быть запрос на картинку..вообщем путаница вышла..


Это сообщение отредактировал(а) Сириус - 1.5.2007, 18:48
PM MAIL   Вверх
Kipter
Дата 2.5.2007, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 2.5.2006

Репутация: нет
Всего: нет



Сириус
Тебя сложно понять, кто тебе сказал что браузер не посылает запрос на картинку?
после того как ты вывел ему html текст?

Может просто твоя программа и не ожидает второго запроса?
или неправильно его обрабатывает?

Код в студию где происходит Анализ запроса и формирование на него ответа.
(тоесть там где от клиента к тебе приходит запрос, программа его анализирует и выдает либо текст html, либо картинку)

Причем постарайся выложить весь код цикла обработки запросов...

Добавлено через 4 минуты и 7 секунд
Сириус
да кстати еще вижу ты путаешся в принципе работы HTTP Серверов....
Все что ты видишь в броузере - это все передается только программой-HTTP-сервером....
И HTML текст, и Java апплеты и картинки, и видио, и флеш... все передает программа....
Сами компьютеры тупые.... и они никому ничего не передают =) это делают программа....

Советую тебе сделать вывод на экран входящих запросов при каждой интерации цикла....
и вывод заголовка твоего ответа на это....
отлаживать будет легче....

Добавлено через 10 минут
Цитата(Сириус @  1.5.2007,  18:44 Найти цитируемый пост)
Может мне сразу посылать ему картинку в виде бинарном? Но ведь вы все говорили, что сначала должен быть запрос на картинку..вообщем путаница вышла..

Хочешь сразу картинку?

запрос: http://127.0.0.1/Picture.jpg
будет сразу картинка в броузере по такому запросу... но только если ты так запрограммируешь сво сервер!
он должен понять что если ему пришел запрос /Picture.jpg то он должен проверить существование этого фаила и если он есть... прочитать его и отправить клиенту.... если нет то отправить 404 (ошибку)

кстати программист волен делать что хочет, можно и по запросу http://127.0.0.1/Pig.alakazam.bum-bum
Вывести клинту JPG картинку, все зависит от того как сервер обрабатывает запросы и что шлет в ответ клиенту...

и HTML слать я тебе советую из фаила - проще будет разобраться, считывай фаил HTML из фаила и шли его....
А вообще если будет тебе не сложно то можно почитать исходные коды сервера Apache

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0931 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.