diff options
Diffstat (limited to 'examples/network/network-chat/peermanager.cpp')
-rw-r--r-- | examples/network/network-chat/peermanager.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/examples/network/network-chat/peermanager.cpp b/examples/network/network-chat/peermanager.cpp index da4210d85b..a70ed7da73 100644 --- a/examples/network/network-chat/peermanager.cpp +++ b/examples/network/network-chat/peermanager.cpp @@ -7,6 +7,7 @@ #include "peermanager.h" #include <QNetworkInterface> +#include <QUuid> static const qint32 BroadcastInterval = 2000; static const unsigned broadcastPort = 45000; @@ -27,6 +28,11 @@ PeerManager::PeerManager(Client *client) if (username.isEmpty()) username = "unknown"; + // We generate a unique per-process identifier so we can avoid multiple + // connections to/from the same remote peer as well as ignore our own + // broadcasts. + localUniqueId = QUuid::createUuid().toByteArray(); + updateAddresses(); broadcastSocket.bind(QHostAddress::Any, broadcastPort, QUdpSocket::ShareAddress @@ -49,6 +55,11 @@ QString PeerManager::userName() const return username; } +QByteArray PeerManager::uniqueId() const +{ + return localUniqueId; +} + void PeerManager::startBroadcasting() { broadcastTimer.start(); @@ -65,7 +76,7 @@ void PeerManager::sendBroadcastDatagram() { QCborStreamWriter writer(&datagram); writer.startArray(2); - writer.append(username); + writer.append(localUniqueId); writer.append(serverPort); writer.endArray(); } @@ -92,6 +103,7 @@ void PeerManager::readBroadcastDatagram() continue; int senderServerPort; + QByteArray peerUniqueId; { // decode the datagram QCborStreamReader reader(datagram); @@ -101,10 +113,12 @@ void PeerManager::readBroadcastDatagram() continue; reader.enterContainer(); - if (reader.lastError() != QCborError::NoError || !reader.isString()) + if (reader.lastError() != QCborError::NoError || !reader.isByteArray()) continue; - while (reader.readString().status == QCborStreamReader::Ok) { - // we don't actually need the username right now + auto r = reader.readByteArray(); + while (r.status == QCborStreamReader::Ok) { + peerUniqueId = r.data; + r = reader.readByteArray(); } if (reader.lastError() != QCborError::NoError || !reader.isUnsignedInteger()) @@ -112,10 +126,10 @@ void PeerManager::readBroadcastDatagram() senderServerPort = reader.toInteger(); } - if (isLocalHostAddress(senderIp) && senderServerPort == serverPort) + if (peerUniqueId == localUniqueId) continue; - if (!client->hasConnection(senderIp)) { + if (!client->hasConnection(peerUniqueId)) { Connection *connection = new Connection(this); emit newConnection(connection); connection->connectToHost(senderIp, senderServerPort); |