Название: Сокеты + HTTP = ??? Отправлено: 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 Как пофиксить? Название: Re: Сокеты + HTTP = ??? Отправлено: SABROG от Апрель 22, 2009, 15:32 Я тебе ответил на другом форуме http://forum.vingrad.ru/index.php?showtopic=256449&view=findpost&p=1849646
Название: Re: Сокеты + HTTP = ??? Отправлено: QApple от Апрель 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.8) 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.8) 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) пишет какуюто абракадабру. кроме длины домена никакой связи не нахожу ... мистика :o Название: Re: Сокеты + HTTP = ??? Отправлено: vtl от Апрель 27, 2009, 13:47 а libcurl тоже не подошел?
Название: Re: Сокеты + HTTP = ??? Отправлено: mugabe от Апрель 28, 2009, 08:54 с короткими доменами (например ya.ru) все работает как нужно, с длинными (например yandex.ru) пишет какуюто абракадабру. :)кроме длины домена никакой связи не нахожу ... мистика :o ya.ru возвращает документы в кодировке windows-1251, а yandex.ru - в utf-8. никакой связи с длиной домена нет, это всего-лишь прихоть разработчиков. |