Класс QSctpSocket
Класс QSctpSocket предоставляет сокет SCTP. Подробнее...
| Заголовок: | #include <QSctpSocket> |
| CMake: | find_package(Qt6 COMPONENTS Network REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Network) |
| qmake: | QT += network |
| С тех пор: | Qt 5.8 |
| Наследуется от: | QTcpSocket |
Открытые функции
| 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 (протокол управления потоком передачи данных) — протокол транспортного уровня, выполняющий аналогичную роль, что и популярные протоколы 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-6.2/qsctpsocket.html