Название: Простой браузер без Web-kit. Отправлено: Silver_swift от Апрель 09, 2011, 17:01 Всем привет. Учусь в инсте по заданию нужно сделать браузер который отсылает http запрос на сервак и отображает полученный гипертекст.
1. С использованием TCP-сокетов для линуха (sys/socket.h) в консоли "браузер" работает без проблем. Подружить его с интерфейсом не получилось. Стоит добавить в класс с сокетом тег Q_OBJECT как прога отказывается компилиться из-за вызова функции connect. Которую компилятор воспринимает как метод QObject::connect() ибо сокет лежит в классе QThread который вроде как от QObject унаследован. 2. Плюнул на это дело, пробую использовать QTcpSocket. Мой код ничего не принимал, тогда взял пример из книги Шлее (глава 40 про TCP сервер и клиент) переписал под свои нужды клиента. Запускаю клиента и сервера на порте 8011. На сервер запрос приходит правильно. Пробую подключить клиента к порту 80: Цитировать Received the connected() signal Error: The remote host is closed. И теперь вопросы: 1. Почему такая ошибка возникает? 2. Просто интересно в отдельном потоке (QThread) функцию connect для TCP-сокета из sys/socket.h можно как-то вызвать? Ведь есть и другие функции С++ названия которых совпадают с методами классов Qt. Код клиента: main.cpp Код: /* ====================================================================== MyClient.cpp Код: #include <QtNetwork> MyClient.h Код: #ifndef _MyClient_h_ Оффтоп: а убрать код в спойлер тут нельзя никак? Название: Re: Простой браузер без Web-kit. Отправлено: break от Апрель 09, 2011, 17:14 Цитировать Стоит добавить в класс с сокетом тег Q_OBJECT как прога отказывается компилиться из-за вызова функции connect. Которую компилятор воспринимает как метод QObject::connect() ибо сокет лежит в классе QThread который вроде как от QObject унаследован. В чем проблема принудительно указать компилятору от какого класса метод connect мы вызываем?Что значит сокет лежит в QThread? Название: Re: Простой браузер без Web-kit. Отправлено: Silver_swift от Апрель 09, 2011, 17:30 Цитировать В чем проблема принудительно указать компилятору от какого класса метод connect мы вызываем? В том что эта функция вроде как не принадлежит ни какому классу. Я бы даже посмотрел в самой библиотеке. Только не знаю где она лежит в убунте ??? Edited: Нашел прототип в библиотеке: extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len); Функция действительно не принадлежит никакому классу. Цитировать Что значит сокет лежит в QThread? Код: #include <sys/socket.h> Название: Re: Простой браузер без Web-kit. Отправлено: break от Апрель 09, 2011, 18:45 проблема понятна используй оператор разрешения области видимости. Т.е. пиши
#include <sys/socket.h> .... class stream : public QThread { Q_OBJECT void run () { ... ::connect(sockfd,(struct sinaddr*)ADR, sizeof(*ADR)); ... } }; Название: Re: Простой браузер без Web-kit. Отправлено: merke от Апрель 10, 2011, 06:40 Нафига тебе сокеты, используй QNetworkAccessManager.
Название: Re: Простой браузер без Web-kit. Отправлено: Silver_swift от Апрель 11, 2011, 00:08 To break: так сначала и пробовал. Но как только в классе потока появится тег Q_OBJECT компилятор два раза выводит строку "undefined reference to 'vtable for sock' " ( класс моего потока с сокетом) и "collect2: ld returned 1 exit status".
К сожалению код пока не могу выложить - сижу с телефона. Зря я думал, что косяк в методе connect(). Видимо проблема в создании потока с этим тегом. Есть какие-нибудь соображения? Название: Re: Простой браузер без Web-kit. Отправлено: break от Апрель 11, 2011, 00:36 Разбирайся с линкером - у меня вот так все компилится
Код: ///////////////////////////////////////////////////////////////// Название: Re: Простой браузер без Web-kit. Отправлено: Silver_swift от Апрель 11, 2011, 01:29 Я что-то совсем перестал понимать что происходит.
Открываю пример с созданием потока из книги Шлее. В той папке где он лежал он компилится и работает. Файлов всего 2 .pro и .cpp. копирую их в свой проект и при компиляции получаю ошибки о которых писал выше. Оба проекта одного типа, код в них одинаковый. Как такое может быть??? Название: Re: Простой браузер без Web-kit. Отправлено: break от Апрель 11, 2011, 02:10 Очень просто - пути к либам неправильно прописанфы в твоем проекте, или не прописаны, или неверные модули Qt указаны так что линкер не находит нужных ему библиотек - вот и ругается. Сравнивай pro файлы - возможно указаны относительные пути а один из проектов на уровень выше находится в реальной ФС или что-то подобное.
Название: Re: Простой браузер без Web-kit. Отправлено: Silver_swift от Апрель 11, 2011, 15:03 Спасибо, понял в чем был косяк. Не тот проект был указан в TARGET и теперь даже все заработало.
Вот так вот бывает - думаешь что косяк в сокете, мучаешься с ним, а потом оказывается что дело совсем не в нем))) А все же, если использовать QTcpSocket почему ошибка возникает? Edited: Для progress-bar откуда можно получить информацию о загрузке страницы? Учитывая что у меня сокет не класс Qt... |