Класс 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 (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-6.1/qsctpsocket.html