qtcpsocket断开_关于使用QTcpSocket的一些总结

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?我觉得很难协调好客户端和服务端的关闭操作

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值