📄 peermanager.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the example classes of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <QtNetwork>#include "client.h"#include "connection.h"#include "peermanager.h"static const qint32 BroadcastInterval = 2000;static const unsigned broadcastPort = 45000;PeerManager::PeerManager(Client *client) : QObject(client){ this->client = client; QStringList envVariables; envVariables << "USERNAME.*" << "USER.*" << "USERDOMAIN.*" << "HOSTNAME.*" << "DOMAINNAME.*"; QStringList environment = QProcess::systemEnvironment(); foreach (QString string, envVariables) { int index = environment.indexOf(QRegExp(string)); if (index != -1) { QStringList stringList = environment.at(index).split("="); if (stringList.size() == 2) { username = stringList.at(1).toUtf8(); break; } } } if (username.isEmpty()) username = "unknown"; updateAddresses(); serverPort = 0; broadcastSocket.bind(QHostAddress::Any, broadcastPort, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); connect(&broadcastSocket, SIGNAL(readyRead()), this, SLOT(readBroadcastDatagram())); broadcastTimer.setInterval(BroadcastInterval); connect(&broadcastTimer, SIGNAL(timeout()), this, SLOT(sendBroadcastDatagram()));}void PeerManager::setServerPort(int port){ serverPort = port;}QByteArray PeerManager::userName() const{ return username;}void PeerManager::startBroadcasting(){ broadcastTimer.start();}bool PeerManager::isLocalHostAddress(const QHostAddress &address){ foreach (QHostAddress localAddress, ipAddresses) { if (address == localAddress) return true; } return false;}void PeerManager::sendBroadcastDatagram(){ QByteArray datagram(username); datagram.append('@'); datagram.append(QByteArray::number(serverPort)); bool validBroadcastAddresses = true; foreach (QHostAddress address, broadcastAddresses) { if (broadcastSocket.writeDatagram(datagram, address, broadcastPort) == -1) validBroadcastAddresses = false; } if (!validBroadcastAddresses) updateAddresses();}void PeerManager::readBroadcastDatagram(){ while (broadcastSocket.hasPendingDatagrams()) { QHostAddress senderIp; quint16 senderPort; QByteArray datagram; datagram.resize(broadcastSocket.pendingDatagramSize()); if (broadcastSocket.readDatagram(datagram.data(), datagram.size(), &senderIp, &senderPort) == -1) continue; QList<QByteArray> list = datagram.split('@'); if (list.size() != 2) continue; int senderServerPort = list.at(1).toInt(); if (isLocalHostAddress(senderIp) && senderServerPort == serverPort) continue; if (!client->hasConnection(senderIp)) { Connection *connection = new Connection(this); emit newConnection(connection); connection->connectToHost(senderIp, senderServerPort); } }}void PeerManager::updateAddresses(){ broadcastAddresses.clear(); ipAddresses.clear(); foreach (QNetworkInterface interface, QNetworkInterface::allInterfaces()) { foreach (QNetworkAddressEntry entry, interface.addressEntries()) { QHostAddress broadcastAddress = entry.broadcast(); if (broadcastAddress != QHostAddress::Null) { broadcastAddresses << broadcastAddress; ipAddresses << entry.ip(); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -