QT学习_http和udp

HTTP

需要用到的类:
QNetworkRequest
QNetworkAccessManager
QNetworkReply

{
 QString x = "";
    QString url = QString("https://<ip address>/<command>/key1=value&key2=value");
    
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    QNetworkAccessManager naManager(this);
    QNetworkReply* reply = naManager.get(request);
    connect(reply, &QNetworkReply::finished, this, [this,reply](){
        if(reply->error() != QNetworkReply::NoError){
        //reply在回应中删去
            reply->deleteLater();
            emit sigHttpRequestFinished();
            return;
        }
        qDebug()<<reply->readAll();
        emit sigHttpRequestFinished();
        reply->deleteLater();
    });
    
    QEventLoop loop;
    connect(this,SIGNAL(sigHttpRequestFinished()),&loop,SLOT(quit()));
    loop.exec();
}

自定义reply超时时间

void replyTimeout(QNetworkReply* reply, int timeout)
{
    QTimer::singleShot(timeout,this,[this](){
       if(reply) reply->close();
    });
}

UDP组播

先绑定端口,

udpSocket->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::SareAddress)

然后使用函数加入、退出组播

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress)

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress)

发送和接受组播数据报

  • 发送:
    writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)
  • 接收:
    • qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr)
    • QNetworkDatagram receiveDatagram(qint64 maxSize = -1)
      获取QNetworkDatagram 的senderAddress和senderPort和data
void PepperlFuchsIPConfigDlg::SSDPsearch()
{
    //SSDP寻找设备
    QString searchRequest = "M-SEARCH * HTTP/1.1\r\n"
                             "H0ST: 239.255.255.250:1900\r\n"
                             "ST: urn:pepperl-fuchs-com:device:R2000:1\r\n"
                             "MAN: \"ssdp:discover\"\r\n"
                             "MX: 1\r\n";
    //使用UDP组播
    quint16 port = 1900;
    QString hostAddress = "239.255.255.250";
    QHostAddress groupAddress(hostAddress);
    _udpSocket = new QUdpSocket(this);
    _udpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);

    //绑定ip,加入组播,发送消息
    _udpSocket->bind(QHostAddress::AnyIPv4,port,QUdpSocket::ShareAddress);
    _udpSocket->joinMulticastGroup(groupAddress);
    _udpSocket->writeDatagram(searchRequest.toUtf8(),groupAddress,port);

    //获取udp消息
    connect(_udpSocket,&QUdpSocket::readyRead,this,[this](){
        QNetworkDatagram datagram = _udpSocket->receiveDatagram();
        qDebug()<<"peer address:"<<datagram.senderAddress();
        qDebug()<<"peer port:"<<datagram.senderPort();
        qDebug()<<"peer data:"<<datagram.data();
    });

}

void PepperlFuchsIPConfigDlg::SSDPsearchOff()
{
    //退出组播,断开绑定
    _udpSocket->leaveMulticastGroup(_groupAddress);
    _udpSocket->abort();
    _udpSocket->deleteLater();
    _udpSocket = Q_NULLPTR;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值