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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Просто загрузить и вывести txt файл по http 
:(
    Опции темы
GrayCardinal
Дата 27.4.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



Валерия, 
Тем что они для этого предназначены smile


--------------------
PM MAIL WWW   Вверх
Валерия
Дата 27.4.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так что поповоду того что бы вывести не 4096 байт а все?
Даже если я подряд пишу несколько раз read  - выводит одно и тоже, заголовок и кусочек html
PM MAIL   Вверх
MAKCim
Дата 27.4.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Валерия @  27.4.2008,  14:35 Найти цитируемый пост)
Так что поповоду того что бы вывести не 4096 байт а все?

Код

ssize_t size;
while ((size = read(socket_fd, buffer2, 4096)) > 0)
    write(STDOUT_FILENO, buffer2, size);



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



Разобралась, всем спасибо, особенно MAKCim))
Еще такой вопрос в догонку, если я не знаю сколько будет весить страничка, то что бы не выделять сильно много буфера, как при каждом записывании n байт в него, всё время увеличивать значение all?
PM MAIL   Вверх
MAKCim
Дата 27.4.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Валерия @  27.4.2008,  19:49 Найти цитируемый пост)
как при каждом записывании n байт в него, всё время увеличивать значение all? 

что за all?
что за буфер?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



Цитата(MAKCim @  27.4.2008,  20:19 Найти цитируемый пост)
что за all?что за буфер?

Упс, я до этого сообщение набрала что не получалось, но потом сама разобралась и не отправила smile
Код

    char host[] = "ya.ru";
    char path[] = "/";

    struct sockaddr_in addr;
    struct hostent * hostent;
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    hostent = gethostbyname(host);
    addr.sin_addr.s_addr = *(u_int32_t*)hostent -> h_addr;
    connect(socket_fd, (const struct sockaddr*)&addr, sizeof(struct sockaddr_in));


    char all[100000] = "";
    char buffer[4096] = "";
    strcat(buffer, "GET ");
    strcat(buffer, path);
    strcat(buffer, " HTTP/1.1\r\n");
    strcat(buffer, "Host: ");
    strcat(buffer, host);
    strcat(buffer, "\r\n\r\n");

    char buffer2[4096]; 

    ssize_t size;
    send(socket_fd, buffer, strlen(buffer), 0);

    while ((size = recv(socket_fd, buffer2, 4096, 0)) > 0 ){
        strcat(all, buffer2);
    }
    printf("%s", all);
    return 0;

Так вот, если я пишу all[100000] то выделяет 100 кб под это дело, а мне нужно что бы переменная all по мере забития в неё bufer2 постоянно увеличивалась)
Да и оператор new не пашет(
Для него подключать нужно что то?
И вообще, лучше всего киньте ссылкой на е-книгу на русском по программингу под линукс, а то я раньше писала под dos на турбо си, так не всё катит здесь что катило там...
PM MAIL   Вверх
MAKCim
Дата 28.4.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Валерия @  27.4.2008,  21:19 Найти цитируемый пост)
Так вот, если я пишу all[100000] то выделяет 100 кб под это дело, а мне нужно что бы переменная all по мере забития в неё bufer2 постоянно увеличивалась)

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

Цитата(Валерия @  27.4.2008,  21:19 Найти цитируемый пост)
Да и оператор new не пашет(

да ну?  smile 

используй malloc() и связный список буферов
Цитата(Валерия @  27.4.2008,  21:19 Найти цитируемый пост)
И вообще, лучше всего киньте ссылкой на е-книгу на русском по программингу под линукс, а то я раньше писала под dos на турбо си, так не всё катит здесь что катило там... 

воспользуйся поиском, не раз тема поднималась


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 28.4.2008, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



Валерия, 
1. В данном случае нельзя юзать strcat
2. Да и оператор new не пашет
Скорее всего используется gcc (Си компилер), вместо g++ (Си++ компилер).
3 Так вот, если я пишу all[100000] то выделяет 100 кб под это дело, а мне нужно что бы переменная all по мере забития в неё bufer2 постоянно увеличивалась)
Кто мешает написать примитивную функтяру изменения размера с сохранением данных ? 
Я, правда, в данном случае (HTTP GET) просто использовал временный файл.

Цитата

используй malloc() и связный список буферов

Тоже вариант.

Это сообщение отредактировал(а) GrayCardinal - 28.4.2008, 09:50


--------------------
PM MAIL WWW   Вверх
GrayCardinal
Дата 28.4.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



ЗЫ
код возврата системных вызовов лучше всё-таки проверять smile


--------------------
PM MAIL WWW   Вверх
Валерия
Дата 28.4.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо smile
Тут кстати проблемка возникла:

Код

            struct sockaddr_in addr;
    struct hostent * hostent;
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    hostent = gethostbyname(host);
    addr.sin_addr.s_addr = *(u_int32_t*)hostent -> h_addr;
    connect(socket_fd, (const struct sockaddr*)&addr, sizeof(struct sockaddr_in));

    char big[100000]="";
    char request[4096] = "";
    strcat(request, "GET ");
    strcat(request, path);
    strcat(request, " HTTP/1.1\r\n");
    strcat(request, "Host: ");
    strcat(request, host);
    strcat(request, "\r\n\r\n");

    char buffer2[4096]; 

    ssize_t size;
    send(socket_fd, request, strlen(request), 0);

    while ((size = recv(socket_fd, buffer2, 4096, 0)) > 0 ){
        strcat(big, buffer2);
    }


Работает но с багом, если страница больше 4х килобайт, то последний блок два раза запишет в big.

Добавлено через 5 минут и 39 секунд
И кстати, есть под си какаято библиотека с нормальной работой строк?
Ну тоесть

string mystr;
string s="dddd";
mystr = "abb" + s + "bbb";
типа такого)
PM MAIL   Вверх
MAKCim
Дата 28.4.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Валерия @  28.4.2008,  18:03 Найти цитируемый пост)
Работает но с багом, если страница больше 4х килобайт, то последний блок два раза запишет в big.

на каждой итерации нужно записывать в big size байт
Код

void * ptr = big;
while ((size = recv(socket_fd, buffer2, 4096, 0)) > 0 ){
        memcpy(ptr, buffer2, size);
        ptr += size;
}
*(char*)ptr = '\0';



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 28.4.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Валерия @  28.4.2008,  17:03 Найти цитируемый пост)
mystr = "abb" + s + "bbb";
типа такого) 

в Си нет объектов и перегрузки операторов smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
kirjanov
  Дата 28.4.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

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



Цитата(JackYF @  28.4.2008,  19:52 Найти цитируемый пост)
в Си нет объектов

А поименованную область памяти в C можно назвать объектом?)

string можно и через препроцессор сделать, а вместо '+' макрос добавить с подходящим именем smile

Это сообщение отредактировал(а) kirjanov - 28.4.2008, 21:18
PM MAIL   Вверх
quasi
  Дата 6.5.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как получить файлики определенного типа, например графические gif. jpg, png... etc Т.е. всю страничку не нужно, нужно только файлики нттп запросом, подскажите?!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

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


 




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


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

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