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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QTcpSocket, hostFound() и error()  (Прочитано 23571 раз)
BRE
Гость
« Ответ #15 : Декабрь 10, 2009, 21:24 »

И qmake вызывал. Одни и те же ошибки. Могу прислать все сообщения компилятора для ясности Улыбающийся
А у меня твой код с добавленным include собирается.  Улыбающийся
Цитировать
[bre@BRE t]$ make
/usr/lib64/qt4/bin/moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtNetwork -I/usr/include/QtGui -I/usr/include -I. main.cpp -o main.moc
g++ -c -pipe -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtNetwork -I/usr/include/QtGui -I/usr/include -I. -o main.o main.cpp
main.cpp: In member function ‘void ClientSocket::readClient()’:
main.cpp:56: предупреждение: сравнение знакового и беззнакового целых выражений
main.cpp: At global scope:
main.cpp:83: предупреждение: параметр ‘from’ не используется
main.cpp:83: предупреждение: параметр ‘to’ не используется
g++ -Wl,-O1 -o test main.o     -lQtGui -lQtNetwork -lQtCore -lpthread

Вот архив сс проектом.
« Последнее редактирование: Декабрь 10, 2009, 21:26 от BRE » Записан
G-virus
Гость
« Ответ #16 : Декабрь 10, 2009, 21:34 »

Надо же. Спс большое! Запустился. Хоть в конце и подчеркнуто  #include "main.moc". Программа при сборке создает файл, и сразу же запускается => подключает указаный файл да? Улыбающийся
Записан
G-virus
Гость
« Ответ #17 : Декабрь 10, 2009, 21:39 »

Но почему-то он не отвечает на входящие данные. Я ему посылаю "8". Он должен прислать "Пакет принят". (я код немного подправил). А он не отвечает на это

Код:
#include <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 == 8)
    {
        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 << "Спасибо";
    }
    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();
}

#include "main.moc"

Записан
BRE
Гость
« Ответ #18 : Декабрь 10, 2009, 21:46 »

А как ты ему посылаешь "8"?
Записан
G-virus
Гость
« Ответ #19 : Декабрь 10, 2009, 21:47 »

А как ты ему посылаешь "8"?

у меня на VB написана универсальная терминалка
Записан
BRE
Гость
« Ответ #20 : Декабрь 10, 2009, 21:50 »

у меня на VB написана универсальная терминалка
Ну судя по твоему коду, сервер ждет размер пакета (число quint16). Он передается?
Записан
G-virus
Гость
« Ответ #21 : Декабрь 10, 2009, 21:53 »

у меня на VB написана универсальная терминалка
Ну судя по твоему коду, сервер ждет размер пакета (число quint16). Он передается?

Судя по коду, сервер ждет число 8. И в случае его получения, отправляет "Спасибо"
Записан
BRE
Гость
« Ответ #22 : Декабрь 10, 2009, 21:55 »

Судя по коду, сервер ждет число 8. И в случае его получения, отправляет "Спасибо"
Код
C++ (Qt)
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;
 
Записан
G-virus
Гость
« Ответ #23 : Декабрь 10, 2009, 22:02 »

Если честно. хз))) Я просто списал с книги пример и сижу изучаю. По определению, он должен работать, а он не работает(( и не пойму где теперь ошибка
Записан
BRE
Гость
« Ответ #24 : Декабрь 10, 2009, 22:04 »

Если честно. хз))) Я просто списал с книги пример и сижу изучаю. По определению, он должен работать, а он не работает(( и не пойму где теперь ошибка
Ты его спиши в том виде как там, разберись и тогда модифицируй. А то быстро запутаешься...  Подмигивающий
Записан
G-virus
Гость
« Ответ #25 : Декабрь 10, 2009, 22:08 »

так он точь-в-точь такой же, как там. Просто книга в формате djvu и видимо плохо изображение отсканилось, но как я понял, сервер должен принимать символ 'S' и посылать quint16(0xFFFF). Но даже в таком случае не работает
Записан
BRE
Гость
« Ответ #26 : Декабрь 10, 2009, 22:13 »

так он точь-в-точь такой же, как там. Просто книга в формате djvu и видимо плохо изображение отсканилось, но как я понял, сервер должен принимать символ 'S' и посылать quint16(0xFFFF). Но даже в таком случае не работает
Сервер ожидает примерно такой пакет:
Размер пакета (quint16)
Тип пакета (quint8)
Параметры пакета...

Для пакета с типом 8 параметры: две строки, дата, время и флаг.
Вот пакет и нужно формировать с учетом этого протокола.

Записан
G-virus
Гость
« Ответ #27 : Декабрь 10, 2009, 22:30 »

Код
C++ (Qt)
#include <QCoreApplication>
#include <QTcpSocket>
#include <QTcpServer>
#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();
 
};
 
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()
{
   QByteArray block;
   int i;
   QDataStream in(this);
   in.setVersion(QDataStream::Qt_4_5);
   QDataStream out(&block, QIODevice::WriteOnly);
   out.setVersion(QDataStream::Qt_4_5);
   in >> i;
   if (i == 1)
   {    block = "n";
       out << block;
   }
   else
   {
       block = "y";
       out << block;
       close();
   }
}
 
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();
}
 
#include "main.moc"
 

Вот я немного упростил код. Теперь он должен принять i. Сравнить с числом и отправить соотвествующий символ. У меня после посылки цифры соединение с сокетом завершается без принятия какого либо сообщения обратно. Как можно это исправить.
Записан
G-virus
Гость
« Ответ #28 : Декабрь 11, 2009, 12:51 »

Попробуй у себя собрать проект и проверить. У меня почему-то не реагирует и я не могу разобраться  Непонимающий
Записан
BRE
Гость
« Ответ #29 : Декабрь 11, 2009, 13:24 »

Сервер
main.cpp
Код
C++ (Qt)
#include <QCoreApplication>    
#include <QTcpSocket>          
#include <QTcpServer>          
#include <QDebug>              
 
class TripServer : public QTcpServer
{                                  
   Q_OBJECT                        
public:                            
   TripServer( QObject *parent = 0 ) : QTcpServer( parent ) {}
 
private:
   void incomingConnection( int socketId );
};                                          
 
class ClientSocket : public QTcpSocket
{                                    
   Q_OBJECT                          
public:                              
   ClientSocket(QObject *parent = 0);
 
private slots:
   void readClient();
};                    
 
void TripServer::incomingConnection( int socketID )
{                                                  
   ClientSocket *socket = new ClientSocket( this );
   socket->setSocketDescriptor( socketID );        
}                                                  
 
ClientSocket::ClientSocket( QObject *parent )
   : QTcpSocket( parent )                  
{                                            
   connect( this, SIGNAL( readyRead() ), this, SLOT( readClient() ) );
   connect( this, SIGNAL( disconnected() ), this, SLOT( deleteLater() ) );
}
 
 
void ClientSocket::readClient()
{
   quint16 id;
   QDataStream in( this );
   in.setVersion(QDataStream::Qt_4_5);
   if( (int)bytesAvailable() < sizeof( quint16 ) )
       return;
 
   in >> id;
   qDebug() << id;
 
   if( id == 8 )
       qDebug() << "Yaa hoo!!!"
}
 
int main( int argc, char *argv[] )
{
   QCoreApplication app( argc, argv );
 
   TripServer server;
   if( !server.listen( QHostAddress::Any, 6178 ) )
   {
       qDebug() << "Failed to bind to port";
       return 1;
   }
 
   return app.exec();
}
 
#include "main.moc"
 

Клиент
main.cpp
Код
C++ (Qt)
#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>
 
int main( int argc, char *argv[] )
{
   QCoreApplication app( argc, argv );
 
   QTcpSocket socket;
   socket.connectToHost( "localhost", 6178 );
   if( !socket.waitForConnected( 1000 ) )
   {
        qDebug( "Error host connected!" );
        return 1;
   }
 
   qDebug( "Connected!" );
 
   quint16 key = 8;
 
   QByteArray buf;
   QDataStream out( &buf, QIODevice::WriteOnly );
   out << key;
 
   qDebug() << "Send key";
   socket.write( buf );
   socket.flush();
 
   return 0;
}
 
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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