QT 服务器端写入函数出错(在线程 0 中停止...)

Posted

技术标签:

【中文标题】QT 服务器端写入函数出错(在线程 0 中停止...)【英文标题】:QT server side has error in write function (stopped in thread 0...) 【发布时间】:2016-08-04 08:10:14 【问题描述】:

我有一个小型聊天应用程序。我可以从客户端向服务器发送数据,但我不能从服务器向客户端发送数据。 这是我的服务器代码: .pro

QT       += core 
QT       += network
QT       -= gui

TARGET = QServer
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp \
    tcpserver.cpp

HEADERS += \
    tcpserver.h

//===========================TCPServer.h


#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QObject>
#include <QDebug>
#include <QTcpSocket>
#include <QTcpServer>

class TCPServer : public QObject

    Q_OBJECT
public:
    explicit TCPServer(QObject *parent = 0);
    ~TCPServer();
signals:

public slots:
    void newConnection();
    void disconnected();
    void readyRead();
    void writeData(QString data);

private:
    QTcpServer *serv;
    QTcpSocket *socket;
;
#endif // TCPSERVER_H

//===========================TCPServer.cpp


#include "tcpserver.h"

TCPServer::TCPServer(QObject *parent) : QObject(parent)

    serv=new QTcpServer(this);
    connect(serv,SIGNAL(newConnection()),this,SLOT(newConnection()));
    if(!serv->listen(QHostAddress::Any,3490))
    
        qDebug()<<"Server Error in Connecting...."<<serv->errorString();
    
    else
        qDebug()<<"Server Started     :)     ";


TCPServer::~TCPServer()

    disconnected();


void TCPServer::newConnection()

    socket=serv->nextPendingConnection();
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()));
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()));
    socket->write("Hello Client");
    socket->flush();//clean the buffer
    socket->waitForReadyRead(3000);
   // sock->close();


void TCPServer::disconnected()

    socket->close();
    qDebug()<<"Good By     :)     ";


void TCPServer::readyRead()

    //qDebug()<<"Server is Reading ...."<<socket->readAll();
    while(socket->canReadLine())
    
        QByteArray ba = socket->readLine();
        if(strcmp(ba.constData(), "!exit\n") == 0)
        
            socket->disconnectFromHost();
            break;
        
        //printf(">> %s", ba.constData());
        qDebug() << "Server is receiving ...."<<ba.constData();
    



void TCPServer::writeData(QString data)

    socket->write(data.toStdString().c_str());
    socket->flush();//clean the buffer
    socket->waitForReadyRead(3000);



//===========================TCPServer/main.cpp


#include <QCoreApplication>
#include "tcpserver.h"

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);
    TCPServer srv;
//    while(1)
//    
        QTextStream s(stdin);
        QString value = s.readLine();
        srv.writeData(value);
//      

我的服务器可以接收来自客户端的数据并很好地显示出来。但是当我想从服务器向客户端发送数据时,它会显示这个错误:

在线程 0 中停止: 0x5118cf9a 处的异常,代码:0xc0000005: 在 0x0x 处读取访问冲突,flags=0x0(第一次机会)

. 这是什么意思? 我在套接字上写入数据的错误在哪里?

【问题讨论】:

您是否尝试过在调试器中运行以捕捉正在发生的崩溃?然后你可以看到它在你的代码中发生的位置,并检查变量以查看它们的值是否正常。 对不起。怎么做?我把try catch。但没有错误显示给我 您的 IDE 应该有一个可以在调试器中运行的按钮或菜单选项。从那里开始。 您可以在新线程中处理用户输入,或者将您的TCPServer 移动到新线程。但不要尝试在一个线程中读取套接字并在另一个线程中写入。 你不想那样做。只需将输入处理移动到一个新线程,并在每次收到一些输入时从该线程发出一个信号。 Here 就是一个例子。 【参考方案1】:

我将输入处理移动到一个新线程,并在每次收到一些输入时从该线程发出一个信号。 (如thuga 回答)

【讨论】:

以上是关于QT 服务器端写入函数出错(在线程 0 中停止...)的主要内容,如果未能解决你的问题,请参考以下文章

qt中如何实现多线程?

停止 qt 写入 /dev/tty0

关闭 QT GUI 后如何停止线程

关于Qt中的信号槽连接connect函数

出错时停止代码执行 (C++)

使用多线程在 GNU C 中使用写入函数是不是安全