Класс QSctpSocket
Класс QSctpSocket предоставляет сокет SCTP. Подробнее...
| Заголовок: | #include <QSctpSocket> |
| qmake: | QT += network |
| С момента: | Qt 5.8 |
| Наследует: | QTcpSocket |
Этот класс был представлен в Qt 5.8.
Открытые функции
| QSctpSocket(QObject *parent = nullptr) | |
| virtual | ~QSctpSocket() |
| bool | isInDatagramMode() const |
| int | maximumChannelCount() const |
| QNetworkDatagram | readDatagram() |
| void | setMaximumChannelCount(int count) |
| bool | writeDatagram(const QNetworkDatagram &datagram) |
Переопределённые открытые функции
| virtual void | close() override |
| virtual void | disconnectFromHost() override |
Переопределённые защищённые функции
| virtual qint64 | readData(char *data, qint64 maxSize) override |
| virtual qint64 | readLineData(char *data, qint64 maxlen) override |
Подробное описание
SCTP (Stream Control Transmission Protocol) — протокол транспортного уровня, выполняющий аналогичную роль популярным протоколам TCP и UDP. Как и UDP, SCTP ориентирован на сообщения, но гарантирует надёжную и последовательную передачу сообщений с управлением заторами, как TCP.
SCTP — это ориентированный на соединение протокол, который обеспечивает полную одновременную передачу нескольких потоков данных между конечными точками. Эта многопотоковая передача позволяет доставлять данные независимыми каналами, так что при потере данных в одном потоке доставка по другим потокам не повлияет.
Как протокол, ориентированный на сообщения, SCTP передает последовательность сообщений, а не непрерывный поток байтов, как TCP. Как и в UDP, отправитель отправляет сообщение за один операцию, а получатель получает это же сообщение за одну операцию. Но в отличие от UDP, доставка гарантирована.
Он также поддерживает мультитеринг, что означает, что подключенная конечная точка может иметь связанные с ней альтернативные IP-адреса для обхода сбоев сети или изменения условий.
QSctpSocket — удобный подкласс QTcpSocket, позволяющий эмулировать поток данных TCP через SCTP или установить соединение SCTP для надёжной работы с дейтаграммами.
QSctpSocket может работать в одном из двух режимов:
- Непрерывный поток байтов (эмуляция TCP).
- Многопотоковый режим дейтаграмм.
Для установки режима непрерывного потока байтов создайте QSctpSocket и вызовите setMaximumChannelCount() с отрицательным значением. Это позволяет использовать QSctpSocket как обычный буферизованный QTcpSocket. Можно вызвать connectToHost() для начала соединения с конечной точкой, write() для передачи и read() для получения данных от партнёра, но вы не сможете определить границы сообщений.
По умолчанию QSctpSocket работает в режиме дейтаграмм. Перед подключением вызовите setMaximumChannelCount() для установки максимального количества каналов, которые приложение готово поддерживать. Это число согласовывается с удалённой конечной точкой и может быть ограничено операционной системой. Значение по умолчанию 0 означает использование значения партнёра. Если у обеих конечных точек значения по умолчанию, то количество каналов соединения зависит от системы.
После установления соединения вы можете получить фактическое количество каналов, вызвав readChannelCount() и writeChannelCount().
QSctpSocket *socket = new QSctpSocket(this);
socket->setMaxChannelCount(16);
socket->connectToHost(QHostAddress::LocalHost, 1973);
if (socket->waitForConnected(1000)) {
int inputChannels = socket->readChannelCount();
int outputChannels = socket->writeChannelCount();
....
} В режиме дейтаграмм QSctpSocket выполняет буферизацию дейтаграмм независимо для каждого канала. Вы можете добавить дейтаграмму в буфер текущего канала, вызвав writeDatagram(), и прочитать ожидающую дейтаграмму, вызвав readDatagram().
Использование стандартных функций QIODevice, таких как read(), readLine(), write() и т. д., разрешено в режиме дейтаграмм с теми же ограничениями, что и в режиме непрерывного потока байтов.
Примечание: Эта функция не поддерживается на платформе Windows.
См. также QSctpServer, QTcpSocket и QAbstractSocket.
Документация по функциям-членам
QSctpSocket::QSctpSocket(QObject *parent = nullptr)
Создаёт объект QSctpSocket в состоянии UnconnectedState.
Устанавливает режим работы с дейтаграммами. Аргумент parent передаётся конструктору QObject.
См. также socketType() и setMaximumChannelCount().
[virtual] QSctpSocket::~QSctpSocket()
Удаляет сокет, закрывая соединение при необходимости.
См. также close().
[override virtual] void QSctpSocket::close()
Реализует: QAbstractSocket::close().
[override virtual] void QSctpSocket::disconnectFromHost()
Реализует: QAbstractSocket::disconnectFromHost().
bool QSctpSocket::isInDatagramMode() const
Возвращает true, если сокет работает в режиме дейтаграмм.
См. также setMaximumChannelCount().
int QSctpSocket::maximumChannelCount() const
Возвращает максимальное количество каналов, которые может поддерживать QSctpSocket.
Значение 0 (по умолчанию) означает, что количество каналов соединения будет установлено удалённой конечной точкой.
Возвращает -1, если QSctpSocket работает в режиме непрерывного потока байтов.
См. также setMaximumChannelCount(), readChannelCount() и writeChannelCount().
[override virtual protected] qint64 QSctpSocket::readData(char *data, qint64 maxSize)
Реализует: QAbstractSocket::readData(char *data, qint64 maxSize).
QNetworkDatagram QSctpSocket::readDatagram()
Считывает дейтаграмму из буфера текущего канала чтения и возвращает её как объект QNetworkDatagram вместе с адресом хоста и портом отправителя. Если возможно, функция также попытается определить адрес назначения дейтаграммы, порт и количество хопов во время приёма.
В случае ошибки возвращает QNetworkDatagram, который сообщает, что недействителен.
См. также writeDatagram(), isInDatagramMode() и currentReadChannel().
[override virtual protected] qint64 QSctpSocket::readLineData(char *data, qint64 maxlen)
Реализует: QAbstractSocket::readLineData(char *data, qint64 maxlen).
void QSctpSocket::setMaximumChannelCount(int count)
Устанавливает максимальное количество каналов, которые приложение готово поддерживать в режиме дейтаграмм, до count. Если count равен 0, используется значение удалённой конечной точки для максимального количества каналов. Отрицательное count устанавливает режим непрерывного потока байтов.
Вызывайте этот метод только когда QSctpSocket находится в состоянии UnconnectedState.
См. также maximumChannelCount(), readChannelCount() и writeChannelCount().
bool QSctpSocket::writeDatagram(const QNetworkDatagram &datagram)
Записывает datagram в буфер текущего канала записи. Возвращает true при успехе; в противном случае возвращает false.
См. также readDatagram(), isInDatagramMode(), и currentWriteChannel().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qsctpsocket.html