2016-01-07 68 views
0

我正在測試與Qt 5.4 udp的P2P通信(在Windows 10 64位)。接收沒有自己的數據發送由QUdpSocket

在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; 
    } 
} 

回答

0

廣播UDP數據報也可以由其發送者接收,這是預期的行爲。例如參見How to ignore your own broadcast udp packets

+0

你知道Qt 5的選項參數嗎? – Tank2005

+0

我不認爲Qt提供了一個選項(除了做廣播而不是廣播)。對於廣播,您必須使用我已鏈接的答案中的一個技巧。 – Ilya

+0

注意:對於我而言,我不會使用IP地址,而是在數據報中插入一個唯一的(內部生成的)ID,以便我能夠識別自己的消息(因爲它們包含我的ID)並丟棄它們。 – Ilya

相關問題