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