【关于封装qtcpsocket类的问题???】

大树学长 2017-10-11 03:48:03
功能:主类中调用封装类,能够发送数据。

封装类大致代码
h:
public:
QTcpSocket *socket;
public:
void A();//连接
void B();//发生数据

cpp:
A()
{
socket = new QTcpSocket();//出错位置
socket->abort();
socket->connectToHost(IP地址, 端口);
if(!socket->waitForConnected(1000))
{
//没有成功
return;
}
//成功
}

B()
{
socket->write(QObject::tr("数据").toLatin1());
socket->flush();
}

最后在主类中使用信号和槽来调用A、B函数会出错,错误原因是内存泄漏。
各位大神帮忙指点一下,A和B不能合在一起,因为发生的数据类型很多,封装类可能有很多和B差不多的函数。
...全文
730 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
萧洛 2017-10-12
  • 打赏
  • 举报
回复
不管是连接还是发送数据Socket必须先new出来,所以可以把new QTcpSocket放在构造函数中。或者你保证发送信号执行操作前,你已经把Socket给new出来了。 比如你可以写一个create()函数,包含new QTcpSocket以及其它一些初始化,然后在主程序中先调用这个create()函数。 ip地址和端口你可以做为A()函数的参数传入,外面可以直接调A()函数或者发带参数的信号。 本机IP可以自动获取,连接对端的IP肯定先确认。
Acuity. 2017-10-12
  • 打赏
  • 举报
回复
网络层的数据通过IP地址识别,用户应用数据通过端口号识别,客户端端口号一般让系统自动选择成即。
大树学长 2017-10-11
  • 打赏
  • 举报
回复
上面问题已经解决了, 新问题:关于封装类这块的IP地址和端口号,是手动输入还是自动寻找?自动寻找IP地址和端口这个功能实现起来难不难?是否存在BUG,比如有多台机时,怎么识别那一台是自己需要的?
大树学长 2017-10-11
  • 打赏
  • 举报
回复
如果将QTcpSocket *socket;放在A()中,就没有问题,可以使用,但是因为需要发送的数据有很多,所以还是不能用局部变量
博客地址:https://blog.csdn.net/weixin_41749063/article/details/104023987 摘要: ## 1.简介 其实Qt网络模块中自带的[QTcpsocket](https://doc.qt.io/archives/qt-5.6/qtcpsocket.html)已经封装的很好了,避免了用原始套接字编程繁琐的过程,不过大部分应用场景我们希望将收发数据 运行在一个单独的线程,不阻塞界面或其他线程。所以结合Qt自带的QThread 简单的封装了一下QTcpsocket,使其工作 在单独线程,并加入了心跳和断线重连机制。 ## 2.EasyClient说明 由于接触QT时间不是很长,所以写的不是很好,可能里边也有Bug,不过觉得这个思路应该是可行的。封装的比较简单,若有问题完全可以自己改改。主要提供一个思路就是的将一个继承自QObject的子转移到一个线程,使其在这个线程里进行事件循环,开一个定时器用于发送心跳和重连。 经过采坑发现,定时器的开和关需放在实例化EasyClient子的那个线程(下面称之为主线程),不能在事件循环线程中(下面称之为子线程中)否则会有错。实例化QTcpsock需要在 子线程中进行,否则会出现无法正常通信的现象。 使用时只需要实例化一个EasyClient的子,重写SendHeartBeat()和DisPoseReceiveData()两个纯虚函数,SendHeartBeat()决定发什么内容作为心跳指令,当有数据可读时会全部读入,只需要在DisPoseReceiveData()做处理即可。.

16,175

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧