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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QTcpSocket, hostFound() и error()  (Прочитано 23793 раз)
ilyagoo
Гость
« : Декабрь 03, 2009, 16:47 »

есть объект QTcpSocket, вызываю connectToHost().
1) Первым дергается сигнал hostFound()                     - зачем он нужен?
Далее, если есть соединение - сигнал connected().
2) В противном случае - emit error( QAbstractSocket::SocketError ).
Qt-4.2.2 - второй пункт работает правильно
Вопросы:
Qt-4.3.1, 4.4.2 - при выдернутом кабеле сигнал из (2) никогда не придет, хотя работает (1) - в чем прикол? waitForConnected() тоже не сигналит об ошибке.
В hostFound() в любом случае error() возвращает ошибку. Что с этими сокетами творится-то? или с моими руками?

добавляю:
в Qt-4.6.0 все работает.
поковырялся внутри - есть различия  Обеспокоенный там, где не работает - бесконечный цикл, не хватает знания QAbstractSocketEngine  Грустный
может кто-нибудь уже ковырялся там и сможет помочь?
« Последнее редактирование: Декабрь 04, 2009, 15:47 от ilyagoo » Записан
ilyagoo
Гость
« Ответ #1 : Декабрь 07, 2009, 14:12 »

а есть ли возможность определить выдернут сетевой шланг или нет?
Записан
G-virus
Гость
« Ответ #2 : Декабрь 10, 2009, 19:24 »

Всем привет. Извиняюсь, если написал вопрос не в ту тему. Вопрос такой: учу Qt по книге, и решил освоить работу с QTcpSocket и QTcpServer. Набрал код код примера, ввел вот это QT += network в профайл. Компилирую, и вылетают ошибки типа release/main.o:main.cpp::-1: error: undefined reference to `vtable for ClientSocket' Как это можно исправить. Могу исходники кинуть. Заранее спасибо! Улыбающийся
Записан
niXman
Гость
« Ответ #3 : Декабрь 10, 2009, 20:35 »

покажи код
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #4 : Декабрь 10, 2009, 20:51 »

Для начала сделай make clean и пересобери проект.
Записан
G-virus
Гость
« Ответ #5 : Декабрь 10, 2009, 20:57 »

покажи код


Вот код.

#include <QtCore/QCoreApplication>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDate>
#include <QTime>
#include <iostream>
using namespace std;

class TripServer : public QTcpServer
{
    Q_OBJECT

    public:
    TripServer(QObject *parent = 0);
    private:
    void incomingConnection(int socketId);
};
TripServer::TripServer(QObject *parent)
        :QTcpServer(parent)
{
}
class ClientSocket : public QTcpSocket
{
    Q_OBJECT

    public:
    ClientSocket(QObject *parent = 0);
    private slots:
    void readClient();
    public:
    void generateRandomTrip(const QString &from,const QString &to, const QDate &date, const QTime &time);

    quint16 nextBlockSize;
};

ClientSocket::ClientSocket(QObject *parent)
        :QTcpSocket(parent)
{
    connect(this, SIGNAL(readyRead()), this, SLOT(readClient()));
    connect(this, SIGNAL(disconnected()), this, SLOT(deleteLater()));
    nextBlockSize = 0;
}
void TripServer::incomingConnection(int socketID)
{
    ClientSocket *socket = new ClientSocket(this);
    socket->setSocketDescriptor(socketID);
}

void ClientSocket::readClient()
{
    QDataStream in(this);
     in.setVersion(QDataStream::Qt_4_5);
    if (nextBlockSize == 0)
    {
        if(bytesAvailable() < sizeof(quint16))
            return;
        in >> nextBlockSize;
    }
    if(bytesAvailable() < nextBlockSize)
        return;
    quint8 requestType;
    QString from;
    QString to;
    QDate date;
    QTime time;
    quint8 flag;

    in >> requestType;
    if (requestType == 'S')
    {
        in >> from >> to >> date >> time >> flag;
        srand(from.length() * 3600 + to.length() * 60 + time.hour());
        int numTrips = rand() % 8;
        for(int i = 0; i < numTrips; ++i)
            generateRandomTrip(from, to, date, time);
        QDataStream out(this);
        out << quint16(0xFFFF);
    }
    close();
}

void ClientSocket::generateRandomTrip(const QString &from, const QString &to, const QDate &date, const QTime &time)
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_5);
    quint16 duration = rand() % 200;
    out << quint16(0) << date << time << duration << quint8(1)
        << QString ("InterCity");
    out.device()->seek(0);
    out << quint16(block.size() - sizeof(quint16));
    write(block);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    TripServer server;
    if(!server.listen(QHostAddress::Any, 6178)){
        cerr << "Failed to bind to port" << endl;
        return 1;
    }
    else
         a.quit();
    return a.exec();
}
Записан
BRE
Гость
« Ответ #6 : Декабрь 10, 2009, 21:01 »

В конец файла добавь
#include "main.moc"

и запусти еще раз qmake.
Записан
G-virus
Гость
« Ответ #7 : Декабрь 10, 2009, 21:07 »

В конец файла добавь
#include "main.moc"

и запусти еще раз qmake.


не получается, пишет, что файл main.moc не найден Непонимающий
Записан
BRE
Гость
« Ответ #8 : Декабрь 10, 2009, 21:09 »

не получается, пишет, что файл main.moc не найден Непонимающий
Как называется твой файл с исходником?
Записан
G-virus
Гость
« Ответ #9 : Декабрь 10, 2009, 21:11 »

не получается, пишет, что файл main.moc не найден Непонимающий
Как называется твой файл с исходником?


main.cpp и профайл Server.pro
Записан
BRE
Гость
« Ответ #10 : Декабрь 10, 2009, 21:12 »

Код
C++ (Qt)
int main(int argc, char *argv[])
{
   if(!server.listen(QHostAddress::Any, 6178)){
       cerr << "Failed to bind to port" << endl;
       return 1;
   }
   else
        a.quit(); // Это ты для чего вызываешь?
   return a.exec();
}
 

Для вывода диагностики, вместо std::cerr, можно использовать qDebug, qWarning, qCritical.
Записан
BRE
Гость
« Ответ #11 : Декабрь 10, 2009, 21:13 »

main.cpp и профайл Server.pro
А ты qmake после этого вызвал?
Записан
G-virus
Гость
« Ответ #12 : Декабрь 10, 2009, 21:16 »

         a.quit();            // Это ты для чего вызываешь?

Это в случае ошибки завершить приложение.
И qmake вызывал. Одни и те же ошибки. Могу прислать все сообщения компилятора для ясности Улыбающийся
« Последнее редактирование: Декабрь 10, 2009, 21:17 от G-virus » Записан
BRE
Гость
« Ответ #13 : Декабрь 10, 2009, 21:19 »

Это в случае ошибки завершить приложение
Код
C++ (Qt)
int main(int argc, char *argv[])
{
   if(!server.listen(QHostAddress::Any, 6178)){
       cerr << "Failed to bind to port" << endl; // А это тогда что делает???
       return 1;
   }
   else
        a.quit();
   return a.exec();
}
 
Хоть вызов quit в этом месте ничего плохого и не сделает, но и нужного тоже...
Записан
G-virus
Гость
« Ответ #14 : Декабрь 10, 2009, 21:21 »


Код
C++ (Qt)
Running build steps for project Server...
Starting: C:/Qt/2009.04/qt/bin/qmake.exe C:/Server/Server.pro -spec win32-g++ -r
Exited with code 0.
Starting: C:/Qt/2009.04/mingw/bin/mingw32-make.exe -w
mingw32-make: Entering directory `C:/Server'
C:/Qt/2009.04/mingw/bin/mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory `C:/Server'

g++ -c -O2 -frtti -fno-exceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\Qt\2009.04\qt\include\QtCore" -I"..\Qt\2009.04\qt\include\QtNetwork" -I"..\Qt\2009.04\qt\include" -I"..\Qt\2009.04\qt\include\ActiveQt" -I"release" -I"..\Qt\2009.04\qt\mkspecs\win32-g++" -o release\main.o main.cpp
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-subsystem,console -o release\Server.exe release/main.o -L"c:\Qt\2009.04\qt\lib" -lQtNetwork -lQtCore -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32
mingw32-make[1]: Leaving directory `C:/Server'
mingw32-make: Leaving directory `C:/Server'

release/main.o:main.cpp:(.text+0x1b): undefined reference to `vtable for TripServer'
release/main.o:main.cpp:(.text+0x4b): undefined reference to `vtable for TripServer'

release/main.o:main.cpp:(.text+0x7b): undefined reference to `vtable for ClientSocket'
release/main.o:main.cpp:(.text+0xfb): undefined reference to `vtable for ClientSocket'

release/main.o:main.cpp:(.text+0x61f): undefined reference to `vtable for TripServer'
release/main.o:main.cpp:(.text+0x64b): undefined reference to `vtable for TripServer'

collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\Server.exe] Error 1
mingw32-make: *** [release] Error 2
Exited with code 2.
Error while building project Server
When executing build step 'Make'
 
вот сообщения компилятора, даже если убрать a.quit()

Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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