⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 peermanager.cpp

📁 QT 开发环境里面一个很重要的文件
💻 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 + -