Russian Qt Forum

Qt => Работа с сетью => Тема начата: ilyagoo от Декабрь 03, 2009, 16:47



Название: QTcpSocket, hostFound() и error()
Отправлено: 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  :(
может кто-нибудь уже ковырялся там и сможет помочь?


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: ilyagoo от Декабрь 07, 2009, 14:12
а есть ли возможность определить выдернут сетевой шланг или нет?


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 10, 2009, 19:24
Всем привет. Извиняюсь, если написал вопрос не в ту тему. Вопрос такой: учу Qt по книге, и решил освоить работу с QTcpSocket и QTcpServer. Набрал код код примера, ввел вот это QT += network в профайл. Компилирую, и вылетают ошибки типа release/main.o:main.cpp::-1: error: undefined reference to `vtable for ClientSocket' Как это можно исправить. Могу исходники кинуть. Заранее спасибо! :)


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: niXman от Декабрь 10, 2009, 20:35
покажи код


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: xokc от Декабрь 10, 2009, 20:51
Для начала сделай make clean и пересобери проект.


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 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();
}


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 10, 2009, 21:01
В конец файла добавь
#include "main.moc"

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


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 10, 2009, 21:07
В конец файла добавь
#include "main.moc"

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


не получается, пишет, что файл main.moc не найден ???


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 10, 2009, 21:09
не получается, пишет, что файл main.moc не найден ???
Как называется твой файл с исходником?


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 10, 2009, 21:11
не получается, пишет, что файл main.moc не найден ???
Как называется твой файл с исходником?


main.cpp и профайл Server.pro


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 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.


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 10, 2009, 21:13
main.cpp и профайл Server.pro
А ты qmake после этого вызвал?


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 10, 2009, 21:16
         a.quit();            // Это ты для чего вызываешь?

Это в случае ошибки завершить приложение.
И qmake вызывал. Одни и те же ошибки. Могу прислать все сообщения компилятора для ясности :)


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 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 в этом месте ничего плохого и не сделает, но и нужного тоже...


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 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()



Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 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

Вот архив сс проектом.


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 10, 2009, 21:34
Надо же. Спс большое! Запустился. Хоть в конце и подчеркнуто  #include "main.moc". Программа при сборке создает файл, и сразу же запускается => подключает указаный файл да? :)


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 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"



Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 10, 2009, 21:46
А как ты ему посылаешь "8"?


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 10, 2009, 21:47
А как ты ему посылаешь "8"?

у меня на VB написана универсальная терминалка


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 10, 2009, 21:50
у меня на VB написана универсальная терминалка
Ну судя по твоему коду, сервер ждет размер пакета (число quint16). Он передается?


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

Судя по коду, сервер ждет число 8. И в случае его получения, отправляет "Спасибо"


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 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;
 


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 10, 2009, 22:02
Если честно. хз))) Я просто списал с книги пример и сижу изучаю. По определению, он должен работать, а он не работает(( и не пойму где теперь ошибка


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 10, 2009, 22:04
Если честно. хз))) Я просто списал с книги пример и сижу изучаю. По определению, он должен работать, а он не работает(( и не пойму где теперь ошибка
Ты его спиши в том виде как там, разберись и тогда модифицируй. А то быстро запутаешься...  ;)


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 10, 2009, 22:08
так он точь-в-точь такой же, как там. Просто книга в формате djvu и видимо плохо изображение отсканилось, но как я понял, сервер должен принимать символ 'S' и посылать quint16(0xFFFF). Но даже в таком случае не работает


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

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



Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 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. Сравнить с числом и отправить соотвествующий символ. У меня после посылки цифры соединение с сокетом завершается без принятия какого либо сообщения обратно. Как можно это исправить.


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 11, 2009, 12:51
Попробуй у себя собрать проект и проверить. У меня почему-то не реагирует и я не могу разобраться  ???


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 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;
}
 


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 11, 2009, 18:45
спасибо большое! :) работает) И я понял почему у меня не работало. Дело было в клиенте. Я когда писал клиент на VB, написал его так, что он посылал данные типа string. А в нашем случае(и в случае с книги) сервер принимал либо int значения, либо char. В этом и была ошибка у меня :) Спасибо за помощь еще раз. А вот еще такой вопрос, как сделать, чтобы сервер принимал string-данные? Просто заменить в in >> id тип id с int на string?


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 11, 2009, 18:48
А вот еще такой вопрос, как сделать, чтобы сервер принимал string-данные? Просто заменить в in >> id тип id с int на string?
А как твой клиент строку передает? Как ты размер строки определяешь?


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 11, 2009, 18:54
А вот еще такой вопрос, как сделать, чтобы сервер принимал string-данные? Просто заменить в in >> id тип id с int на string?
А как твой клиент строку передает? Как ты размер строки определяешь?


я в этом не разбирался когда код писал. Да и было все на высоком уровне. Объект Winsock Control 6.0 и все элементарно. Метод WinSock.SendData (strA) передавал содержимое строки strA


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 11, 2009, 19:07
Вот я знаю, что есть такая штука
Код
C++ (Qt)
QStringList lines;
while(tcpSocket.canReadLine())
      lines.append(tcpSocket.readLine());
 

ток не пойму как ею пользоваться


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 11, 2009, 19:20
я в этом не разбирался когда код писал. Да и было все на высоком уровне. Объект Winsock Control 6.0 и все элементарно. Метод WinSock.SendData (strA) передавал содержимое строки strA
Боюсь придется разобраться....  ;)
Без этого не ясно как читать эту строку серверу и как отправлять ответ клиенту.


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 11, 2009, 19:25
я в этом не разбирался когда код писал. Да и было все на высоком уровне. Объект Winsock Control 6.0 и все элементарно. Метод WinSock.SendData (strA) передавал содержимое строки strA
Боюсь придется разобраться....  ;)
Без этого не ясно как читать эту строку серверу и как отправлять ответ клиенту.


я вот прислал пример для строкоориентированой формы приема данных(чуть выше пример). Ты знаешь про такую?


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 11, 2009, 20:42
я вот прислал пример для строкоориентированой формы приема данных(чуть выше пример). Ты знаешь про такую?
readLine читает из устройства символы, пока не встретит перевод строки ('\n') или не прочитает maxSize символов.
Если твой клиент отмечает конец строки символом '\n', то возможно все заработает сразу, если нет, то придется разбираться как именно он отправляет строки.


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 11, 2009, 20:46
А ты сможешь сделать таких же два примера клиент и сервер ток со строками? И если можно, gui  :)


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 11, 2009, 21:29
А ты сможешь сделать таких же два примера клиент и сервер ток со строками? И если можно, gui  :)
Вместе с Qt идут примеры, там есть то что ты хочешь.


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 11, 2009, 21:34
А ты сможешь сделать таких же два примера клиент и сервер ток со строками? И если можно, gui  :)
Вместе с Qt идут примеры, там есть то что ты хочешь.


ок. Спасибо :)


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 11, 2009, 22:55
Че-то не могу найти пример, чтобы работать именно со строками. Везде QByteArray((((


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 12, 2009, 21:00
Сделай пожалуйста такой же простой пример только для string. А то никак не нагуглю норм пример. Плиз! :)

у меня получается работать с типами int, char, quint16 и т.п. А вот с типом string никак. Пробовал преобразовывать в char[], он не посылает.  :(


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: BRE от Декабрь 12, 2009, 22:08
Сделай пожалуйста такой же простой пример только для string. А то никак не нагуглю норм пример. Плиз! :)
Читай документацию, смотри примеры, иначе не разберешься...
examples/network/network-chat как раз передаются строки.


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 12, 2009, 23:00
Читай документацию, смотри примеры, иначе не разберешься...
examples/network/network-chat как раз передаются строки.

Посмотрел я пример. Блин, слишком сложный для начинающего  ;D Я пытался выудить отдельные функции передачи, но так ничего и не понял ;D


Название: Re: QTcpSocket, hostFound() и error()
Отправлено: G-virus от Декабрь 13, 2009, 21:27
Наконец-то разобрался. Всем спасибо за участие в моей проблеме!  :)