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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QServerSocket example падает. неужели баг Qt?  (Прочитано 5154 раз)
rellanium
Гость
« : Июнь 24, 2011, 15:38 »

Привет, уважаемые гуру!! Проблема такая. Очень нужно написать на Qt3.3 http-сервер. Благо есть пример под названием httpd, поставляемый с QT. Компилирую. Запускаю. Набираю в бразуере 127.0.0.1 и он падает. Код не изменял. компилирую, как есть. Дебагил - ничего хорошего это не дало. СПАСИБО за помощь!!   Вот его код:
Код
C++ (Qt)
#include <stdlib.h>
#include <qsocket.h>
#include <qregexp.h>
#include <qserversocket.h>
#include <qapplication.h>
#include <qmainwindow.h>
#include <qtextstream.h>
#include <qvbox.h>
#include <qlabel.h>
#include <qtextview.h>
#include <qpushbutton.h>
 
// HttpDaemon is the the class that implements the simple HTTP server.
class HttpDaemon : public QServerSocket
{
   Q_OBJECT
public:
   HttpDaemon( QObject* parent=0 ) :
QServerSocket(8080,1,parent)
   {
if ( !ok() ) {
   qWarning("Failed to bind to port 8080");
   exit( 1 );
}
   }
 
   void newConnection( int socket )
   {
// When a new client connects, the server constructs a QSocket and all
// communication with the client is done over this QSocket. QSocket
// works asynchronouslyl, this means that all the communication is done
// in the two slots readClient() and discardClient().
QSocket* s = new QSocket( this );
connect( s, SIGNAL(readyRead()), this, SLOT(readClient()) );
connect( s, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
s->setSocket( socket );
emit newConnect();
   }
 
signals:
   void newConnect();
   void endConnect();
   void wroteToClient();
 
private slots:
   void readClient()
   {
// This slot is called when the client sent data to the server. The
// server looks if it was a get request and sends a very simple HTML
// document back.
QSocket* socket = (QSocket*)sender();
if ( socket->canReadLine() ) {
   QStringList tokens = QStringList::split( QRegExp("[ \r\n][ \r\n]*"), socket->readLine() );
   if ( tokens[0] == "GET" ) {
QTextStream os( socket );
os.setEncoding( QTextStream::UnicodeUTF8 );
os << "HTTP/1.0 200 Ok\r\n"
   "Content-Type: text/html; charset=\"utf-8\"\r\n"
   "\r\n"
   "<h1>Nothing to see here</h1>\n";
socket->close();
emit wroteToClient();
   }
}
   }
   void discardClient()
   {
QSocket* socket = (QSocket*)sender();
delete socket;
emit endConnect();
   }
};
 
 
// HttpInfo provides a simple graphical user interface to the server and shows
// the actions of the server.
class HttpInfo : public QVBox
{
   Q_OBJECT
public:
   HttpInfo()
   {
HttpDaemon *httpd = new HttpDaemon( this );
 
QString itext = QString(
"This is a small httpd example.\n"
"You can connect with your\n"
"web browser to port %1"
   ).arg( httpd->port() );
QLabel *lb = new QLabel( itext, this );
lb->setAlignment( AlignHCenter );
infoText = new QTextView( this );
QPushButton *quit = new QPushButton( "quit" , this );
 
connect( httpd, SIGNAL(newConnect()), SLOT(newConnect()) );
connect( httpd, SIGNAL(endConnect()), SLOT(endConnect()) );
connect( httpd, SIGNAL(wroteToClient()), SLOT(wroteToClient()) );
connect( quit, SIGNAL(pressed()), qApp, SLOT(quit()) );
   }
 
   ~HttpInfo()
   {
   }
 
private slots:
   void newConnect()
   {
infoText->append( "New connection" );
   }
   void endConnect()
   {
infoText->append( "Connection closed\n\n" );
   }
   void wroteToClient()
   {
infoText->append( "Wrote to client" );
   }
 
private:
   QTextView *infoText;
};
 
 
int main( int argc, char** argv )
{
   QApplication app( argc, argv );
   HttpInfo info;
   app.setMainWidget( &info );
   info.show();
   return app.exec();
}
 
#include "httpd.moc"
 
« Последнее редактирование: Июнь 24, 2011, 15:41 от Пантер » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июнь 24, 2011, 15:42 »

А почему не Qt4? По 3 версии тут очень мало спецов.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
rellanium
Гость
« Ответ #2 : Июнь 24, 2011, 23:42 »

А почему не Qt4? По 3 версии тут очень мало спецов.

Таковы обстоятельства.. вот надеюсь,  не поленятся добрые люди - глянут и подскажут, как быть.  Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Июнь 25, 2011, 00:43 »

А где падает то? И какая версия Qt3?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
rellanium
Гость
« Ответ #4 : Июнь 25, 2011, 17:09 »

Qt 3.3.3, winXp , vs2003. Падает после того, как отправлен ответ клиенту, после падения переходит в файл free.c Что интересно иногда падает после третьего запроса-ответа, иногда сразу.. ((((
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Июнь 26, 2011, 12:12 »

стек выкладывай сюда
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
rellanium
Гость
« Ответ #6 : Июнь 27, 2011, 16:03 »

    1802a9ca()   
    qt-mt3.dll!39d2a843()    
    qt-mt3.dll!39d2b0af()    
    KernelBase.dll!75fa179c()    
    ntdll.dll!77d43189()    
    ntdll.dll!77d42d80()    
    kernel32.dll!763bf1cc()    
>   msvcr71.dll!free(void * pBlock=0x0012fd18)  Line 103   C
    qt-mt3.dll!39d2afbb()    
    qt-mt3.dll!39d05412()    
    qt-mt3.dll!39d14579()    
    ntdll.dll!77d3561c()    
    qt-mt3.dll!39d149c0()    
    qt-mt3.dll!39d35656()    
    qt-mt3.dll!39d355dd()    
    FFO.exe!main(int argc=1, char * * argv=0x00259948)  Line 19 + 0x9   C++
    FFO.exe!_WinMain@16()  + 0x4e   
    FFO.exe!WinMainCRTStartup()  Line 390 + 0x39   C
    kernel32.dll!763c1194()    
    ntdll.dll!77d4b429()    
    ntdll.dll!77d4b3fc()    
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Июнь 27, 2011, 17:16 »

Проверил этот экзампл на Qt 3.3.8 - краша нет. Попробуй обновиться
« Последнее редактирование: Июнь 27, 2011, 17:28 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
rellanium
Гость
« Ответ #8 : Июнь 30, 2011, 11:35 »

Changes 3.3.8
Fixed an unexpected remote close in QSocket for Windows servers with a high load.

Но краш был не под высокой нагрузкой )))

Главное, что заработало!! Большое спасибо!!! Веселый
« Последнее редактирование: Июнь 30, 2011, 11:37 от rellanium » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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