2016-10-20 3 views
0

QTcpServer 및 간단한 클라이언트가 QNetworkAccessManager 인 단순한 서버가 있습니다. QNetworkAccessManager의 모든 QNetworkAccessManager 및 QTcpServer를 사용하는 경우

  • 괜찮습니다하지만 QNetworkAccessManager를 통해 QTcpServer에서 데이터를 읽을 수 없습니다를 통해 내가 어떤 사이트에서 데이터를 요청하면

    1. 내가 말려 있거나 브라우저 모두를 통해 서버로부터 데이터를 요청하면 것은
    2. 괜찮습니다. 모든 요청이 재설정됩니다. QNetworkAccessManager (클라이언트)는 서버로부터 데이터를 수신 한 직후 RST (재설정 연결)를 보냈습니다. 그리고 클라이언트 코드에서 "Connection closed"(RemoteHostClosedError)
    3. 또한 DownloadManager 예제의 QNetworkAccessManager와 FortuneServer 예제의 QTcpServer를 다양한 조합으로 사용했지만 결과는 동일했습니다.

    테스트 Qt는 버전 :

    • 맥 Qt는 5.7
    • 리눅스 Qt는 5.7
    • 리눅스 Qt는 5.6.2
    • 리눅스 Qt는 5.5.1

    와이어 샤크의 스크린 샷 : qt-wireshark.png
    상단부 (레드 린 포함) ES) QNetworkAccessManager의 결과이며, 성공 결과에 최신 패킷 QTcpServer

    에서 데이터를 얻을 컬 시도이다

    또한이 오류 재현하는 간단한 예입니다 testNetwork.zip

    는 그리고 여기에 클라이언트에 대한 샘플 코드입니다 :

    void test(quint16 port) 
    { 
        QNetworkAccessManager *manager = new QNetworkAccessManager(); 
    
        QNetworkRequest request; 
        request.setUrl(QUrl(QString("http://127.0.0.1:%1/").arg(port))); 
    
        manager->connect(manager, &QNetworkAccessManager::finished, 
            [](QNetworkReply *reply) { 
         qDebug() << QString("Finished. %1. %2").arg(reply->errorString()).arg(reply->error()); 
         qDebug() << "readed: " << reply->readAll(); 
        }); 
    
        QNetworkReply *reply = manager->get(request); 
    
        reply->connect(reply, &QNetworkReply::readyRead, [reply]() { 
         qDebug() << QString("readyRead: '%1'").arg(QString(reply->readAll())); 
        }); 
    } 
    

    및 서버에 대한

    :
    QTcpSocket socket; 
    ... 
    if(socket.waitForReadyRead(5000)) 
    { 
        QByteArray request; 
        request += socket.readAll(); 
    
        QByteArray responce("HELLO, WORLD! HELLO, WORLD! HELLO, WORLD! HELLO, WORLD!"); 
    
        socket.write(responce); 
        if(!socket.waitForBytesWritten()) 
        { 
         qWarning() << QString("Error occurred in waitForBytesWritten() method of the tcp socket. %1 (%2)") 
             .arg(socket.errorString()) 
             .arg(socket.error()); 
        } 
    } 
    else 
    { 
        qWarning() << QString("Error occurred in read method of the tcp socket. %1 (%2)") 
            .arg(socket.errorString()) 
            .arg(socket.error()); 
    } 
    

    이 또한 내가 qt.io에 버그 리포트를 작성 (QTBUG-56631)

  • 답변

    0

    클라이언트가 HTTP 요청을하고 있지만 서버가 http 서버가 아니며 올바른 HTTP 요청을 보내지 않았습니다.

    클라이언트는 웹 서버를 가리킬 때 http 서버입니다.

    QByteArray responce("HELLO, WORLD! HELLO, WORLD! HELLO, WORLD! HELLO, WORLD!"); 
    

    은 유효한 HTTP 응답이 아닙니다.

    +0

    네, 맞습니다! 당신의 응답을 주셔서 감사합니다! – Ildar

    +0

    그리고 응답을 위해 [Qt 포럼] (https://forum.qt.io)에서 raven-worx에게 감사드립니다. – Ildar

    +0

    응답 : 적어도 응답은 다음과 같아야합니다. 참고 각 행 \ r에 \ n을 빈 행이 header- 및 컨텐츠 섹션 콘텐츠 길이 헤더를 분리 끝나야 콘텐츠 HTTP/1의 바이트 수이다.1 200 OK 날짜 : 2016년 (목) 그리니치 표준시 12시 28분 53초 서버 (20) OCT를 MyServer를 1.0.0 콘텐츠 길이 : 3 콘텐츠 유형 : 텍스트/일반 연결 : 휴무 XXX – Ildar

    관련 문제