Results 1 to 1 of 1

Thread: QTCPSocket created from QTCPServer stops receiveing after first packet is sent until

  1. #1
    Join Date
    Oct 2012
    Posts
    1
    Qt products
    Qt4
    Platforms
    Windows

    Default QTCPSocket created from QTCPServer stops receiveing after first packet is sent until

    A QTCPSocket created from a QTCPServer after receiving a connection stops receiving after the first packet is sent from the QTCPServer Socket. If another packet is sent from the Server created socket the rest of the packets are received that were sent. I can tell that the tcp connection is still connected because the client is still in the connected state.

    The code is heavily based on the async Fortune Server.

    This is pretty confusing and I'm not sure how else to trouble shoot this. I've been working on this for about 3 days. Any suggestions would be greatly appreciated.

    Qt Code:
    1. class TCPThread : public QThread
    2. {
    3. Q_OBJECT
    4.  
    5. public:
    6. TCPThread(int socketDescriptor, QObject *parent);
    7.  
    8. void run();
    9.  
    10. void write(QString& toWrite);
    11. signals:
    12. void error(QTcpSocket::SocketError socketError);
    13. void clientDisconnected();
    14. void receiveMessage(QString* message);
    15.  
    16. public slots:
    17. void readMessage();
    18. void disconnectedFromClient();
    19. void writeMessage(QString& message);
    20.  
    21. private:
    22. int socketDescriptor_;
    23. QTcpSocket* socket_;
    24.  
    25. };
    26.  
    27.  
    28.  
    29.  
    30. class TCPServerA : public QTcpServer
    31. {
    32. Q_OBJECT
    33.  
    34. public:
    35. TCPServerA(QObject *parent);
    36. ~TCPServerA();
    37.  
    38. void quit();
    39.  
    40. void write(QString& message);
    41.  
    42. public slots:
    43. void socketError(QTcpSocket::SocketError socketError);
    44. void disconnectedClient();
    45. void receiveMessage(QString* message);
    46.  
    47.  
    48. signals:
    49. void error(QTcpSocket::SocketError socketError);
    50. void disconnectedFromClient();
    51. void writeMessage(QString& message);
    52. void receivedMessage(QString* message);
    53.  
    54. private:
    55. void incomingConnection(int socketDescriptor);
    56.  
    57. TCPThread* thread_;
    58.  
    59.  
    60. };
    61.  
    62.  
    63. TCPThread::TCPThread(int socketDescriptor, QObject *parent)
    64. : QThread(parent), socketDescriptor_(socketDescriptor)
    65. {
    66. }
    67.  
    68.  
    69. void TCPThread::readMessage()
    70. {
    71. qint16 size(-1);
    72. QDataStream in( socket_ );
    73. QString* msg=new QString;
    74. in.setVersion(QDataStream::Qt_4_7);
    75.  
    76. //Get all of the data from the queue
    77. while (1)
    78. {
    79. if( size < 0 )
    80. {
    81. if( socket_->bytesAvailable() < sizeof( size ) )
    82. return;
    83. in >> size;
    84. }
    85. if( socket_->bytesAvailable() < size )
    86. return;
    87. in >> *msg;
    88.  
    89. emit receiveMessage(msg);
    90.  
    91. size = -1;
    92. }
    93.  
    94. }
    95.  
    96. void TCPThread::run()
    97. {
    98.  
    99. socket_= new QTcpSocket(this);
    100.  
    101. connect(socket_, SIGNAL(readyRead()),
    102. this, SLOT(readMessage()));
    103.  
    104. connect(socket_, SIGNAL(disconnected()),
    105. this, SLOT(disconnectedFromClient()));
    106.  
    107. if (!socket_->setSocketDescriptor(socketDescriptor_)) {
    108. emit error(socket_->error());
    109. return;
    110. }
    111.  
    112. exec();
    113.  
    114.  
    115. socket_->disconnectFromHost();
    116. socket_->waitForDisconnected();
    117. }
    118.  
    119. void TCPThread::disconnectedFromClient()
    120. {
    121. emit (clientDisconnected());
    122.  
    123. }
    124.  
    125. void TCPThread::writeMessage(QString& message)
    126. {
    127. write(message);
    128. }
    129.  
    130.  
    131. void TCPThread::write(QString& toWrite)
    132. {
    133. QByteArray block;
    134.  
    135. QDataStream out(&block, QIODevice::WriteOnly);
    136. out.setVersion(QDataStream::Qt_4_7);
    137. out<<(qint16)toWrite.size();
    138. out<<toWrite;
    139.  
    140. socket_->write(block);
    141. while(socket_->bytesToWrite() > 0)
    142. {
    143. socket_->waitForBytesWritten();
    144. }
    145. socket_->flush();
    146. }
    147.  
    148.  
    149. TCPServerA::TCPServerA(QObject *parent)
    150. : QTcpServer(parent), thread_(NULL)
    151. {
    152.  
    153. }
    154.  
    155. TCPServerA::~TCPServerA()
    156. {
    157.  
    158. }
    159.  
    160.  
    161. void TCPServerA::quit()
    162. {
    163. if (thread_ !=NULL)
    164. {
    165. thread_->quit();
    166. thread_->wait();
    167. delete thread_;
    168. thread_=NULL;
    169. }
    170.  
    171. close();
    172. }
    173.  
    174. void TCPServerA::incomingConnection(int socketDescriptor)
    175. {
    176.  
    177. thread_ = new TCPThread(socketDescriptor,this);
    178. connect(thread_,SIGNAL(error(QTcpSocket::SocketError socketError)),this, SLOT(socketError(QTcpSocket::SocketError)));
    179. connect(thread_, SIGNAL(finished()), thread_, SLOT(deleteLater()));
    180. connect(this, SIGNAL(writeMessage(QString&)), thread_, SLOT(writeMessage(QString&)));
    181.  
    182. connect(thread_, SIGNAL(receiveMessage(QString*)), this, SLOT(receiveMessage(QString*)));
    183. thread_->start();
    184. }
    185.  
    186. void TCPServerA::write(QString& message)
    187. {
    188. if (thread_ == NULL )
    189. return;
    190. //thread_->write(message);
    191. emit writeMessage(message);
    192.  
    193. }
    194.  
    195. void TCPServerA::socketError(QTcpSocket::SocketError socketError)
    196. {
    197. emit (error(socketError));
    198. }
    199.  
    200.  
    201. void TCPServerA::disconnectedClient()
    202. {
    203. emit (disconnectedFromClient());
    204. }
    205.  
    206. void TCPServerA::receiveMessage(QString* message)
    207. {
    208. emit (receivedMessage(message));
    209. }
    To copy to clipboard, switch view to plain text mode 
    Last edited by tlann; 24th October 2012 at 01:41. Reason: Forgot to remove something.

Similar Threads

  1. Replies: 0
    Last Post: 18th August 2011, 05:36
  2. QTcpServer - get the correct QTcpSocket
    By elcuco in forum Qt Programming
    Replies: 4
    Last Post: 11th May 2010, 10:49
  3. Packet handling advice with QTcpSocket?
    By zAAm in forum General Programming
    Replies: 1
    Last Post: 27th April 2010, 16:23
  4. QTcpServer QTcpSocket problem
    By jmsbc in forum Qt Programming
    Replies: 0
    Last Post: 20th November 2009, 18:42
  5. Packet getting fragmented when sending over QTcpSocket
    By arturo182 in forum Qt Programming
    Replies: 14
    Last Post: 6th August 2009, 00:11

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.