【问题标题】:Receive the data without own sent by QUdpSocket接收QUdpSocket发送的没有自己的数据
【发布时间】:2016-01-07 11:58:59
【问题描述】:

我正在使用 Qt 5.4(在 Windows 10 64 位上)通过 udp 测试 P2P 通信。

在 Windows 到 Windows 上,此代码可以从另一台设备获取消息(“SendFromHost”)。但在 Android 到 Windows 上,这段代码得到了自己发送的消息(“SendFromGuest”)并完成了程序。

请告诉我如何在没有自己发送的情况下获取消息。

void Network::start()
{
    findLanSocket = new QUdpSocket(this);
    connect(findLanSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
                this, SLOT(onUdpStateChanged(QAbstractSocket::SocketState)));
    findLanSocket->bind(findPort, QUdpSocket::ShareAddress);

    QByteArray datagram = "SendFromGuest";
    findLanSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, findPort);
}

void Network::onUdpStateChanged(QAbstractSocket::SocketState s)
{
    if (s == QAbstractSocket::BoundState) {
        connect(findLanSocket, SIGNAL(readyRead()), this, SLOT(onReadyUdpRead()));
    }
}

void Network::onReadyUdpRead()
{
    QByteArray datagram; QHostAddress haddr;
    datagram.resize(findLanSocket->pendingDatagramSize());
    findLanSocket->readDatagram(datagram.data(), datagram.size(), &haddr);

    QString rev = QString::fromUtf8(datagram);
    if (rev == "SendFromHost"){
        result = haddr.toString();
        qDebug() << result;
        success();
        return;
    }
}

【问题讨论】:

    标签: android qt udp


    【解决方案1】:

    广播的 UDP 数据报也可以被它的发送者接收,这是预期的行为。例如,请参阅How to ignore your own broadcast udp packets

    【讨论】:

    • 你知道Qt 5的选项参数吗?
    • 我不认为 Qt 提供了一个选项(除了做多播而不是广播)。对于广播,您必须使用我链接到的答案中的一个技巧。
    • 注意:对我来说,我不会使用 IP 地址,而是在数据报中插入一个唯一的(内部生成的)ID,以便我能够识别我自己的消息(因为它们包含我的 ID)并丢弃它们。
    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多