关于使用QTcpSocket的一些总结
来源:互联网 发布:淘宝发布宝贝商家编码 编辑:程序博客网 时间:2024/05/22 15:57
QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险。必须控制connectToHost的使用次数!
连接服务器
m_tcpSocket->connectToHost(“127.0.0.1”, 9877);
connected = m_tcpSocket->waitForConnected();
只有使用waitForConnected()后,QTcpSocket才真正尝试连接服务器,并返回是否连接的结果。写数据
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断开与服务器的连接
m_tcpSocket->disconnectFromHost()
m_tcpSocket->waitForDisconnected()善于使用QTcpSocket的SIGNAL:connected(),disconnected(),error(QAbstractSocket::SocketError)
配合自定义私有开关变量bool connected,QTimer可以实现自动重连接等逻辑。
QTcpSocket调试经验分享
这久在写一个基于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);
}
转载自:http://blog.sina.com.cn/s/blog_4888f88101014euy.html#cmt_2022332
- 关于使用QTcpSocket的一些总结
- 关于使用QTcpSocket的一些总结
- QTcpSocket使用过程中的一些问题记录
- QTcpSocket使用过程中的一些问题记录
- QTcpSocket使用过程中的一些问题记录
- QUdpSocket和QTcpSocket的使用
- QTcpServer和QTcpSocket的使用
- 关于使用libsvm的一些总结
- 关于virtualbox的一些使用总结
- 关于kvm轻度使用的一些总结
- 关于使用bootstrap的一些小总结
- 关于kvm轻度使用的一些总结
- 关于使用STM32 SPI3的一些总结
- 关于学习使用CGI的一些总结
- iOS关于Button使用的一些总结
- 关于echarts的一些使用总结(饼图);
- 【阶段总结】关于Python使用的一些总结
- 关于boost智能指针使用的一些坑的总结
- Restful后台系统搭建(四)
- C语言中static变量的作用
- 两会花絮:各显神通拍两会
- 旧键盘打字(20)
- 锋利的Jquery(第二版)笔记(二)
- 关于使用QTcpSocket的一些总结
- 文章标题
- Java Map的底层实现
- 全国政协文史和学习委员会驻会副主任卞晋平莅临汪国新湖北诗书画院
- 机器学习并没有那么深奥,它很有趣(4)
- 排序6:堆排序
- 结构体内存对齐
- ui-sref如何传递参数
- Android 的jar混淆踩坑之旅