qttcpsocketpeerport端口不对

qttcpsocketpeerport端口不对,第1张

F libc : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8 in tid 18493 (QThread), pid 18454 (projectexample)
或者是
ASSERT: “m_buf” in file
这两个错误
是因为socket 在write的时候, 调用线程和socket创建的线程不一致产生的崩溃
有两种情况
在其他线程调用了write函数,需要通过信号跳转到socket创建的线程调用write(connect信号时添加Qt::QueuedConnection参数),例如:
QObject::connect(this, static_cast<void (Socket::)(const QByteArray &)>(&Socket::write),
this, [=](const QByteArray &byte){
if( socket->state() == QTcpSocket::ConnectedState ) {
socket->write(bytedata(), bytesize());
}
}, Qt::QueuedConnection);
复制
处理socket的disconnected信号重连时,QObject::connect需要添加Qt::QueuedConnection 参数
QObject::connect(socket, &QTcpSocket::disconnected, this, [=](){
socket->disconnectFromHost();
qDebug() << "socket disconnect";
int time = 0;
socket->connectToHost(deviceIP, cfgport);
while (!socket->waitForConnected(50) && !exit && (time < 20)) {
socket->connectToHost(cfgip, cfgport);
time ++;
}
if( socket->state() != QAbstractSocket::ConnectedState ) {
qDebug() << "socket reconnect fail";
}
else {
qDebug() << "socket reconnect success";
}
}, Qt::QueuedConnection);
复制

首先回答第一个问题,读和写可以有多种实现方式,用write和read只是其中一种,前面一个函数中的 clientConnection->write(block)是调用了QTcpSocket 类中的write方法来实现,如果你想不用此方法调用类中的read和write方法,就是你问的第二个问题,in和out的作用,in和out在这里将对socket中的报文收发变为数据流的形式来 *** 作,QDataStream in(tcpSocket)比如这一句是将tcpSocket这个连接的实例对象作为一个文件描述符传递给QDataStream,然后 in >> blockSize这句话实现的就是相当于read的 *** 作,就是将数据流读出来。这个 out << (quint16)(blocksize() - sizeof(quint16))是写入。实际上对诸如串口收发,读写文件,socket通信等等,用C语言来写,抽象出来都是对文件描述符进行 *** 作,都可以用write和read来做,所以,实际上,第一种方法和第二种方法是一样的,就看你选择什么样的方法了,第三个问题可参考out << (quint16)(blocksize() - sizeof(quint16))这样的方法在收到数据以后把数据发出去。
请给分。。。

QTcpSocket 类:
提供一个TCP套接字
TCP是一个面向连接,可靠的的通信协议,非常适合于连续不断的数据传递
QTcpSocket 是QAbstractSocket类非常方便的一个子类,让你创建一个TCP连接和数据流交流。
QTcpServer类:
提供一个TCP基础服务类继承自QObject
这个类用来接收到来的TCP连接,可以指定TCP端口或者用QTcpServer自己挑选一个端口,可以监听一个指定的地址或者所有的机器地址。

使用QTcpSocket进行网络通信编程时,我们希望在程序中可以阻塞等待readRead()信号的到来,这样可以达到我们的目的,正确的接收服务器发来的数据。
方法如下:
if(this->mpTcpSocket->waitForReadyRead()==false){ QMessageBox::warning(this,tr("Waring"),tr("Server does not response!")); return ; }
waitForReadyRead()函数默认阻塞3秒,如果超过3秒,还没有数据发过来,就返回false,如果接收到数据,你就可以在这段代码下面接收数据了,其他的信号也可以用同样的方法阻塞。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10589123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存