Класс 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, в SCTP отправитель отправляет сообщение за один операцию, и это сообщение передается получающему приложению за один операцию. Но в отличие от 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.13/qsctpsocket.html