Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QNetworkReply未获取任何标题_Qt_Qnetworkaccessmanager_Qtnetwork_Qnetworkrequest_Qnetworkreply - Fatal编程技术网

Qt QNetworkReply未获取任何标题

Qt QNetworkReply未获取任何标题,qt,qnetworkaccessmanager,qtnetwork,qnetworkrequest,qnetworkreply,Qt,Qnetworkaccessmanager,Qtnetwork,Qnetworkrequest,Qnetworkreply,我正在编写一个应用程序,以获取我必须在其上发送PUT请求的设备信息,如下所示: connect(&netman,SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply*))); QByteArray data("0ABF0A25"); QNetworkRequest req(QUrl("http://192.168.1.100:8088")); req.setHeader(QNetworkReq

我正在编写一个应用程序,以获取我必须在其上发送PUT请求的设备信息,如下所示:

connect(&netman,SIGNAL(finished(QNetworkReply*)), this,
    SLOT(reqFinished(QNetworkReply*)));
QByteArray data("0ABF0A25");
QNetworkRequest req(QUrl("http://192.168.1.100:8088"));
req.setHeader(QNetworkRequest::ContentLengthHeader,data.length());
QNetworkReply rep =netman.put(req,data);
connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this,
    SLOT(errorSlot(QNetworkReply::NetworkError))):
我知道设备正在工作,因为它启动了它的进程,如果我在我的电脑和设备之间放置一个嗅探器,我就会看到响应

485454502F312E302033030204F4B200D0A 或纯文本“HTTP/1.0 200正常\r\n”

但是当执行
slotRequestFinished(QNetworkReply*rep)
插槽时,我没有得到任何数据、头和属性,错误代码2(连接关闭)

如果我执行:

QVariant attr = rep->attribute(QNetworkRequest::HttpStatusCodeAttribute);
我得到了一个无效的变量对象,与标题相同

如何获取响应的原始数据包?这对这个案子来说很方便


我还注意到在我的嗅探器上,连接重复了三次,并且只为一个put请求发送了请求;这可能是库的问题吗?

我必须对QNetworkAccessManager类进行子类化,以使用QTCpSocket实现我的自定义put方法。为了获得适当的响应,我无法创建QNetworkReply并为属性设置值,因此应用了一些变通方法:p 当然QTcpSocket的readyRead信号连接到该类的socketRead插槽,错误信号也连接到其他插槽

h


你是说你得到了QMetaType::Unknown?另外,您使用的是哪个qt版本?顺便说一句,你能提供一个完整的例子吗?查看sscce.org了解详细信息。是的,这是我得到的QVariant,我正在使用Qt5.1.1。。。代码没有太多内容,除了get请求工作正常,但是put请求的行为与我描述的一样,我猜设备存在问题,我对此无能为力,如果我可以使用QTcpSocket获得原始数据,那就更好了。您是否检查了错误信号以防万一,或者检查了一般的错误(字符串)?另外,请提供一些代码和硬件参考等。否则,帮助会有点困难。是的,来自QNetworkReply的错误信号和错误字符串也表示连接已关闭(错误代码2)。我正在VirtualBox上开发Ubuntu12.04,我将编辑问题以添加基本代码tnxs!来自初始代码块的QNetworkReply应为QNetworkRequest?您是否尝试使用正确的URL,即?
#include <QNetworkAccessManager>
#include <QTcpSocket>

class MyNetworkAccessManager : public QNetworkAccessManager
{
    Q_OBJECT
public:
    explicit MyNetworkAccessManager(QObject *parent = 0);   
    virtual void myPut(const QNetworkRequest &request, const QByteArray &data);

signals:
    void dataReceived(QNetworkReply*,const QByteArray data);

public slots:
    void socketRead();

private:
    QTcpSocket socket;
};
void MyNetworkAccessManager::MyNetworkAccessManager(const QNetworkRequest &request, const QByteArray &data)
{
    QUrl url = request.url();
    QString host = url.host();
    int len = data.length();
    int port = url.port();
    QString path = url.path();

    QByteArray reqba = QString("PUT %1 HTTP/1.1\r\n\
Content-Type: application/xml\r\n\
Content-Length: %2\r\n\
User-Agent: MyFooAgent/0.1\r\n\
Host: %3:%4\r\n\r\n").arg(path).arg(len).arg(host).arg(port).toUtf8();


    socket.connectToHost(host, port, QIODevice::ReadWrite);
    socket.waitForConnected();  
    socket.write(reqba + data);

}

void MyNetworkAccessManager::socketRead()
{
    QByteArray data = socket.readAll();
    socket.close();
    int code = 0;
    if(data.contains("200 OK"))
        code = 200;
    else if(data.contains("404 Not Found"))
        code = 404;
    //else if ..... foo
    emit dataReceived(data,code);
}