一、描述
1.1、SCTP
1、SCTP(流控制传输协议)是一种传输层协议,其作用类似于流行的TCP 和 UDP协议。
2、与 UDP 一样,SCTP 也是面向消息的,但它确保消息的可靠、按序传输,并使用 TCP 等拥塞控制。
3、SCTP 是面向连接的协议,它提供端点之间多个数据流的完整同时传输。这种多流允许数据通过独立的通道传递,因此如果一个流中的数据丢失,则其他流的传递不会受到影响。
4、由于面向消息,SCTP 传输一系列消息,而不是像 TCP 那样传输不间断的字节流。就像在 UDP 中一样,在 SCTP 中,发送方在一次操作中发送一条消息,而该消息在一次操作中被传递到接收应用程序进程。但与 UDP 不同的是,交付是有保证的。
5、SCTP 支持多宿主,这意味着连接的端点可以具有与其关联的备用 IP 地址,以便绕过网络故障或不断变化的条件进行路由。
1.2、QSctpSocket描述
QSctpSocket 是 QTcpSocket 的子类,它可以在两种模式下运行:
- 连续字节流(TCP 仿真):要设置连续字节流模式,请实例化 QSctpSocket 并使用负值设置setMaximumChannelCount()。这提供了将 QSctpSocket 用作常规缓冲 QTcpSocket 的能力。可以调用connectToHost() 发起与端点的连接,write() 发送和read() 接收来自对等方的数据,但无法区分消息边界。
- 多流数据报模式:默认情况下,QSctpSocket 在数据报模式下运行。例:
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 平台不支持此功能。
二、成员函数
1、bool isInDatagramMode()
socket是否以数据报模式运行。
2、QNetworkDatagram readDatagram()
从当前读取通道的缓冲区读取数据报,并将其作为 QNetworkDatagram 对象连同发送方的主机地址和端口一起返回。
3、void setMaximumChannelCount(int count)
设置在数据报模式下支持的最大通道数。如果为 0,则通道将由远程端点设置。负数则设置此socket为连续字节流模式。仅当 QSctpSocket 处于 UnconnectedState 时调用此方法。
4、bool writeDatagram(const QNetworkDatagram &datagram)
将数据报写入当前写入通道的缓冲区,写入成功返回真。