2015-01-02 2 views
0

여러 스레드를 처리 할 수있는 서버가 있습니다. 서버가 시작하고 청취하지만 들어오는 연결이 보류 중일 때 에코하는 데 문제가 있습니다.다중 스레드 Qt 서버가 클라이언트가 보낸 데이터를 반향하지 않습니다.

텔넷을 사용하여 소켓을 열고 데이터를 서버로 보내고 있습니다. 그러나 서버는 수신 대기 중임을 표시하지만 텔넷을 통해 입력 한 데이터를 반향 출력하지 않으며 수신 연결이 있음을 나타냅니다. 나는 개인 네트워크를 위해 Windows 방화벽을 차단하고 여전히 ... 아무것도하지 않습니다.

또한 서버 오류 문자열에 유용한 정보가 있는지 살펴 보았지만 모두 공백 문자열입니다.

이것은 나에게 완전한 신비이며, 누군가 건설적인 메모가 있다면 크게 감사 할 것입니다. 스레드 및 서버 코드는 다음과 같습니다.

server.cpp

#include "myserver.h" 

MyServer::MyServer(QObject *parent) : 
    QTcpServer(parent) 
{ 

} 


void MyServer::StartServer() 
{ 
    if(!this->listen(QHostAddress::Any,1234)) 
    { 
     qDebug() << "Could not start server"; 
    } 
    else 
    { 
     qDebug() << "Listening..."; 
    } 
} 

void MyServer::incomingConnection(int socketDescriptor) 
{ 
    qDebug() << socketDescriptor << " Connecting..."; 
    MyThread *thread = new MyThread(socketDescriptor,this); 
    connect(thread, SIGNAL(finished()),thread, SLOT(deleteLater())); 
    thread->start(); 
} 

thread.cpp 사용하는 Qt는 버전

#include "mythread.h" 

MyThread::MyThread(int ID, QObject *parent) : 
    QThread(parent) 
{   this->socketDescriptor = ID; 
} 

void MyThread::run() 
{ 
    qDebug() << socket->errorString(); 
    //thread starts here 
    qDebug() << socketDescriptor << " Starting thread"; 
     socket = new QTcpSocket(); 
    if(!socket->setSocketDescriptor(this->socketDescriptor)) 
    { 
     emit error(socket->error()); 
     return; 
    } 

    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection); 
         connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()),Qt::DirectConnection); 

    qDebug() << socketDescriptor << " Client Connected"; 

    exec(); 
} 

void MyThread::readyRead() 
{ 
    QByteArray Data = socket->readAll(); 

    qDebug() << socketDescriptor << " Data in: " << Data; 

    socket->write(Data); 
} 

void MyThread::disconnected() 
{ 
    qDebug() << socketDescriptor << " Disconnected"; 

    socket->deleteLater(); 
    exit(0); 
} 
+0

incomingConnection - Qt 5 당신이'server.h'에서'Q_OBJECT' 매크로가 있습니까 : 다음 링크에서보세요? – Nejat

+0

네, 가지고 있습니다. – MrPickles

답변

1

? Qt 5에서 함수 의 incomingConnection 매개 변수는 qintptr이고 이 아닙니다.

Qt 5 - Multithreaded server tutorial

+0

와우, 완전히 문제가 해결되었습니다! 유감스럽게도, 매개 변수를 qintptr로 변경하면 현재 충돌이 발생합니다. Thread 생성자에 전달 된 매개 변수를 qintptr로 변경해야합니까? – MrPickles

+0

예. 대답에 게시 된 두 번째 링크를 방문하십시오. – Dodu

관련 문제