我自己测试也发现反复的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的状态后得到如下:
- bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)
- {
- mSocket = newQTcpSocket(this);
- mSocket->connectToHost(iAddr,iPort);
- qDebug("State:%d\n",mSocket->state()); // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)
- connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
- connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);
- }
- qint64 TcpClient::write(const QByteArray &iData)
- {
- qint64len = mSocket->write(iData);
- qDebug("State:%d\n",mSocket->state()); // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)
- msleep(200);
- return(len);
- }
socket的连接是异步的,所以必须等连接建立完成才能使用,所以分别加入waitForConnected()和waitForBytesWritten()后调试通过。
- bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)
- {
- mSocket = newQTcpSocket(this);
- mSocket->connectToHost(iAddr, iPort);
- qDebug("State:%d\n",mSocket->state()); // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)
- constintTimeout=5*1000;
- if(!mSocket->waitForConnected(Timeout))
- {
- return(false);
- }
- qDebug("State:%d\n",mSocket>state()); // State: 3(ConnectedState)正确
- connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
- connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);
- }
- qint64 TcpClient::write(const QByteArray &iData)
- {
- qint64len = mSocket->write(iData);
- mSocket->waitForBytesWritten(300);
- qDebug("State:%d\n",mSocket->state()); // State: 3(ConnectedState)正确
- msleep(200);
- return(len);
- }
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();
都没用。有什么办法解决么???