Russian Qt Forum
Ноябрь 23, 2024, 06:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сокеты + HTTP = ???  (Прочитано 4943 раз)
QApple
Гость
« : Апрель 22, 2009, 11:46 »

QHttp по определенным причинам не подошел, поэтому решил писать сразу на сокетах.
Задача: отправить get/post запрос и получить ответ (в переменную)
Цитировать
#include <iostream>
#include <QtNetwork>
#include <QtCore>
#include <QFile>

void ErrorLog (int count, QString log) {
   QFile error("error.txt");
   if ( !error.open(QIODevice::Append | QIODevice::Text) ) {
       return; // Не удалось открыть файл на запись
      }
      QTextStream err(&error);
      err << "[" << count << "]: " << log << "\n";
    error.close();
}

int main(int /*argc*/, char ** /*argv*/) {

    QTcpSocket socket;
    QByteArray block;
    QString s, str;

    str = "GET /index.html HTTP/1.1\r\n";
    str.append("Host: ya.ru\r\n");
    str.append("User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)\r\n");
    str.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
    str.append("Accept-Language: en-us\r\n");
    str.append("Accept-Encoding: gzip,deflate\r\n");
   
    QFile file("out.txt");
   
    if ( !file.open(QIODevice::Append | QIODevice::Text) ) {
       return 1; // Не удалось открыть файл на запись
      }
      
    socket.connectToHost("ya.ru", 80);
   
    if ( !socket.waitForConnected(7000) ) {
       ErrorLog( 2, socket.errorString() );
        return 2; // Не удалось связаться с сервером
    }
    if ( socket.write(str.toUtf8()) <= 0 ) {
       ErrorLog( 3, socket.errorString() );
        return 3; // Не могу записать данные для отправки
    }
    if ( !socket.waitForBytesWritten(10000) ) {
        ErrorLog( 4, socket.errorString() );
        return 4; // Не могу отправить данные
    }
     
    if ( !socket.waitForReadyRead(10000) ) {
       ErrorLog( 5, socket.errorString() );
        return 5; // Нет отклика от сервера
    }
   
    block = socket.readAll();
    s = block.data();
   
    QTextStream out(&file);
    out << "Data: " << s << "\n";
    file.close();

    socket.disconnectFromHost();

    return 0;
}


Проблема в том что яндекс не хочет мне отвечать, по логам [5]: Network operation timed out
Как пофиксить?
Записан
SABROG
Гость
« Ответ #1 : Апрель 22, 2009, 15:32 »

Я тебе ответил на другом форуме http://forum.vingrad.ru/index.php?showtopic=256449&view=findpost&p=1849646
Записан
QApple
Гость
« Ответ #2 : Апрель 22, 2009, 23:00 »

да, твой совет помог, только сейчас новое издевательство от qt
Цитировать
#include <iostream>
#include <QtNetwork>
#include <QtCore>
#include <QFile>

void FileWrite ( QString name, QString data ) {
   QFile file( name );
   
   // QIODevice::Append - дозапись
   // QIODevice::WriteOnly - перезапись

   if ( !file.open(QIODevice::WriteOnly | QIODevice::Text) ) {
       return; // Не удалось открыть файл на запись
      }
      QTextStream f(&file);
      f << data.toUtf8();
      file.close();
      return;
}

QString SocketGo ( QString host, int port, QString data ) {
   QTcpSocket socket;
   QByteArray block;
   QString s;
   
    socket.connectToHost( host, port );
    socket.waitForConnected(30000);
    socket.write( data.toAscii() );
    socket.waitForBytesWritten(30000);

    while ( socket.waitForReadyRead(30000) )
    {
        block = socket.readAll();
        s += block.data();
    }
    socket.disconnectFromHost();
   
    return s;
}

int main(int /*argc*/, char ** /*argv*/) {

    QString str, data;

// [1]

    str = "GET / HTTP/1.1\r\n"
"Host: ya.ru\r\n"
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.Крутой Gecko/2009032609 Firefox/3.0.8 (.NET CLR 3.5.30729)\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n"
"Accept-Encoding: gzip,deflate\r\n"
"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"
"Keep-Alive: 300\r\n"
"Connection: keep-alive\r\n"
"Cache-Control: no-cache\r\n\r\n";
      
      data = SocketGo( "ya.ru", 80, str );
    FileWrite( "ya.html", data );

// [2]

    str = "GET / HTTP/1.1\r\n"
"Host: yandex.ru\r\n"
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.Крутой Gecko/2009032609 Firefox/3.0.8 (.NET CLR 3.5.30729)\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n"
"Accept-Encoding: gzip,deflate\r\n"
"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"
"Keep-Alive: 300\r\n"
"Connection: keep-alive\r\n"
"Cache-Control: no-cache\r\n\r\n";
      
      data = SocketGo( "www.yandex.ru", 80, str );
    FileWrite( "yandex.html", data );

    return 0;
}


с короткими доменами (например ya.ru) все работает как нужно, с длинными (например yandex.ru) пишет какуюто абракадабру.
кроме длины домена никакой связи не нахожу ... мистика  Шокированный
Записан
vtl
Гость
« Ответ #3 : Апрель 27, 2009, 13:47 »

а libcurl тоже не подошел?
Записан
mugabe
Гость
« Ответ #4 : Апрель 28, 2009, 08:54 »

с короткими доменами (например ya.ru) все работает как нужно, с длинными (например yandex.ru) пишет какуюто абракадабру.
кроме длины домена никакой связи не нахожу ... мистика  Шокированный
Улыбающийся
ya.ru возвращает документы в кодировке windows-1251, а yandex.ru - в utf-8.
никакой связи с длиной домена нет, это всего-лишь прихоть разработчиков.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 21.