Russian Qt Forum

Qt => Работа с сетью => Тема начата: kuzulis от Сентябрь 02, 2009, 12:56



Название: Что-то непонятное с QTcpServer или QTcpSocket или со мной!
Отправлено: kuzulis от Сентябрь 02, 2009, 12:56
Доброго дня,

написал тут два простеньких тестовых консольных приложения , которые обмениваются пакетами через локалхост, для тестирования сигнала readyRead() - и дело в том, что сигнал не отлавливается!

writer - это клиент
reader - это сервер

writer -> main.cpp
Код:
...
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);

QTcpSocket *client = new QTcpSocket();

for (;;) {
client->connectToHost(QHostAddress::LocalHost, 502);
if (client->waitForConnected(5000)) {
qDebug("Connected!");
break;
}
else {
qDebug() << "Retry connect" << QTime::currentTime();;
}
}

QByteArray ba;
qint64 bw = 0;
while (1) {
cout << "Please enter count bytes for wtitten : ";
bw = 0;
cin >> bw;
qDebug() << "Starting writting " << bw << " bytes in time : " << QTime::currentTime();
ba.clear();
ba.resize(bw);
for (int i=0;i<bw;i++) { //filling data array
ba[i] = i;
}
bw = client->write(ba);
qDebug() << "Writed is : " << bw << " bytes";
cout << "Tx : ";
printDataToHex(ba);
}

return app.exec();
}
...

reader -> sreader.h
Код:
...
class Reader : public QTcpServer
{
Q_OBJECT

public:
Reader(QObject *parent = 0) : QTcpServer(parent) {
//setMaxPendingConnections(2);
    if (!listen(QHostAddress::LocalHost, 502)) {
        qDebug() << "Unable to start the server: " << errorString();
return;
    }
connect(this, SIGNAL(newConnection()), this, SLOT(slotAccept()));
}
~Reader() {
}
private slots:
void slotMsg() { qDebug() << "ReadyRead"; }
void slotAccept() {
socket = nextPendingConnection();
qDebug() << "New connection sd : " << socket->socketDescriptor();
connect(socket, SIGNAL(readyRead()), this, SLOT(slotMsg()));
}
private:
QTcpSocket *socket;

};
...

Приложение reader отлавливает сам факт подключения клиента writer, но когда я из приложения writer шлю для reader данные - то reader никак не реагирует

Прикрепил архивы с исходниками. Помогите люди добрые! :)




Название: Re: Что-то непонятное с QTcpServer или QTcpSocket или со мной!
Отправлено: BRE от Сентябрь 02, 2009, 13:23
Посмотри на:
bool QAbstractSocket::flush ()


Название: Re: Что-то непонятное с QTcpServer или QTcpSocket или со мной!
Отправлено: kuzulis от Сентябрь 02, 2009, 13:48
Цитировать
Посмотри на:
bool QAbstractSocket::flush ()

да, СПАСИБО, использование метода flush() после write() исправляет проблему!

И я вот заметил при этом, что например если выдавать около 1000000 байт - то сигнал readyRead() несколько раз емиттится :) .

(Поведение аналогично виндовой версии QSerialDevice) ! Ура! Это мне и надо было проверить!