Название: QServerSocket example падает. неужели баг Qt?
Отправлено: 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"
Название: Re: QServerSocket example падает. неужели баг Qt?
Отправлено: Пантер от Июнь 24, 2011, 15:42
А почему не Qt4? По 3 версии тут очень мало спецов.
Название: Re: QServerSocket example падает. неужели баг Qt?
Отправлено: rellanium от Июнь 24, 2011, 23:42
А почему не Qt4? По 3 версии тут очень мало спецов.
Таковы обстоятельства.. вот надеюсь, не поленятся добрые люди - глянут и подскажут, как быть. :)
Название: Re: QServerSocket example падает. неужели баг Qt?
Отправлено: pastor от Июнь 25, 2011, 00:43
А где падает то? И какая версия Qt3?
Название: Re: QServerSocket example падает. неужели баг Qt?
Отправлено: rellanium от Июнь 25, 2011, 17:09
Qt 3.3.3, winXp , vs2003. Падает после того, как отправлен ответ клиенту, после падения переходит в файл free.c Что интересно иногда падает после третьего запроса-ответа, иногда сразу.. ((((
Название: Re: QServerSocket example падает. неужели баг Qt?
Отправлено: pastor от Июнь 26, 2011, 12:12
стек выкладывай сюда
Название: Re: QServerSocket example падает. неужели баг Qt?
Отправлено: rellanium от Июнь 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()
Название: Re: QServerSocket example падает. неужели баг Qt?
Отправлено: pastor от Июнь 27, 2011, 17:16
Проверил этот экзампл на Qt 3.3.8 - краша нет. Попробуй обновиться
Название: Re: QServerSocket example падает. неужели баг Qt?
Отправлено: rellanium от Июнь 30, 2011, 11:35
Changes 3.3.8 Fixed an unexpected remote close in QSocket for Windows servers with a high load.
Но краш был не под высокой нагрузкой )))
Главное, что заработало!! Большое спасибо!!! :D
|