• 10871阅读
  • 9回复

QTcpSocket问题-服务器断开-崩溃! [复制链接]

上一主题 下一主题
离线xairwolfcn
 

只看楼主 倒序阅读 楼主  发表于: 2012-03-29
RT 请高手指教-谢谢帮忙!
我自己参照网上的一些资料写了个QTcpSocket的线程!当我连接到服务器后,然后让服务器断开连接,程序有时候就正常,但是大多数情况下程序就崩溃!
错误信息如下图:


就是d这个参数有问题!  
  if (d->socketEngine)
        d->socketEngine->setReadNotificationEnabled(false); 执行完这句就挂了!!


我尝试过用Designer进行编译,MinGw进行编译,并且今天我还更新了新的QT4.8.1(以前是4.8.0),都是崩溃,一会儿就好了!
我把链接socket状态信号和自定义槽,注释掉后,就留下发射数据的信号,就没有任何问题!如下:
  1. //connect(socketClient, SIGNAL(connected()),this, SLOT(sendRequest()));
  2. //connect(socketClient, SIGNAL(disconnected()), this,SLOT(connectionCloseByServer()));
  3. connect(socketClient, SIGNAL(readyRead()), this, SLOT(recvdatagram()),Qt::DirectConnection);
  4. //connect(socketClient, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error()));


所以我怀疑我的代码写的有问题,请各位高手指点!!
贴源码:
SocketThread.h
  1. #ifndef SOCKETTHREAD
  2. #define SOCKETTHREAD
  3. #include <QtNetwork/QtNetwork>
  4. #include <QThread>
  5. class SocketThread : public QThread
  6. {
  7. Q_OBJECT
  8. //function
  9. public:
  10. SocketThread(QHostAddress addr, int port);
  11. ~SocketThread();
  12. //通过该函数删除socket
  13. void Stop();
  14. // variable
  15. public:
  16. //variable
  17. private:
  18. int sum;
  19. bool needStopThread;
  20. QTcpSocket *socketClient;
  21. quint16 readBufferSize;
  22. quint16 nextBlockSize;
  23. QByteArray datagram;
  24. QHostAddress _hostAddress;
  25. int _portNumber;
  26. //function
  27. private:
  28. void closeConnection();
  29. private slots:
  30. void sendRequest();
  31. void connectionCloseByServer();
  32. void error();
  33. void recvdatagram();
  34. signals:
  35. //将接收到的数据和状态发射出去!
  36. void RecvDateDisplay(QByteArray str);
  37. void SumDisplay(int s);
  38. void disButtonDisplay(bool b);
  39. void conButtonDisplay(bool a);
  40. void proBarDisplay(bool a);
  41. void staLabeDisplay(QString str);
  42. protected:
  43. virtual void run();
  44. };
  45. #endif //SOCKETTHREAD

SocketThread.cpp
  1. #include "SocketThread.h"
  2. #include <QtGui>
  3. SocketThread::SocketThread(QHostAddress addr, int port)
  4. {
  5. _hostAddress =addr;
  6. _portNumber = port;
  7. sum = 0;
  8. needStopThread = false;
  9. socketClient=NULL;
  10. readBufferSize = 256;
  11. qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");
  12. }
  13. SocketThread::~SocketThread()
  14. {
  15. needStopThread = false;
  16. closeConnection();
  17. quit();
  18. wait();
  19. }
  20. void SocketThread::sendRequest()
  21. {
  22. emit staLabeDisplay(tr("Connected!"));
  23. emit proBarDisplay(false);
  24. }
  25. void SocketThread::connectionCloseByServer()
  26. {
  27. if (nextBlockSize != 0xFFFF)
  28. {
  29. emit staLabeDisplay(tr("Error:connection closed by server"));
  30. emit proBarDisplay(false);
  31. }
  32. if (socketClient)
  33. {
  34. socketClient->close();
  35. exit();
  36. wait();
  37. }
  38. }
  39. void SocketThread::error()
  40. {
  41. emit staLabeDisplay(socketClient->errorString());
  42. emit proBarDisplay(false);
  43. emit conButtonDisplay(true);
  44. emit disButtonDisplay(false);
  45. if (socketClient)
  46. {
  47. socketClient->close();
  48. exit();
  49. wait();
  50. }
  51. }
  52. void SocketThread::run()
  53. {
  54. nextBlockSize = 0;
  55. socketClient = new QTcpSocket;
  56. if (!_hostAddress.isNull() && _portNumber >0)
  57. {
  58. socketClient->abort();
  59. socketClient->connectToHost(_hostAddress, _portNumber, QIODevice::ReadOnly);
  60. socketClient->setReadBufferSize(readBufferSize);
  61. emit staLabeDisplay(tr("Connect to Server........"));
  62. emit proBarDisplay(true);
  63. emit conButtonDisplay(false);
  64. emit disButtonDisplay(true);
  65. }
  66. //slot
  67. connect(socketClient, SIGNAL(connected()),this, SLOT(sendRequest()));
  68. connect(socketClient, SIGNAL(disconnected()), this,SLOT(connectionCloseByServer()));
  69. connect(socketClient, SIGNAL(readyRead()), this, SLOT(recvdatagram()),Qt::DirectConnection);
  70. connect(socketClient, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error()));
  71. exec();
  72. while(needStopThread)
  73. {
  74. if (socketClient)
  75. {
  76. closeConnection();
  77. }
  78. break;
  79. }
  80. }
  81. void SocketThread::closeConnection()
  82. {
  83. socketClient->abort();
  84. socketClient->close();
  85. delete socketClient;
  86. socketClient = NULL;
  87. sum =0;
  88. emit proBarDisplay(false);
  89. emit conButtonDisplay(true);
  90. emit disButtonDisplay(false);
  91. }
  92. void SocketThread::Stop()
  93. {
  94. needStopThread = true;
  95. }
  96. void SocketThread::recvdatagram()
  97. {
  98. if (socketClient->bytesAvailable() >0)
  99. {
  100. datagram.resize(socketClient->bytesAvailable());
  101. socketClient->read(datagram.data(), datagram.size());
  102. sum = sum +datagram.size();
  103. emit SumDisplay(sum);
  104. emit RecvDateDisplay(datagram);
  105. }
  106. }





OASIS
离线xairwolfcn

只看该作者 1楼 发表于: 2012-03-29
对了我的开发环境是 vs2008 + qt-win-opensource-4.8.1-vs2008.exe +Qt Visual Studio Add-in 1.1.10
OASIS
离线淳于半邪

只看该作者 2楼 发表于: 2012-03-30
明显是内存问题,自己检查下
离线xairwolfcn

只看该作者 3楼 发表于: 2012-03-30
回 2楼(淳于半邪) 的帖子
关键是我主动关闭线程,socket就没有问题! 只有在连接好的服务器短掉的时候才出问题!
OASIS
离线xairwolfcn

只看该作者 4楼 发表于: 2012-03-30
回 2楼(淳于半邪) 的帖子
关键是我想调试都进不去 我的程序!直接进QAbstractSocket,没法搞!!
OASIS
离线淳于半邪

只看该作者 5楼 发表于: 2012-03-31
回 3楼(xairwolfcn) 的帖子
那你应该在服务器断开做相应的处理
离线xairwolfcn

只看该作者 6楼 发表于: 2012-03-31
回 5楼(淳于半邪) 的帖子
服务器断开,后我的程序是 连接了个槽
78.connect(socketClient, SIGNAL(disconnected()), this,SLOT(connectionCloseByServer()));
可是问题是,我做单步调试,根本就进不到connectionCloseByServer()里面去!!
所以比较纠结!
OASIS
离线淳于半邪

只看该作者 7楼 发表于: 2012-04-01
回 6楼(xairwolfcn) 的帖子
单从这个上面看是没错的,你在仔细检查下自己的程序
离线xairwolfcn

只看该作者 8楼 发表于: 2012-04-01
回 7楼(淳于半邪) 的帖子
麻烦大哥,给我指个方向。。现在我都找了好几天了。。都没有结果!哎!
OASIS
离线xairwolfcn

只看该作者 9楼 发表于: 2012-04-12
问题的原因找到了!应该采用阻塞式通信方式,参照Qt自带的例子,Blocking Fortune Client Example
就没有问题!!
OASIS
快速回复
限100 字节
 
上一个 下一个