Hello, I am writing a Tcp client program, which ping server every 3 sec. the general behaviour is : 1) client connects to server 2) send a identification packet 3) server checks the packet and reply accordingly *4) server ends the connection. (not client) *
so I get a error QAbstractSocket::error(QAbstractSocket::SocketError) = RemoteHostClosedError (I guess its because server ends the connection) but when I get this error the QAbstractSocket::disconnected() signal is emited but this is not emitted for other types of error which is confusing me. * * *and some times its stop pinging !* * * following is my client code : *// H* #ifndef PING_H #define PING_H #include <QObject> #include <QtNetwork/QTcpSocket> struct PingData; class Ping : public QObject { Q_OBJECT public: explicit Ping(const QString& address, qint16 port, QObject *parent = 0); void start(); private slots: void connectedToserver(); void readFromserver(); void disconnectedFromServer(); void timerInterval(); void clientError(QAbstractSocket::SocketError error); private: PingData* d; }; #endif // PING_H *// CPP* #include "Ping.h" #include <QTimer> #include <QDebug> #define PINGTIME 3000 struct PingData { QString address; qint16 port; QTcpSocket* socket; }; Ping::Ping(const QString& address, qint16 port, QObject *parent) : QObject(parent) { d = new PingData; d->address = address; d->port = port; d->socket = new QTcpSocket(this); connect(d->socket, SIGNAL(connected()), this, SLOT(connectedToserver())); connect(d->socket, SIGNAL(readyRead()), this, SLOT(readFromserver())); connect(d->socket, SIGNAL(disconnected()), this, SLOT(disconnectedFromServer())); connect(d->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(clientError(QAbstractSocket::SocketError))); } void Ping::connectedToserver() { QString packet = "[nomad:121212,]\r\nEOF\r\n"; d->socket->write(packet.toAscii()); } void Ping::readFromserver() { qDebug() << d->socket->readAll(); } void Ping::disconnectedFromServer() { d->socket->reset(); if(d->socket->isOpen()) d->socket->close(); QTimer::singleShot(PINGTIME, this, SLOT(timerInterval())); } void Ping::timerInterval() { if(d->socket->isOpen()) d->socket->close(); d->socket->connectToHost(d->address, d->port); } void Ping::start() { QTimer::singleShot(PINGTIME, this, SLOT(timerInterval())); } void Ping::clientError(QAbstractSocket::SocketError error) { qDebug() << Q_FUNC_INFO << " : " << (int)error; if(error == QAbstractSocket::RemoteHostClosedError) { d->socket->disconnectFromHost(); // emits the signal disconnected } else { d->socket->close(); this->disconnectedFromServer(); // else call the slot directly } } Please let me know where I am going wrong. Thanks -- Abhishek http://thezeroth.net
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest