Хочу разобраться с использованием QTcpSocket.
Пытаюсь написать примитивный клиент под WinXP.
В качестве сервера - виндовый гипертерминал.
В частности, интересует двунаправленный обмен данными без закрытия соединения после отправки данных (в отличие от примеров Fortune).
Отправленные моим приложением данные доходят до гипертерминала, отправленные с гипертерминала данные доходят до моего приложения.
Но при этом: сигнал
readyRead от используемого мной
QTcpSocket я получаю не только когда мое приложение получает данные от
гипертерминала, но и когда я отправляю данные через метод
write сокета.
Что бы это значило и как с этим бороться?
мои исходники:
tcptester.h#ifndef TCPTESTER_H
#define TCPTESTER_H
#include <QtNetwork>
#include <QObject>
#include <QString>
#include <QTcpSocket>
class TcpTester : public QObject
{
Q_OBJECT
public:
TcpTester(QObject *parent = 0);
~TcpTester();
void InitConnection(QString address, quint16 port);
void CloseConnection();
void WriteTo(QString str);
QTcpSocket * client;
signals:
public slots:
void startTransfer();
void ReportError(QAbstractSocket::SocketError ErrCode);
void ReadFromSocket();
void slotOnWritten(qint64 written);
};
#endif // TCPTESTER_H
tcptester.cpp#include "tcptester.h"
TcpTester::TcpTester(QObject *parent) :
QObject(parent)
{ client = new QTcpSocket (this);
connect(client, SIGNAL(connected()),
this, SLOT(startTransfer()),Qt::DirectConnection);
connect(client, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(ReportError(QAbstractSocket::SocketError)),Qt::DirectConnection);
connect(client, SIGNAL(readyRead()),
this, SLOT(ReadFromSocket()),Qt::DirectConnection);
connect(client, SIGNAL(bytesWritten(qint64)),
this, SLOT(slotOnWritten(qint64)),Qt::DirectConnection);
}
TcpTester::~TcpTester()
{
client->close();
}
void TcpTester::InitConnection(QString address, quint16 port)
{
QHostAddress addr(address);
client->connectToHost(addr, port);
}
void TcpTester::startTransfer()
{
QString qstr= "Start transfer from client";
QByteArray bytearr = qstr.toUtf8();
client->write(qstr.toUtf8(), qstr.toUtf8().length() );
client->write("\r\n\0", 3);
client->flush();
}
void TcpTester::CloseConnection()
{
client->close();
}
void TcpTester::WriteTo(QString str)
{
client->write(str.toUtf8(), str.toUtf8().length() );
client->write("\r\n\0", 3);
client->flush();
}
void TcpTester::ReportError(QAbstractSocket::SocketError ErrCode)
{
qDebug() << "SOCKET ERROR=" << ErrCode;
}
void TcpTester::ReadFromSocket()
{
QByteArray bytes = client->readAll();
qDebug() << "recieved:" << bytes;
}
void TcpTester::slotOnWritten(qint64 written)
{
qDebug() <<"slotOnWritten: " << written <<" bytes";
}
mainwindow.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "tcptester.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private:
Ui::MainWindow *ui;
TcpTester * pTester;
private slots:
void on_pushButton_2_clicked();
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
mainwindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "tcptester.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ ui->setupUi(this);
pTester = new TcpTester(this);
}
void MainWindow::on_pushButton_clicked()
{
pTester->CloseConnection();
pTester->InitConnection("127.0.0.1",23);
}
void MainWindow::on_pushButton_2_clicked()
{
int state = pTester->client->state();
bool valid = pTester->client->isValid();
if (valid && state==QAbstractSocket::ConnectedState)
{
QString qstr="write test";
pTester->WriteTo(qstr);
};
}