本页内容

QSctpSocket Class

QSctpSocket 类提供了一个 SCTP 套接字。更多内容...

头文件: #include <QSctpSocket>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
继承自: 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类似,在SCTP中,发送方通过一次操作发送一条消息,而该确切消息也会通过一次操作传递给接收方的应用程序进程。但与UDP不同的是,SCTP保证了消息的可靠交付。

它还支持多网卡配置,这意味着已连接的端点可以关联多个备用 IP 地址,以便在网络故障或环境变化时进行路由切换。

QSctpSocket 是QTcpSocket 的一个便捷子类,允许您通过 SCTP 模拟 TCP 数据流,或建立 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 。

成员函数文档

[explicit] QSctpSocket::QSctpSocket(QObject *parent = nullptr)

创建一个处于UnconnectedState 状态的QSctpSocket对象。

设置数据报操作模式。parent 参数将传递给QObject 的构造函数。

另请参阅 socketType() 和setMaximumChannelCount()。

[virtual noexcept] 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(默认值)表示连接通道数将由远程端点设定。

如果QSctpSocket 正在以连续字节流模式运行,则返回 -1。

另请参阅 setMaximumChannelCount()、readChannelCount() 和writeChannelCount()。

[override virtual protected] qint64 QSctpSocket::readData(char *data, qint64 maxSize)

重新实现了:QAbstractSocket::readData (char *data, qint64 maxSize)。

QNetworkDatagram QSctpSocket::readDatagram()

从当前读取通道的缓冲区中读取一个数据报,并将其作为QNetworkDatagram 对象返回,同时返回发送方的主机地址和端口。如果可能,该函数还会尝试确定数据报在接收时的目标地址、端口以及跳数。

若操作失败,则返回一个报告not valid 的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()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.