Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
7 / 7 / 1
Регистрация: 12.04.2013
Сообщений: 88

Взять картинку с сервера и сохранить её на диск

10.03.2015, 09:59. Показов 1302. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Вопрос как получить с ya.ru картинку (логотип) и сохранить её на диск?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"rus");
    //WSA
    WORD wVersionRequested;
    WSADATA  wsaData = {};
    DWORD err =0;
    wVersionRequested = MAKEWORD(2,2);
    err  = WSAStartup(wVersionRequested, &wsaData);
    if (err !=0)
    {
        cout << "WSAStartup error" << err << endl;
        return 1;
    }
    /*Создание сокета*/
    SOCKET sockToServer = INVALID_SOCKET;
    sockToServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sockToServer == INVALID_SOCKET)
    {
        cout << "Сокет не создан из-за ошибки: ";
        err = WSAGetLastError();
        cout << err << endl;
        WSACleanup();
        return 1;
    }   
 
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr("213.180.193.3");
    serverAddr.sin_port = htons(80);
    err = connect(sockToServer, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
    if (err == SOCKET_ERROR)
    {
        cout<< "Ошибка соединения с сервером: ";
        cout<< WSAGetLastError<<endl;
        closesocket(sockToServer);
        WSACleanup();
        return 1;
    }
    char *buff = "GET / HTTP/1.1\nHOST: ya.ru\n\n";
    err = send(sockToServer, buff, strlen(buff), 0);
    char buff1[200000]={};
    err = recv(sockToServer, buff1, 200000,0);
    cout << buff1 << endl;
    closesocket(sockToServer); 
    /**/
    cout << "Всё в порядке" << endl;
    WSACleanup();
    return 0;
}
Добавлено через 17 минут
C++
1
char *buff = "GET /images/logo.png HTTP/1.1\nHOST: ya.ru\n\n";
картинку вроде в буффер сохранил, но не уверен что правильно, а вот как сохранить на диск
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.03.2015, 09:59
Ответы с готовыми решениями:

Сохранить картинку на диск
Как сохранить картинку на диск имея её точный адрес? Желательно через CppWebBrowser.

Как сохранить картинку на диск
как мне сохранить картинку которая должна получиться (то что должно поучитьсяэто вложение с картинкой)

Данные с сервера зашифровать, сжать и сохранить на диск
Принцип следующий. Получаешь данные с сервера (oracle) полученные данные сохраняешь на локальном диске в виде файла (в бинарном виде),...

5
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
10.03.2015, 13:17
Цитата Сообщение от Kerry Посмотреть сообщение
а вот как сохранить на диск
Kerry, вот пример, как это может быть реализовано
(воспринимайте его как псевдо код, т.к. я под Linux и использую свою обёртку
над сетевыми функциями для работы с сетью):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cstring>
#include <cstdio>
#include <op/net.hpp> // это моя библиотека для работы с сетью
 
int main() {
    // открываем TCP соединение
    op::TCPSocket sock("213.180.193.3", 80);
    if (sock.isOk() == false) {
        std::cout << "CONNECTION ERROR." << std::endl;
        return 1;
    }
 
    // пишем запрос в сокет
    char req[] = "GET /images/logo.png HTTP/1.1\r\nHOST: ya.ru\r\n\r\n";
    int rc = sock.write_all(req, strlen(req));
 
    // открываем файл на запись
    FILE * fp = fopen("logo.png", "w");
    if (fp == NULL) {
        std::cout << "can't create file" << std::cout;
        return 1;
    }
 
    bool headerIsGone = false;
    char buff[4096], *ptr;
    for (;;) {
        // читаем из сокета
        rc = recv(sock.sd(), buff, sizeof(buff)-1, 0);
 
        // либо дочитали до конца, либо произошла ошибка
        // выходим из цикла
        if (rc <= 0) break;
 
        // проверяем, прочли мы уже часть с HTTP заговками
        if (headerIsGone) {
            // да, тогода записываем весь прочитанный буфер из сокета в файл
            fwrite(buff, sizeof(char), rc, fp);
        } else {
            // иначе пытаемся найти окончание HTTP заголовков
            buff[rc] = '\0';
            ptr = strstr(buff, "\r\n\r\n");
            if (ptr != NULL) {
                // нашли, все байты в буфере после окончания
                // заголовков запишем в файл
                ptr += 4;
                fwrite(ptr, sizeof(char), rc - (ptr - buff), fp);
                headerIsGone = true;
            }
        }
        
    }
    fclose(fp);
    return 0;
}
И кстати, http://213.180.193.3/images/logo.png возвращает ошибку 404, а логотип находится по адресу http://yastatic.net/morda-logo/i/logo.svg.

PS: данный код может работать некорректно, если признак окончания заголовков "\r\n\r\n" не попадёт целиком в один буфер при чтении. Данную проблему можно решить читая заголовки по строчно, т.е. ожидая "\r\n" в конце строки заголовка, а признаком окончания чтения заголовков будет служить пустая строка, т.е. в строке будут только символы "\r\n".
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
10.03.2015, 14:22
"\r\n\r\n" почему это признак конца чтения а не просто "/n"??

Добавлено через 1 минуту
Это под Linux а под Windows код выглядит примерно также только используется библиотека winsock??

Добавлено через 46 минут
обычно символ перехода на новую строку и есть конец чтения а почему ту еще символ "\r" добавляется??
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
11.03.2015, 09:12
Цитата Сообщение от yura91 Посмотреть сообщение
почему
Цитата Сообщение от yura91 Посмотреть сообщение
примерно
Цитата Сообщение от yura91 Посмотреть сообщение
обычно
у вас вполне нормальный код - просто отрубайте заголовок от приходящего сообщения (он в самом начале и отделен действительно \r\n\r\n) и проверяйте что все данные пришли (в заголовке есть строка Content-Length). тогда то что пришло можно смело сохранить в файл.
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
11.03.2015, 12:18
то есть сначала надо прочитать заголовок после него следует \r\n\r\n и после этого разделителя идут данные верно?? А строка Content-Length где именно находится в заголовке (она выглядит как целое число да)??

Добавлено через 49 секунд
заголовок нужно сохранить отдельно и выделить из него int это и будет пришедший размер да??
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
12.03.2015, 11:33
Цитата Сообщение от yura91 Посмотреть сообщение
где именно находится в заголовке
это одна из строк заголовка. ее порядковый номер не фиксирован. нужно искать по словам Content-Length
Цитата Сообщение от yura91 Посмотреть сообщение
заголовок нужно сохранить отдельно и выделить из него int это и будет пришедший размер да
заголовок если он вам не нужен можно не сохранять, текст указанный после Content-Length: является размером данных
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2015, 11:33
Помогаю со студенческими работами здесь

Как взять картинку из интернета?
Всех крайне приветствую! Делаю приложение под Android, на движке Corona. Смысл программы прост, нужно, чтобы она выводила картинки,...

Как из FB2 файла взять картинку
Пишу научную работу. Тема конвертер текстовых форматов. Вот пишу конвертер ФБ2. Не пойму как из ФБ2 файла взять картинку, или как найти...

Как взять ссылку на картинку из сроки таблицы?
Мне нужно как то обратиться к картинке в строке табличной части документа и что то никак не получается, ниже скриншот и код ...

Взять числа и сохранить их в массиве
В переменной $content содержится текст по типу(в моем примере их два, по факту будет больше): &lt;div...

Image. Как программно с папки Resources взять картинку?
Всем привет! Возможно это глупый вопрос но мне нужна помощь... Как программно с папки Resources взять картинку? Гугл много показывает но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru