Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Как вывести в браузер не дожидаясь завершения


Автор: Валерия 20.4.2007, 00:27
Код

#include <stdio.h>
#include <dos.h>

void main(){
    printf("Content-type: text/html\nPragma: no-cache\n\n");

    for (int i=0;i<10;i++){
        printf("TEST<BR>");
        delay(500);
    }
}


Такое в компиляторе работает правильно: каждые пол секунды выводит на экран TEST<BR>
А если я его юзаю как cgi то оно через 5 секунд выводит в браузер сразу всё.
В php есть функция flush() которая выводит содержимое буфера а затем очищает его.
А как быть тут?
Нужно что бы в браузер это выводилось каждые пол секунды.

Автор: azesmcar 20.4.2007, 07:45
как то неправильно это чтобы cgi так долго работал...но все же попробуй вместо printf использовать потоки
Код

#include <iostream>
#include <dos.h>
void main(){
    printf("Content-type: text/html\nPragma: no-cache\n\n");
    for (int i=0;i<10;i++) {
        std::cout << "test<br>" << std::endl;
        delay(500);
    }
}


std::endl сделает тоже самое что и flush()

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

Автор: Валерия 20.4.2007, 21:45
Не выходит.
Выводит только после того как завершается работа скрипта все сразу.

Автор: Валерия 22.4.2007, 19:13
Еще есть какието методы?

Автор: azesmcar 23.4.2007, 08:31
Не лучше написать функцию JavaScript и установить таймер?

Автор: Валерия 23.4.2007, 19:33
azesmcar
Нет, мне нужно именно так smile
У меня будет 
while (1==1){
тут читаем из файла, и если есть новое то выводим в браузер
sleep(10);
}
Тоесть чат без рефреша)
Я на php уже такое писала, но у меня не получилось сделать слип меньше 1 секунды, т.к usleep под виндой не пашет.

Автор: GremlinProg 24.4.2007, 01:21
Я ведь все правильно понимаю, это CGI?

Тут просто нужно учесть, что задержки в работе CGI-скрипта, независимо от языка, не влияют на задержки в браузере. Это просто программка, которая генерирует HTML, который уже потом, после завершения, пересылает его в сеть, этот процесс зависит от HTTP-сервера, на котором CGI запускается. Чтобы фактически создать задержки с выводом в браузере, нужно все таки воспользоваться средствами инлайн-языка, например JavaScript, либо (сумасшедший вариант) пересылать HTML минуя сервер, и то, результат будет зависеть от того, генерирует ли браузер на приемной стороне страничку по факту прибытия чего-либо, либо по факту приема только всего пакета.

Автор: Спец 24.4.2007, 07:26
Цитата(azesmcar @ 20.4.2007,  07:45)
как то неправильно это чтобы cgi так долго работал...


почему не правильно? Где то есть правило?

Добавлено через 5 минут и 18 секунд
Валерия    а че правда чтоли на php эт сделать можно?
Помоему процедура происходит так, браузер читает из соккета, и если данные зкончились, то ставит завершаю нуль в конце всех принятых данных, и выводит их.. 
а задумка с чатом не плохая.. ток технологии нынешные не позволят тебе это сделать, а если и позволят /* сомневается */ то всё будет жудко тормозить

Автор: Спец 24.4.2007, 07:43
хотя, я не выспался просто.. Валерия, смотри, ты когда запускаеш exe. через веб сервер, то копия этого exe файла грузится в оперативку и выполняет (причем твой выполняется вечноsmile), а если кто-нибуть еще запустит его (т.е. войдет в чат) создастся еще одна копия и .т.д. лучше на php пиши, проще намного и всё уже сделанно

Автор: nerezus 24.4.2007, 07:51
Код

fflush(stdout);

Автор: Yama 24.4.2007, 14:33
Цитата(Валерия @  20.4.2007,  00:27 Найти цитируемый пост)
Такое в компиляторе работает правильно: каждые пол секунды выводит на экран TEST<BR>
А если я его юзаю как cgi то оно через 5 секунд выводит в браузер сразу всё.

Проблема в том, что CGI-скрипты рендерят страничку и только после рендеринга выводят ее на экран. Т.е. у тебя страничка генерится 2.5+ секунды из-за задержек, и только потом выводится на экран. Что бы сделать то, что ты хочешь, надо юзать джава-скрипт или ajax(если надо динамически подгружать данные на страницу).

Автор: Валерия 24.4.2007, 15:39
Я уже юзала джаваскрипт, причем можно сказать свой аджакс писала)
Но ведь мне нужно именно то что я спросила.
Раз нельзя так нельзя... 

Автор: Yama 24.4.2007, 15:51
Цитата(Валерия @  24.4.2007,  15:39 Найти цитируемый пост)
Раз нельзя так нельзя...  

То, что ты хотела сделать, это раз в 5 секунд отправлять с сервера пакет клиенту, но по своей сути протокол хттп не предостовляет возможности серверу посылать запросы клиенту. Любая интерактивнасть, которую ты видишь на веб-страничках, достигается либо gif-flash- анимацией и различными запросами по таймеру или событию, которыее генерят скрипты на странице.

P.S. да, и 1 совет: слезай с CGI .  В мире веб-технологий CGI-скрипты - это начало позапрошлого века  smile . Но это уже другая тема.  . Удачки. smile 

Автор: Валерия 25.4.2007, 16:55
Я только пытаюсь залезть на него)))
А поповоду http протокола - бред.
В php вот такое пашет на ура:
<?
for ($i=0;$i<5;$i++){
echo $i;
flush();
}
?>

Автор: Kipter 2.5.2007, 02:00
Не все серверы тебе разрешат держать постоянное соеденение с браузером, не все браузеры будут постоянно держать соеденение с сервером и т д, есть тайм-ауты и соеденение когда то будет разорвано.... может быть и такое =)
лучше постарайся обойтись средствами JavaScript и всетаки промежутками с сервера брать новые сообщения
а в чат фрейм добавлять каким нить .innerHTML+= newMessage;
а обновлять скрытый iframe....

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

Yama
так какие же технологии использовать сейчас?
давайте начнем дискуссию....
http://forum.vingrad.ru/forum/topic-149115/anchor-entry1118874/0.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)