2017-09-26 46 views
0

我正在使用Qt 5.9,我正在使用雙向(發送和接收)QUdpSocket。 我怎樣才能避免接收同一個消息剛剛發送到同一個套接字?QUdpSocket環回數據報

下面的代碼

// 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()); 
    } 
} 

回答

0

的片段,您收到的消息是,由於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; 
    } 
    ... 
} 
+0

不,它不是這樣做的原因。即使我將連接PC與ArtNet主機設備的以太網電纜斷開連接,我的程序在發送它們之後仍會立即收到消息。我已經將qDebug調用放入'readPendingDatagrams'函數中,以檢查消息的發送者:IP地址與我在PC上設置的IP地址相同,因此這確認雙向QUdpSocket接收它發送的消息。 – Andre

+0

Your網絡設置搞砸了。這不是正常的行爲。那是什麼平臺(非常精確):? –