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可以实现自动重连接等逻辑。(注意:如果一个线程有多个连接的话,由于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.csdn.net/u011125673/article/details/50474491

关于使用QTcpSocket的一些总结的更多相关文章

  1. QT5在VS2013中找不到QtNetwork或QTcpSocket或QTcpSocket等头文件

    一.首先是要有相关的库文件 方法一:手动添加库文件Qt5Networkd.lib 对项目进行右键,找到相关的属性,然后查看Linker中input部分的红色选项中是否含有Qt5Networkd.lib ...

  2. QTcpSocket 及 TCP粘包分析

    ----我的生活,我的点点滴滴!! 这两天用Qt简单的实现一个tcp多线程client,在此记录下知识. 一.长连接与短连接 1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开 ...

  3. QTcpSocket通信编程时阻塞与非阻塞的问题

    目标,qt程序作为客户端,windows下winsock作为服务器端,实现两端通信. 开始时写了一个小函数测试: [cpp] view plaincopy QTcpSocket tmpSock;  t ...

  4. QTexstStream的操作对象是QIODevice(因此QFile,QBuffer,QProcess,QTcpSocket都可以使用),或者QString

    QTexstStream用于读写纯文本以及HTML,XML等文本格式的文件,此类考虑了Unicode编码与系统本地编码的或其它任意编码之间的转换问题,别且明确地处理了因使用不同的操作系统而导致的行尾符 ...

  5. 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据

    最近要在QT下开发Tcp通讯,发送序列化数据以便于接收. 这里涉及到几个问题: 1.QTcpSocket.QTcpServer的通讯 2.QDataStream序列化数据 多的不说,直接上干货!!! ...

  6. 5.关于QT中的网络编程,QTcpSocket,QUdpSocket

     1 新建一个项目:TCPServer.pro A  修改TCPServer.pro,注意:如果是想使用网络库,需要加上network SOURCES += \ TcpServer.cpp \ T ...

  7. QTcpSever和QTcpSocket实现多线程客户端和服务端;

    QTcpServer提供了newConnection信号, 可以通过connect实现连接槽函数,利用nextPendingConnection 函数获取连接的QTcpSocket * :也可以继承Q ...

  8. QTCPSOCKET 客户端已连接 而服务器无响应

    最近在使用qt coding一个项目时,使用到了qtcpsocket模块来编写客户端与服务器.在windows平台下还能正常工作,但是在ubuntu平台下,客户端提示已连接时,服务器却没有响应.经过排 ...

  9. QTcpSocket 相关知识总结

    1.  连接服务器 m_tcpSocket->connectToHost("127.0.0.1", 9877); connected = m_tcpSocket->wa ...

  10. QTcpSocket的连续发送数据和连续接收数据

    关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读.本以为 ...

随机推荐

  1. JFACE-SWT开发记录

    需要的工具 1.Eclipse 2.JDK 3.exe4j 4.Eclipse附加插件windowsBuilder :百度直接搜去eclipse官网下 exe4j配置:http://xiejiangl ...

  2. nodepad++ 正则 替换

    (?<k1>.*?)\=(?<k2>.*?); cookie.Add(new CookieList() { Key = "\1", Value = &quo ...

  3. C#中int、long、float、double、decimal最大值最小值

    最近在将java上写的一个简单的表达式求值计算器移植到Windows Phone 8,java中double的精度问题是很明显的,解决办法是改用BigDecimal类.所以觉得C#中用double也是 ...

  4. Session的clear方法和flush方法

    Session Clear()与 Flush() 解释 1.Clear 方法  无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强 ...

  5. linux netstat 统计连接数查看

    服务器上的一些统计数据 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...

  6. (原创)C++11改进我们的程序之简化我们的程序(一)

    C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注.这次要讲的是:C++11如何通过获取函数模板的返回值类型来简化我们的程序.在谈到简化之前,我们先 ...

  7. 运行Virtualbox去安装系统时出错:Failed to open a session for the virtual machine,Unable to load R3 module xxxx/VBoxDD.DLL(VBoxDD)

    貌似看到不少人(1,2,3),在使用Virtualbox去安装系统时,都遇到这个错误: 比如这里遇到的: 截图: 和另外这里的截图: 加文字描述: Failed to open a session f ...

  8. raise EnvironmentError("%s not found" % (mysql_config.path,)) EnvironmentError: mysql_config not found 解决办法

    报错信息如下: Downloading https://pypi.tuna.tsinghua.edu.cn/packages/a5/e9/51b544da85a36a68debe7a7091f068d ...

  9. 安装pydiction

    pydiction用来实现代码补全和语法提示功能.pydiction不能通过apt安装,需要自行下载安装. 在GitHub下载源码,可以使用Git迁出到本地,或者下载zip包自行解压,地址为:http ...

  10. Linux操作系统入门学习总结(2015.10)

    用了差不多45天的时间把Linux操作系统入门的资料学习了下.主要阅读了以下几本书: 鸟哥的私房菜:Linux基础学习篇(第三版) "Running Linux" <LINU ...