Получение странцы содержащей ОДИН Gif

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by thetuk, 28 Feb 2008.

  1. thetuk

    thetuk New Member

    Joined:
    22 Feb 2008
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Не могу разобраться в чем проблема?
    -посылаю запрос серверу:
    Code:
    char url[] = "/pic.aspx?rand=143"; 
    char host[] = "sms.mts.ru"; 
    sprintf( request, "GET %s HTTP/1.1\r\nAccept: image/png, image/gif\r\nHost: %s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\nAccept: image/gif\r\n\r\n", url, host );
    
    -получаю ответ сервера
    Code:
    HTTP/1.1 200 OK
    Date: Thu, 28 Feb 2008 17:40:57 GMT
    Server: Microsoft-IIS/6.0
    Compression-Control: whitespace
    X-Powered-By: ASP.NET
    X-AspNet-Version: 2.0.50727
    Pragma: no-cache
    Set-Cookie: ASP.NET_SessionId=f3gyvfetrwl3xvua3wl5rzff; path=/; HttpOnly
    Cache-Control: no-cache
    Pragma: no-cache
    Expires: -1
    Content-Type: image/gif
    Content-Length: 3726
    
    
    GIF89aМ320
    
    Вот картинка содержит 3726 байт
    -далее пытаюсь ее получить
    Code:
    unsigned int x;
    while((len=recv( s, buf, 32*10, 0))>0){
    fout.open("C:/1.gif",ios::binary | ios::app);
    fout.write(buf,len);
    x+=len;
    fout.close();
    }
    cout<<x<<endl;
    
    в переменной х должно содержатся 3726 (Content-Length: 3726) байт. Но у меня получается где-то 2000+-.
    ???ПОЧЕМУ???​
     
  2. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    часть картинки была принята вместе с http-ответом сервера
     
  3. thetuk

    thetuk New Member

    Joined:
    22 Feb 2008
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Может подскажешь?
     
  4. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    прикольно 8))).....
    какойто ответ сервера 8)) а потом видимо там же получают код картинки в MIME?
    и чего прямо mime64 на диск "валят"????

    код в студию блин.... нифика не понятно!

    Во блин мучаются то не по децки..... настоящие пацаны Wininet используют 8)))

    .... хакиры чистый socket ,чтоб поразмяться с mime и кровушки отдать с gzip :D
     
    #4 Delimiter, 29 Feb 2008
    Last edited: 29 Feb 2008
  5. KPOT_f!nd

    KPOT_f!nd положенец общага

    Joined:
    25 Aug 2006
    Messages:
    1,074
    Likes Received:
    502
    Reputations:
    65
    thetuk - а вообще что за это язык програм??? ))
     
  6. thetuk

    thetuk New Member

    Joined:
    22 Feb 2008
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    CPP
     
  7. thetuk

    thetuk New Member

    Joined:
    22 Feb 2008
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    UrLDownloadFile()?
     
  8. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    // создаём переменную session и открываем сессию ANDY
    CInternetSession session( _T( "Delimiter" ), PRE_CONFIG_INTERNET_ACCESS );
    // создаём переменную pServer класса CHttpConnection
    CHttpConnection* pServer = NULL;
    // создаём переменную pFile класса CHttpFile
    CHttpFile* pFile = NULL;
    //Обратите внимание, что все запросы к функциям членам WinInet классов включены в блок программы TRY.
    //Это сделано так, потому что при соединении с каким либо URL есть риск неправильной ссылки,
    //особенно, когда Вы полагаете, что пользователь сам печатает URL.
    //Другая проблема - времена ожидания, которые возникают, когда требуемый URL в настоящее время
    //неспособен обслужить подключение.
    //Так же обработка WinInet исключений, которые представлены в классе
    //CInternetException, является важной частью создания Internet приложения под MFC.
    try
    {
    // функция AfxParseURL получает данные с указанного URL ( у нас m_url ) об сервере,
    // объекте, типе сервиса и порте
    if ( AfxParseURL( m_url, dwServiceType, strServerName, strObject, nPort ) == 0 )
    {

    // Устанавливаем подключение по HTTP протоклолу.
    pServer = session.GetHttpConnection( strServerName, nPort );
    // посылаем запрос об объекте ( strObject )
    pFile = pServer->OpenRequest(
    CHttpConnection::HTTP_VERB_GET, strObject, NULL, 1, NULL, NULL,
    INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_DONT_CACHE
    );
    // Добавляем заголовок к HTTP запросу
    pFile->AddRequestHeaders( _T( "Accept: */*\r\nUser-Agent: Delimiter\r\n" ) );
    // посылаем запрос
    pFile->SendRequest( );
    DWORD dwRet; // переменная для хранения кода состояния
    pFile->QueryInfoStatusCode( dwRet ); // записываем код состояния в dwRet
    // вывод данных

    CString strHeader; // переменная для хранения полученного заголовока запроса
    pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strHeader); // записываем заголовок в strHeader
    // вывод данных
    // m_mes += "Header = ";
    // m_mes += strHeader;
    // если код состояния не равен 200, то выходим из функции
    if( dwRet != 200 )
    {
    delete[] mytempbuf;
    session.Close( );
    return 0;
    }
    // ----------------------------------------------------------
    // проверка выбора файла для записи
    fptr=fopen(my_path,"wb");
    int allRead = 0; // переменная для хранения общего числи считанных байт
    int nRead = pFile->Read( mytempbuf, 1024 ); // считываем первые 1024 байта в буфер.
    // переменная nRead хранит количество
    // считанных байт
    allRead += nRead; // обновляем общее число считанных байт
    // вывод данных

    // записываем буфер из nRead байт в файл
    fwrite(mytempbuf,1,nRead,fptr);
    // цикл считывания, пока nRead не будет равняться нулю
    while ( nRead > 0 )
    {
    nRead = pFile->Read( mytempbuf, 1024 );
    if( nRead != 0 )
    {
    fwrite(mytempbuf,1,nRead,fptr);
    allRead += nRead;

    }
    }
    fclose(fptr);
    }
    catch ( CInternetException* pEx )
    {
    // Если произошла ошибка в WinInet

    // вывод ошибки
    char szErr[1024];
    pEx->GetErrorMessage( szErr, 1024 );

    pEx->Delete( ); // удаление переменной класса CInternetException
    if ( pFile != NULL )
    delete pFile; // закрываем Internet файл
    if ( pServer != NULL )
    delete pServer; // закрываем сервер

    delete[] mytempbuf;

    Sleep(50);
    return 0;

    }

    if ( pFile != NULL )
    delete pFile; // закрываем Internet файл
    if ( pServer != NULL )
    delete pServer; // закрываем сервер
    session.Close( ); // закрываем сессию
    delete[] mytempbuf;
     
    #8 Delimiter, 29 Feb 2008
    Last edited: 29 Feb 2008
  9. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    покажи как ты ответ получаеш
     
  10. thetuk

    thetuk New Member

    Joined:
    22 Feb 2008
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    char response[1024*32];
    recv(s, response, 1024,0);
     
  11. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    http://forum.antichat.ru/showthread.php?p=606495#post606495
     
    1 person likes this.
  12. thetuk

    thetuk New Member

    Joined:
    22 Feb 2008
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Действительно получая ответ с севера, получаю часть Gif'а. Не удавалось записать в файл т.к. использовал оператор << который предназначен для форматированного текста. Спасибо всем кто помог...