【问题标题】:QUdpSocket loopback datagramQUdpSocket 环回数据报
【发布时间】:2017-09-26 12:45:03
【问题描述】:

我正在使用 Qt 5.9,并且正在使用双向(发送和接收)QUdpSocket。 如何避免收到刚刚在同一个套接字上发送的相同消息?

这里是sn-p的代码

//  Socket init
this->UdpSocket->bind( QHostAddress::Any, ARTNET_PROTOCOL_PORT );

connect( this->UdpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()), Qt::UniqueConnection );

[...]

void ArtNetManager::readPendingDatagrams()
{
    QNetworkDatagram networkDatagram;

    qDebug("Udp datagram received");

    while( this->UdpSocket->hasPendingDatagrams() )
    {
        networkDatagram = this->UdpSocket->receiveDatagram();

        qDebug("Received datagram from IP address: %s", networkDatagram.senderAddress().toString().toLatin1().data() );

        this->receiveDatagram( networkDatagram.data() );
    }
}

void ArtNetManager::sendDatagram()
{
    QByteArray ArtNet_RawMsg;

    ArtNet_RawMsg.append( "Test program" );

    //  Writes data on the UDP socket
    qint64 sentBytes = this->UdpSocket->writeDatagram( ArtNet_RawMsg, QHostAddress::Broadcast, ARTNET_PROTOCOL_PORT );

    if( sentBytes == -1 )
    {
        qDebug("Cannot send data on UPD socket. Error: %d", this->UdpSocket->error() );
    }
    else if( sentBytes != ArtNet_RawMsg.size() )
    {
        qDebug("Wrong number of bytes sent. Bytes sent on socket: %d, tx buffer length: %d", sentBytes, ArtNet_RawMsg.size());
    }
}

【问题讨论】:

    标签: c++ qt sockets udp qt5


    【解决方案1】:

    您收到的消息是由 ArtNet 行为引起的。 UDP 协议通常不反映传出的流量。其他一些 ArtNet 设备正在这样做。

    您可以通过保留一些最近发送的消息的列表并查找它们来忽略这些:

    class ArtNetManager : public QObject {
      Q_OBJECT
      int const m_sentFifoLength = 32;
      QList<QByteArray> m_sentFifo;
      ...
    }
    
    void ArtNetManager::sendDatagram() {
      sendDatagram({"Test program"});
    }
    
    void ArtNetManager::sendDatagram(const QByteArray & msg) {
      if (m_sent_fifo.size() >= m_sentFifoLength))
        fifo.removeLast();
      m_sentFifo.prepend(msg);
      auto bytes = m_udpSocket->writeDatagram(msg, QHostAddress::Broadcast, ARTNET_PROTOCOL_PORT);
      if (bytes != msg.size())
        qWarning() << "can't send datagram" << msg.toHex();
    }
    
    void ArtNetManager::readPendingDatagrams() {
      while (m_udpSocket->hasPendingDatagrams()) {
        auto datagram = m_udpSocket->receiveDatagram();
        qDebug() << "received datagram from" << datagram.senderAddress().toString();
        receiveDatagram(datagram.data());
      }
    }
    
    void ArtNetManager::receiveDatagram(const QByteArray & msg) {
      auto it = std::find(m_sentFifo.begin(), m_sentFifo.end(), msg);
      if (it != m_sentFifo.end()) {
        m_sentFifo.erase(it);
        return;
      }
      ...
    }
    

    【讨论】:

    • 不,不是这个原因。即使我从物理上断开将 PC 连接到 ArtNet 主机设备的以太网电缆,我的程序在发送消息后仍会立即收到消息。我已将 qDebug 调用放入“readPendingDatagrams”函数中,只是为了检查哪个是消息的发送者:IP 地址与我在我的电脑上设置的相同,所以这确认双向 QUdpSocket 接收到它发送的消息跨度>
    • 您的网络设置搞砸了。这不是正常行为。那是什么平台(非常准确):?
    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多