diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2014-09-24 17:31:33 +0300 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2016-07-27 06:37:24 +0000 |
commit | 75a9bd2a4f637fb8e8e3dc4609a7045547119e80 (patch) | |
tree | 73b8a0a950eb87a7407edada3ea6547f08baf328 /examples/network | |
parent | c5a4b093d051680bf7f34bb5acff16eea9d4979f (diff) |
Introduce SCTP sockets support
Add protocol-specific code and the QSctpServer, QSctpSocket classes.
Change-Id: Ie9a1d87bd1fda866a2405043d1c15c12ded5a96e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'examples/network')
24 files changed, 1632 insertions, 0 deletions
diff --git a/examples/network/multistreamclient/chatconsumer.cpp b/examples/network/multistreamclient/chatconsumer.cpp new file mode 100644 index 0000000000..65840accae --- /dev/null +++ b/examples/network/multistreamclient/chatconsumer.cpp @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "chatconsumer.h" +#include <QWidget> +#include <QTextEdit> +#include <QLineEdit> +#include <QVBoxLayout> +#include <QString> + +ChatConsumer::ChatConsumer(QObject *parent) + : Consumer(parent) +{ + frameWidget = new QWidget; + frameWidget->setFocusPolicy(Qt::TabFocus); + + textEdit = new QTextEdit; + textEdit->setFocusPolicy(Qt::NoFocus); + textEdit->setReadOnly(true); + + lineEdit = new QLineEdit; + frameWidget->setFocusProxy(lineEdit); + + connect(lineEdit, &QLineEdit::returnPressed, this, &ChatConsumer::returnPressed); + + QVBoxLayout *layout = new QVBoxLayout(frameWidget); + layout->setContentsMargins( 0, 0, 0, 0); + layout->addWidget(textEdit); + layout->addWidget(lineEdit); +} + +QWidget *ChatConsumer::widget() +{ + return frameWidget; +} + +void ChatConsumer::readDatagram(const QByteArray &ba) +{ + textEdit->append(QString::fromUtf8(ba)); +} + +void ChatConsumer::returnPressed() +{ + emit writeDatagram(lineEdit->text().toUtf8()); + lineEdit->clear(); +} diff --git a/examples/network/multistreamclient/chatconsumer.h b/examples/network/multistreamclient/chatconsumer.h new file mode 100644 index 0000000000..cac846757f --- /dev/null +++ b/examples/network/multistreamclient/chatconsumer.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CHATCONSUMER_H +#define CHATCONSUMER_H + +#include "consumer.h" + +QT_BEGIN_NAMESPACE +class QTextEdit; +class QLineEdit; +QT_END_NAMESPACE + +class ChatConsumer : public Consumer +{ + Q_OBJECT +public: + explicit ChatConsumer(QObject *parent = nullptr); + + QWidget *widget() Q_DECL_OVERRIDE; + void readDatagram(const QByteArray &ba) Q_DECL_OVERRIDE; + +private slots: + void returnPressed(); + +private: + QWidget *frameWidget; + QTextEdit *textEdit; + QLineEdit *lineEdit; +}; + +#endif diff --git a/examples/network/multistreamclient/client.cpp b/examples/network/multistreamclient/client.cpp new file mode 100644 index 0000000000..fbe138162e --- /dev/null +++ b/examples/network/multistreamclient/client.cpp @@ -0,0 +1,207 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtWidgets> +#include <QtNetwork> + +#include "client.h" +#include "movieconsumer.h" +#include "timeconsumer.h" +#include "chatconsumer.h" + +Client::Client(QWidget *parent) + : QDialog(parent) + , consumers(NumberOfChannels) +{ + setWindowTitle(tr("Multi-stream Client")); + + sctpSocket = new QSctpSocket(this); + + QLabel *hostLabel = new QLabel(tr("&Server name:")); + QLabel *portLabel = new QLabel(tr("S&erver port:")); + + hostCombo = new QComboBox; + hostCombo->setEditable(true); + // find out name of this machine + QString name = QHostInfo::localHostName(); + if (!name.isEmpty()) { + hostCombo->addItem(name); + QString domain = QHostInfo::localDomainName(); + if (!domain.isEmpty()) + hostCombo->addItem(name + QChar('.') + domain); + } + if (name != QString("localhost")) + hostCombo->addItem(QString("localhost")); + // find out IP addresses of this machine + QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); + // add non-localhost addresses + for (int i = 0; i < ipAddressesList.size(); ++i) { + if (!ipAddressesList.at(i).isLoopback()) + hostCombo->addItem(ipAddressesList.at(i).toString()); + } + // add localhost addresses + for (int i = 0; i < ipAddressesList.size(); ++i) { + if (ipAddressesList.at(i).isLoopback()) + hostCombo->addItem(ipAddressesList.at(i).toString()); + } + + portLineEdit = new QLineEdit; + portLineEdit->setValidator(new QIntValidator(1, 65535, this)); + + hostLabel->setBuddy(hostCombo); + portLabel->setBuddy(portLineEdit); + + connectButton = new QPushButton(tr("Connect")); + connectButton->setDefault(true); + connectButton->setEnabled(false); + + QPushButton *quitButton = new QPushButton(tr("Quit")); + quitButton->setAutoDefault(false); + + QDialogButtonBox *buttonBox = new QDialogButtonBox; + buttonBox->addButton(connectButton, QDialogButtonBox::ActionRole); + buttonBox->addButton(quitButton, QDialogButtonBox::AcceptRole); + + QLabel *movieLabel = new QLabel(tr("Movie stream:")); + consumers[Movie] = new MovieConsumer(this); + QLabel *timeLabel = new QLabel(tr("Time stream:")); + consumers[Time] = new TimeConsumer(this); + QLabel *chatLabel = new QLabel(tr("&Chat:")); + consumers[Chat] = new ChatConsumer(this); + chatLabel->setBuddy(consumers[Chat]->widget()); + + connect(hostCombo, &QComboBox::editTextChanged, this, &Client::enableConnectButton); + connect(portLineEdit, &QLineEdit::textChanged, this, &Client::enableConnectButton); + connect(connectButton, &QPushButton::clicked, this, &Client::requestConnect); + connect(buttonBox, &QDialogButtonBox::accepted, this, &Client::accept); + connect(sctpSocket, &QSctpSocket::connected, this, &Client::connected); + connect(sctpSocket, &QSctpSocket::disconnected, this, &Client::disconnected); + connect(sctpSocket, &QSctpSocket::channelReadyRead, this, &Client::readDatagram); + connect(sctpSocket, SIGNAL(error(QAbstractSocket::SocketError)), + this, SLOT(displayError(QAbstractSocket::SocketError))); + connect(consumers[Time], &Consumer::writeDatagram, this, &Client::writeDatagram); + connect(consumers[Chat], &Consumer::writeDatagram, this, &Client::writeDatagram); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(hostLabel, 0, 0); + mainLayout->addWidget(hostCombo, 0, 1); + mainLayout->addWidget(portLabel, 1, 0); + mainLayout->addWidget(portLineEdit, 1, 1); + mainLayout->addWidget(buttonBox, 2, 0, 1, 2); + mainLayout->addWidget(movieLabel, 3, 0); + mainLayout->addWidget(timeLabel, 3, 1); + mainLayout->addWidget(consumers[Movie]->widget(), 4, 0); + mainLayout->addWidget(consumers[Time]->widget(), 4, 1); + mainLayout->addWidget(chatLabel, 5, 0); + mainLayout->addWidget(consumers[Chat]->widget(), 6, 0, 1, 2); + setLayout(mainLayout); + + portLineEdit->setFocus(); +} + +Client::~Client() +{ + delete sctpSocket; +} + +void Client::connected() +{ + consumers[Chat]->widget()->setFocus(); +} + +void Client::disconnected() +{ + for (Consumer *consumer : consumers) + consumer->serverDisconnected(); + + sctpSocket->close(); +} + +void Client::requestConnect() +{ + connectButton->setEnabled(false); + sctpSocket->abort(); + sctpSocket->connectToHost(hostCombo->currentText(), + portLineEdit->text().toInt()); +} + +void Client::readDatagram(int channel) +{ + sctpSocket->setCurrentReadChannel(channel); + consumers[channel]->readDatagram(sctpSocket->readDatagram().data()); +} + +void Client::displayError(QAbstractSocket::SocketError socketError) +{ + switch (socketError) { + case QAbstractSocket::HostNotFoundError: + QMessageBox::information(this, tr("Multi-stream Client"), + tr("The host was not found. Please check the " + "host name and port settings.")); + break; + case QAbstractSocket::ConnectionRefusedError: + QMessageBox::information(this, tr("Multi-stream Client"), + tr("The connection was refused by the peer. " + "Make sure the multi-stream server is running, " + "and check that the host name and port " + "settings are correct.")); + break; + default: + QMessageBox::information(this, tr("Multi-stream Client"), + tr("The following error occurred: %1.") + .arg(sctpSocket->errorString())); + } + + connectButton->setEnabled(true); +} + +void Client::enableConnectButton() +{ + connectButton->setEnabled(!hostCombo->currentText().isEmpty() && + !portLineEdit->text().isEmpty()); +} + +void Client::writeDatagram(const QByteArray &ba) +{ + if (sctpSocket->isValid() && sctpSocket->state() == QAbstractSocket::ConnectedState) { + sctpSocket->setCurrentWriteChannel(consumers.indexOf(static_cast<Consumer *>(sender()))); + sctpSocket->writeDatagram(ba); + } +} diff --git a/examples/network/multistreamclient/client.h b/examples/network/multistreamclient/client.h new file mode 100644 index 0000000000..6ec804e9be --- /dev/null +++ b/examples/network/multistreamclient/client.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CLIENT_H +#define CLIENT_H + +#include <QDialog> +#include <QVector> +#include <QSctpSocket> + +QT_BEGIN_NAMESPACE +class QComboBox; +class QLineEdit; +class QPushButton; +class QByteArray; +QT_END_NAMESPACE + +class Consumer; + +class Client : public QDialog +{ + Q_OBJECT +public: + explicit Client(QWidget *parent = nullptr); + virtual ~Client(); + +private slots: + void connected(); + void disconnected(); + void requestConnect(); + void readDatagram(int channel); + void displayError(QAbstractSocket::SocketError socketError); + void enableConnectButton(); + void writeDatagram(const QByteArray &ba); + +private: + enum ChannelNumber { + Movie = 0, + Time = 1, + Chat = 2, + + NumberOfChannels = 3 + }; + + QVector<Consumer *> consumers; + QSctpSocket *sctpSocket; + + QComboBox *hostCombo; + QLineEdit *portLineEdit; + QPushButton *connectButton; +}; + +#endif diff --git a/examples/network/multistreamclient/consumer.h b/examples/network/multistreamclient/consumer.h new file mode 100644 index 0000000000..0c7c1bbfb6 --- /dev/null +++ b/examples/network/multistreamclient/consumer.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CONSUMER_H +#define CONSUMER_H + +#include <QObject> +#include <QByteArray> + +QT_BEGIN_NAMESPACE +class QWidget; +QT_END_NAMESPACE + +class Consumer : public QObject +{ + Q_OBJECT +public: + explicit inline Consumer(QObject *parent = nullptr) : QObject(parent) { } + + virtual QWidget *widget() = 0; + virtual void readDatagram(const QByteArray &ba) = 0; + virtual void serverDisconnected() { } + +signals: + void writeDatagram(const QByteArray &ba); +}; + +#endif diff --git a/examples/network/multistreamclient/main.cpp b/examples/network/multistreamclient/main.cpp new file mode 100644 index 0000000000..c9e0c38d9a --- /dev/null +++ b/examples/network/multistreamclient/main.cpp @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QApplication> +#include "client.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + Client client; + + return (client.exec() == QDialog::Accepted) ? 0 : -1; +} diff --git a/examples/network/multistreamclient/movieconsumer.cpp b/examples/network/multistreamclient/movieconsumer.cpp new file mode 100644 index 0000000000..68c7b4a229 --- /dev/null +++ b/examples/network/multistreamclient/movieconsumer.cpp @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "movieconsumer.h" +#include <QLabel> +#include <QDataStream> +#include <QImage> +#include <QPixmap> + +MovieConsumer::MovieConsumer(QObject *parent) + : Consumer(parent) +{ + label = new QLabel; + label->setFrameStyle(QFrame::Box | QFrame::Raised); + label->setFixedSize(128 + label->frameWidth() * 2, + 64 + label->frameWidth() * 2); +} + +QWidget *MovieConsumer::widget() +{ + return label; +} + +void MovieConsumer::readDatagram(const QByteArray &ba) +{ + QDataStream ds(ba); + QImage image; + + ds >> image; + label->setPixmap(QPixmap::fromImage(image)); +} + +void MovieConsumer::serverDisconnected() +{ + label->setPixmap(QPixmap()); +} diff --git a/examples/network/multistreamclient/movieconsumer.h b/examples/network/multistreamclient/movieconsumer.h new file mode 100644 index 0000000000..0f4fd7af42 --- /dev/null +++ b/examples/network/multistreamclient/movieconsumer.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MOVIECONSUMER_H +#define MOVIECONSUMER_H + +#include "consumer.h" + +QT_BEGIN_NAMESPACE +class QLabel; +QT_END_NAMESPACE + +class MovieConsumer : public Consumer +{ + Q_OBJECT +public: + explicit MovieConsumer(QObject *parent = nullptr); + + QWidget *widget() Q_DECL_OVERRIDE; + void readDatagram(const QByteArray &ba) Q_DECL_OVERRIDE; + void serverDisconnected() Q_DECL_OVERRIDE; + +private: + QLabel *label; +}; + +#endif diff --git a/examples/network/multistreamclient/multistreamclient.pro b/examples/network/multistreamclient/multistreamclient.pro new file mode 100644 index 0000000000..ed887ab53e --- /dev/null +++ b/examples/network/multistreamclient/multistreamclient.pro @@ -0,0 +1,16 @@ +QT += network widgets + +HEADERS = client.h \ + consumer.h \ + movieconsumer.h \ + timeconsumer.h \ + chatconsumer.h +SOURCES = client.cpp \ + movieconsumer.cpp \ + timeconsumer.cpp \ + chatconsumer.cpp \ + main.cpp + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/network/multistreamclient +INSTALLS += target diff --git a/examples/network/multistreamclient/timeconsumer.cpp b/examples/network/multistreamclient/timeconsumer.cpp new file mode 100644 index 0000000000..3ad73a8712 --- /dev/null +++ b/examples/network/multistreamclient/timeconsumer.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "timeconsumer.h" +#include <QLCDNumber> +#include <QString> +#include <QDataStream> +#include <QTimer> + +TimeConsumer::TimeConsumer(QObject *parent) + : Consumer(parent) +{ + lcdNumber = new QLCDNumber(8); + + QTimer *timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, &TimeConsumer::timerTick); + timer->start(100); + + serverDisconnected(); +} + +QWidget *TimeConsumer::widget() +{ + return lcdNumber; +} + +void TimeConsumer::readDatagram(const QByteArray &ba) +{ + QDataStream ds(ba); + + ds >> lastTime; + lcdNumber->display(lastTime.toString("hh:mm:ss")); +} + +void TimeConsumer::timerTick() +{ + QByteArray buf; + QDataStream ds(&buf, QIODevice::WriteOnly); + + ds << lastTime; + emit writeDatagram(buf); +} + +void TimeConsumer::serverDisconnected() +{ + lcdNumber->display(QLatin1String("--:--:--")); +} diff --git a/examples/network/multistreamclient/timeconsumer.h b/examples/network/multistreamclient/timeconsumer.h new file mode 100644 index 0000000000..d382e99d86 --- /dev/null +++ b/examples/network/multistreamclient/timeconsumer.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TIMECONSUMER_H +#define TIMECONSUMER_H + +#include "consumer.h" +#include <QTime> + +QT_BEGIN_NAMESPACE +class QLCDNumber; +QT_END_NAMESPACE + +class TimeConsumer : public Consumer +{ + Q_OBJECT +public: + explicit TimeConsumer(QObject *parent = nullptr); + + QWidget *widget() Q_DECL_OVERRIDE; + void readDatagram(const QByteArray &ba) Q_DECL_OVERRIDE; + void serverDisconnected() Q_DECL_OVERRIDE; + +private slots: + void timerTick(); + +private: + QTime lastTime; + QLCDNumber *lcdNumber; +}; + +#endif diff --git a/examples/network/multistreamserver/animation.gif b/examples/network/multistreamserver/animation.gif Binary files differnew file mode 100644 index 0000000000..f674369efc --- /dev/null +++ b/examples/network/multistreamserver/animation.gif diff --git a/examples/network/multistreamserver/chatprovider.cpp b/examples/network/multistreamserver/chatprovider.cpp new file mode 100644 index 0000000000..9a88d491ab --- /dev/null +++ b/examples/network/multistreamserver/chatprovider.cpp @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "chatprovider.h" +#include <QString> +#include <QSctpSocket> +#include <QHostAddress> + +ChatProvider::ChatProvider(QObject *parent) + : Provider(parent) +{ +} + +void ChatProvider::readDatagram(QSctpSocket &from, const QByteArray &ba) +{ + emit writeDatagram(0, QString(QLatin1String("<%1:%2> %3")) + .arg(from.peerAddress().toString()) + .arg(QString::number(from.peerPort())) + .arg(QString::fromUtf8(ba)).toUtf8()); +} + +void ChatProvider::newConnection(QSctpSocket &client) +{ + readDatagram(client, QString(tr("has joined")).toUtf8()); +} + +void ChatProvider::clientDisconnected(QSctpSocket &client) +{ + readDatagram(client, QString(tr("has left")).toUtf8()); +} diff --git a/examples/network/multistreamserver/chatprovider.h b/examples/network/multistreamserver/chatprovider.h new file mode 100644 index 0000000000..912101ec34 --- /dev/null +++ b/examples/network/multistreamserver/chatprovider.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CHATPROVIDER_H +#define CHATPROVIDER_H + +#include "provider.h" + +class ChatProvider : public Provider +{ + Q_OBJECT +public: + explicit ChatProvider(QObject *parent = nullptr); + + void readDatagram(QSctpSocket &from, const QByteArray &ba) Q_DECL_OVERRIDE; + void newConnection(QSctpSocket &client) Q_DECL_OVERRIDE; + void clientDisconnected(QSctpSocket &client) Q_DECL_OVERRIDE; +}; + +#endif diff --git a/examples/network/multistreamserver/main.cpp b/examples/network/multistreamserver/main.cpp new file mode 100644 index 0000000000..04350cd13d --- /dev/null +++ b/examples/network/multistreamserver/main.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QApplication> + +#include "server.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + Server server; + + return (server.exec() == QDialog::Accepted) ? 0 : -1; +} diff --git a/examples/network/multistreamserver/movieprovider.cpp b/examples/network/multistreamserver/movieprovider.cpp new file mode 100644 index 0000000000..cc534e6f40 --- /dev/null +++ b/examples/network/multistreamserver/movieprovider.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "movieprovider.h" +#include <QMovie> +#include <QString> +#include <QDataStream> + +MovieProvider::MovieProvider(QObject *parent) + : Provider(parent) +{ + movie = new QMovie(this); + movie->setCacheMode(QMovie::CacheAll); + movie->setFileName(QLatin1String("animation.gif")); + connect(movie, &QMovie::frameChanged, this, &MovieProvider::frameChanged); + movie->start(); +} + +void MovieProvider::frameChanged() +{ + QByteArray buf; + QDataStream ds(&buf, QIODevice::WriteOnly); + + ds << movie->currentImage(); + emit writeDatagram(0, buf); +} diff --git a/examples/network/multistreamserver/movieprovider.h b/examples/network/multistreamserver/movieprovider.h new file mode 100644 index 0000000000..d6d8fb7449 --- /dev/null +++ b/examples/network/multistreamserver/movieprovider.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MOVIEPROVIDER_H +#define MOVIEPROVIDER_H + +#include "provider.h" + +QT_BEGIN_NAMESPACE +class QMovie; +QT_END_NAMESPACE + +class MovieProvider : public Provider +{ + Q_OBJECT +public: + explicit MovieProvider(QObject *parent = nullptr); + +private slots: + void frameChanged(); + +private: + QMovie *movie; +}; + +#endif diff --git a/examples/network/multistreamserver/multistreamserver.pro b/examples/network/multistreamserver/multistreamserver.pro new file mode 100644 index 0000000000..75a7e6bbec --- /dev/null +++ b/examples/network/multistreamserver/multistreamserver.pro @@ -0,0 +1,24 @@ +QT += network widgets + +HEADERS = server.h \ + provider.h \ + movieprovider.h \ + timeprovider.h \ + chatprovider.h +SOURCES = server.cpp \ + movieprovider.cpp \ + timeprovider.cpp \ + chatprovider.cpp \ + main.cpp + +EXAMPLE_FILES = animation.gif + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/network/multistreamserver +INSTALLS += target + +wince*: { + addFiles.files += *.gif + addFiles.path = . + DEPLOYMENT += addFiles +} diff --git a/examples/network/multistreamserver/provider.h b/examples/network/multistreamserver/provider.h new file mode 100644 index 0000000000..c6ec612275 --- /dev/null +++ b/examples/network/multistreamserver/provider.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef PROVIDER_H +#define PROVIDER_H + +#include <QObject> + +QT_BEGIN_NAMESPACE +class QSctpSocket; +class QByteArray; +QT_END_NAMESPACE + +class Provider : public QObject +{ + Q_OBJECT + +public: + explicit inline Provider(QObject *parent = nullptr) : QObject(parent) { } + + virtual void readDatagram(QSctpSocket &, const QByteArray &) { } + virtual void newConnection(QSctpSocket &) { } + virtual void clientDisconnected(QSctpSocket &) { } + +signals: + void writeDatagram(QSctpSocket *to, const QByteArray &ba); +}; + +#endif diff --git a/examples/network/multistreamserver/server.cpp b/examples/network/multistreamserver/server.cpp new file mode 100644 index 0000000000..1fb18e80b9 --- /dev/null +++ b/examples/network/multistreamserver/server.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtWidgets> +#include <QtNetwork> +#include <QtAlgorithms> + +#include "server.h" +#include "movieprovider.h" +#include "timeprovider.h" +#include "chatprovider.h" + +Server::Server(QWidget *parent) + : QDialog(parent) + , providers(NumberOfChannels) +{ + setWindowTitle(tr("Multi-stream Server")); + + sctpServer = new QSctpServer(this); + sctpServer->setMaxChannelCount(NumberOfChannels); + + statusLabel = new QLabel; + QPushButton *quitButton = new QPushButton(tr("Quit")); + + providers[Movie] = new MovieProvider(this); + providers[Time] = new TimeProvider(this); + providers[Chat] = new ChatProvider(this); + + connect(sctpServer, &QSctpServer::newConnection, this, &Server::newConnection); + connect(quitButton, &QPushButton::clicked, this, &Server::accept); + connect(providers[Movie], &Provider::writeDatagram, this, &Server::writeDatagram); + connect(providers[Time], &Provider::writeDatagram, this, &Server::writeDatagram); + connect(providers[Chat], &Provider::writeDatagram, this, &Server::writeDatagram); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(statusLabel); + mainLayout->addWidget(quitButton); + setLayout(mainLayout); +} + +Server::~Server() +{ + qDeleteAll(connections.begin(), connections.end()); +} + +int Server::exec() +{ + if (!sctpServer->listen()) { + QMessageBox::critical(this, windowTitle(), + tr("Unable to start the server: %1.") + .arg(sctpServer->errorString())); + return QDialog::Rejected; + } + + QString ipAddress; + QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); + // use the first non-localhost IPv4 address + for (int i = 0; i < ipAddressesList.size(); ++i) { + if (ipAddressesList.at(i) != QHostAddress::LocalHost && + ipAddressesList.at(i).toIPv4Address()) { + ipAddress = ipAddressesList.at(i).toString(); + break; + } + } + // if we did not find one, use IPv4 localhost + if (ipAddress.isEmpty()) + ipAddress = QHostAddress(QHostAddress::LocalHost).toString(); + statusLabel->setText(tr("The server is running on\n\nIP: %1\nport: %2\n\n" + "Run the Multi-stream Client example now.") + .arg(ipAddress).arg(sctpServer->serverPort())); + + return QDialog::exec(); +} + +void Server::newConnection() +{ + QSctpSocket *connection = sctpServer->nextPendingDatagramConnection(); + + connections.append(connection); + connect(connection, &QSctpSocket::channelReadyRead, this, &Server::readDatagram); + connect(connection, &QSctpSocket::disconnected, this, &Server::clientDisconnected); + + for (Provider *provider : providers) + provider->newConnection(*connection); +} + +void Server::clientDisconnected() +{ + QSctpSocket *connection = static_cast<QSctpSocket *>(sender()); + + connections.removeOne(connection); + connection->disconnect(); + + for (Provider *provider : providers) + provider->clientDisconnected(*connection); + + connection->deleteLater(); +} + +void Server::readDatagram(int channel) +{ + QSctpSocket *connection = static_cast<QSctpSocket *>(sender()); + + connection->setCurrentReadChannel(channel); + providers[channel]->readDatagram(*connection, connection->readDatagram().data()); +} + +void Server::writeDatagram(QSctpSocket *to, const QByteArray &ba) +{ + int channel = providers.indexOf(static_cast<Provider *>(sender())); + + if (to) { + to->setCurrentWriteChannel(channel); + to->writeDatagram(ba); + return; + } + + for (QSctpSocket *connection : connections) { + connection->setCurrentWriteChannel(channel); + connection->writeDatagram(ba); + } +} diff --git a/examples/network/multistreamserver/server.h b/examples/network/multistreamserver/server.h new file mode 100644 index 0000000000..6d01f7a238 --- /dev/null +++ b/examples/network/multistreamserver/server.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SERVER_H +#define SERVER_H + +#include <QDialog> +#include <QVector> +#include <QList> + +QT_BEGIN_NAMESPACE +class QSctpServer; +class QSctpSocket; +class QLabel; +class QByteArray; +QT_END_NAMESPACE + +class Provider; + +class Server : public QDialog +{ + Q_OBJECT +public: + explicit Server(QWidget *parent = nullptr); + virtual ~Server(); + +public slots: + int exec() Q_DECL_OVERRIDE; + +private slots: + void newConnection(); + void clientDisconnected(); + void readDatagram(int channel); + void writeDatagram(QSctpSocket *to, const QByteArray &ba); + +private: + enum ChannelNumber { + Movie = 0, + Time = 1, + Chat = 2, + + NumberOfChannels = 3 + }; + + QVector<Provider *> providers; + QSctpServer *sctpServer; + QList<QSctpSocket *> connections; + + QLabel *statusLabel; +}; + +#endif diff --git a/examples/network/multistreamserver/timeprovider.cpp b/examples/network/multistreamserver/timeprovider.cpp new file mode 100644 index 0000000000..043810cdf3 --- /dev/null +++ b/examples/network/multistreamserver/timeprovider.cpp @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "timeprovider.h" +#include <QDataStream> +#include <QTime> +#include <QByteArray> + +TimeProvider::TimeProvider(QObject *parent) + : Provider(parent) +{ +} + +void TimeProvider::readDatagram(QSctpSocket &from, const QByteArray &ba) +{ + QDataStream in_ds(ba); + QTime curTime = QTime::currentTime(); + QTime clientTime; + + in_ds >> clientTime; + if (!clientTime.isValid() || curTime.second() != clientTime.second() + || curTime.minute() != clientTime.minute() + || curTime.hour() != clientTime.hour()) { + QByteArray buf; + QDataStream out_ds(&buf, QIODevice::WriteOnly); + + out_ds << curTime; + emit writeDatagram(&from, buf); + } +} diff --git a/examples/network/multistreamserver/timeprovider.h b/examples/network/multistreamserver/timeprovider.h new file mode 100644 index 0000000000..b57c066c24 --- /dev/null +++ b/examples/network/multistreamserver/timeprovider.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TIMEPROVIDER_H +#define TIMEPROVIDER_H + +#include "provider.h" + +class TimeProvider : public Provider +{ + Q_OBJECT +public: + explicit TimeProvider(QObject *parent = nullptr); + + void readDatagram(QSctpSocket &from, const QByteArray &ba) Q_DECL_OVERRIDE; +}; + +#endif diff --git a/examples/network/network.pro b/examples/network/network.pro index 86bb08d22a..ff7fbcf4f2 100644 --- a/examples/network/network.pro +++ b/examples/network/network.pro @@ -32,4 +32,5 @@ qtHaveModule(widgets) { contains(QT_CONFIG, openssl):SUBDIRS += securesocketclient contains(QT_CONFIG, openssl-linked):SUBDIRS += securesocketclient + contains(QT_CONFIG, sctp):SUBDIRS += multistreamserver multistreamclient } |