qt tcpsocket_qt的socket通信

qt tcpsocket_qt的socket通信QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险。必须控制connectToHost的使用次数!连接服务器m_tcpSocket->connectToHost(“127.0.0.1”,9877);connected=m_tcpSocket-

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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调试经验分享

这久在写一个基于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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195475.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • QCustomPlot使用心得五:坐标轴常用属性设置[通俗易懂]

    QCustomPlot使用心得五:坐标轴常用属性设置[通俗易懂]先看轴部分的名称约定,根据名称就可以修改对应的属性了1.显示坐标轴默认只显示左y轴和下边的x轴,调用setVisible(bool)设置轴是否显示customplot->yAxis2->setVisible(true);//显示y轴2customplot->xAxis2->setVisible(true);//显示x轴2调用se…

    2022年10月16日
  • pycharm指令_ftp登录及命令行用法

    pycharm指令_ftp登录及命令行用法“阅读本文大概需要3分钟。”相信很多人使用PyCharm来开发Python程序,但却少有人知道,PyCharm实际上有一个命令行程序。通过这个命令行程序可以帮你做很多事…

  • 1155功耗最低的cpu_英特尔超低功耗CPU

    1155功耗最低的cpu_英特尔超低功耗CPU【IT168评测】IvyBridge于北京时间4月24日0:00解禁了,这次Intel首次将3D晶体管工艺和22nm制程用于IVB,工艺提升晶体管变小的同时,还改进了处理器的微架构,尤其核芯显卡大幅提升。究竟工艺和制程对功耗有多大帮助,IVB的性能表现如何呢?请看IT168给您带来的IvyBridge处理器最高端型号i73770K评测。▲低功耗是亮点Intel第三代酷睿CPU评测在30…

  • 安卓微信本地数据库解密[通俗易懂]

    安卓微信本地数据库解密[通俗易懂]安卓微信数据库解密

  • Java中CAS详解

    Java中CAS详解在JDK5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。独占锁是一种悲观锁,synchronized就是一种独占锁,会导

  • matlab实现人脸识别gui界面_神经网络实现人脸识别

    matlab实现人脸识别gui界面_神经网络实现人脸识别最近在学习matlab图像处理部分,发现人脸识别这一块非常好玩,在这里做个总结。人脸识别之一:查找图片中的人脸并用方框圈出这种类似于智能手机拍照时,屏幕里那个框任务头部的红框。大致步骤为:获取RGB图片—>转换为灰度图像—>图像处理—>人脸识别。从书中摘出的代码如下:clearallclc%获取原始图片i=imread(‘face.j…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号