QTcpSocket 内存问题

  • Post author:
  • Post category:其他




我自己测试也发现反复的




connectToHost




会有内存泄露,建议谨慎的使用!













QTcpSocket类的方法connectToHost会泄露内存, 即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险。必须控制




connectToHost的使用次数!








1. 连接服务器

m_tcpSocket->connectToHost(“127.0.0.1”, 9877);

connected = m_tcpSocket->waitForConnected();

只有使用waitForConnected()后,QTcpSocket才真正尝试连接服务器,并返回是否连接的结果。

2. 写数据

m_tcpSocket->write(str.toStdString().c_str(), strlen(str.toStdString().c_str()));

m_tcpSocket->waitForBytesWritten();

当使用waitForBytesWritten()后,QTcpSocket才真正发送数据。

m_tcpSocket->write(str1.toStdString().c_str(), strlen(str1.toStdString().c_str()));

m_tcpSocket->write(str2.toStdString().c_str(), strlen(str2.toStdString().c_str()));

的结果是发送了str1str2

3. 断开与服务器的连接

m_tcpSocket->disconnectFromHost()

m_tcpSocket->waitForDisconnected()

4. 善于使用QTcpSocket的SIGNAL:connected(), disconnected(), error(QAbstractSocket::SocketError)

配合自定义私有开关变量bool connected, QTimer

可以实现自动重连接等逻辑。







其他参见:







[经验分享]

QTcpSocket调试经验分享




http://www.thisisqt.com/forum/viewthread.php?tid=460



这久在写一个基于TCP的

通信

程序,Server端用WinCE实现,而Client端用Qt实现,之前已写了一个VC的Client端,能正确向Server发送数据。

将Client端改用Qt实现后connectToHost()后,server端已能正确accept(),但就是write()后server的read函数无法响应。调试了半天没有成功,火大呀!今天试着输出socket的状态后得到如下:



  1. bool TcpClient::newConnect(const

    QString

    &iAddr, quint16 iPort)




  2. {













  3. mSocket = newQ

    TcpSocket

    (this);












  4. mSocket->connectToHost(iAddr,iPort);












  5. qDebug(“State:%d\n”,mSocket->state());








    // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)
















  6. connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));












  7. connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);




  8. }








  9. qint64 TcpClient::write(const QByteArray &iData)




  10. {













  11. qint64len = mSocket->write(iData);












  12. qDebug(“State:%d\n”,mSocket->state()); // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)
















  13. msleep(200);












  14. return(len);




  15. }




复制代码





通过输出状态,已经找到问题的所在,哎!都是业务不熟害的呀!




socket的连接是异步的,所以必须等连接建立完成才能使用,所以分别加入waitForConnected()和waitForBytesWritten()后调试通过。




  1. bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)




  2. {













  3. mSocket = new

    QTcpSocket

    (this);












  4. mSocket->connectToHost(iAddr, iPort);












  5. qDebug(“State:%d\n”,mSocket->state());








    // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)
















  6. constintTimeout=5*1000;












  7. if(!mSocket->waitForConnected(Timeout))












  8. {





























  9. return(false);












  10. }












  11. qDebug(“State:%d\n”,mSocket>state()); // State: 3(ConnectedState)正确
















  12. connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));












  13. connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);




  14. }








  15. qint64 TcpClient::write(const QByteArray &iData)




  16. {













  17. qint64len = mSocket->write(iData);












  18. mSocket->waitForBytesWritten(300);












  19. qDebug(“State:%d\n”,mSocket->state());








    // State: 3(ConnectedState)正确
















  20. msleep(200);












  21. return(len);




  22. }



QT下用QTcpSocket传输文件, 调用了QTcpSocket:write()但是如何没有bytesWritten信号上来




http://www.myexception.cn/qt/369565.html









[提问]如何正常关闭QTcpsocket?我觉得很难协调好客户端和服务端的关闭操作




有益的讨论:

http://www.qtcn.org/bbs/read-htm-tid-26913.html














其它文章:http://www.qtcn.org/bbs/read-htm-tid-56901.html







在构造函数中 new了 一个m_TcpSocket,然后关联了几个信号。








m_TcpSocket


=


new QTcpSocket


(


this


);






connect


(


m_TcpSocket


, SIGNAL(


readyRead


()),this,SLOT(


readMessage


()));






connect


(


m_TcpSocket


, SIGNAL(


error


(QAbstractSocket::SocketError)),  this,SLOT(


displayError


(QAbstractSocket::SocketError)));






connect


(


m_TcpSocket


, SIGNAL(


connected


()), this, SLOT(


onConnect


()));






connect


(


m_TcpSocket


, SIGNAL(


disconnected


()), this, SLOT(


onDisConnect


()));






然后在 qpushbutton 连接的槽函数中






m_TcpSocket


->


abort


();






m_TcpSocket


->


connectToHost


(StrIP,nPort);






当我关闭tcp连接m_TcpSocket->disconnectFromHost();,然后重新连接时发现内存不断增大。






我想实现的是当服务器连接不上的时候,重新进行连接请求直到连接上为止(断线重连)。




我就定义了timer 重复使用connectToHost函数进行连接直到连上为止。




基本功能我实现了,可是在这重复connectToHost时,内存会不停增大。不管我在connectToHost前添加






m_TcpSocket


->


abort


();








m_TcpSocket


->


close


();






m_TcpSocket


->


disconnectFromHost


();




都没用。有什么办法解决么???