
QTimer timer;
timersetSingleShot(true);
QEventLoop loop;
loopconnect(socket, SIGNAL(readyRead()), SLOT(quit()));
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
while (resultBytessize() < count)
{
timerstart(msTimeout);
loopexec();
}
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);
复制
QTcpSocket QTcpServer::nextPendingConnection ()
QHostAddress QAbstractSocket::peerAddress ()
if(m_>
TCP(Transmission Control Protocol)即传输控制协议,是计算机网络中运输层最重要的协议之一。而socket接口是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,或者说是一个API,应用程序接口函数。
socket的大致流程:服务器端先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
以上就是关于QTcpSocket同步读取全部的内容,包括:QTcpSocket同步读取、qttcpsocketpeerport端口不对、使用QT编写的TCP服务程序,怎么获取连接的客户端IP地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)