QAbstractSocket Class
QAbstractSocket 类提供了所有套接字类型共有的基本功能。更多内容...
| 头文件: | #include <QAbstractSocket> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
| qmake: | QT += network |
| 继承自: | QIODevice |
| 继承自: |
- 所有成员列表(包括继承的成员)
- QAbstractSocket 属于网络编程 API 的一部分。
注意:该类中的所有函数均为可重入的。
公共类型
| enum | BindFlag { ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform } |
| flags | BindMode |
| enum | NetworkLayerProtocol { IPv4Protocol, IPv6Protocol, AnyIPProtocol, UnknownNetworkLayerProtocol } |
| enum | PauseMode { PauseNever, PauseOnSslErrors } |
| flags | PauseModes |
| enum | SocketError { ConnectionRefusedError, RemoteHostClosedError, HostNotFoundError, SocketAccessError, SocketResourceError, …, UnknownSocketError } |
| enum | SocketOption { LowDelayOption, KeepAliveOption, MulticastTtlOption, MulticastLoopbackOption, TypeOfServiceOption, …, KeepAliveCountOption } |
| enum | SocketState { UnconnectedState, HostLookupState, ConnectingState, ConnectedState, BoundState, …, ListeningState } |
| enum | SocketType { TcpSocket, UdpSocket, SctpSocket, UnknownSocketType } |
公共函数
| QAbstractSocket(QAbstractSocket::SocketType socketType, QObject *parent) | |
| virtual | ~QAbstractSocket() |
| void | abort() |
| virtual bool | bind(const QHostAddress &address, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform) |
| bool | bind(quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform) |
(since 6.2) bool | bind(QHostAddress::SpecialAddress addr, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform) |
| virtual void | connectToHost(const QString &hostName, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol) |
| void | connectToHost(const QHostAddress &address, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite) |
| virtual void | disconnectFromHost() |
| QAbstractSocket::SocketError | error() const |
| bool | flush() |
| bool | isValid() const |
| QHostAddress | localAddress() const |
| quint16 | localPort() const |
| QAbstractSocket::PauseModes | pauseMode() const |
| QHostAddress | peerAddress() const |
| QString | peerName() const |
| quint16 | peerPort() const |
| QString | protocolTag() const |
| QNetworkProxy | proxy() const |
| qint64 | readBufferSize() const |
| virtual void | resume() |
| void | setPauseMode(QAbstractSocket::PauseModes pauseMode) |
| void | setProtocolTag(const QString &tag) |
| void | setProxy(const QNetworkProxy &networkProxy) |
| virtual void | setReadBufferSize(qint64 size) |
| virtual bool | setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = ConnectedState, QIODeviceBase::OpenMode openMode = ReadWrite) |
| virtual void | setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value) |
| virtual qintptr | socketDescriptor() const |
| virtual QVariant | socketOption(QAbstractSocket::SocketOption option) |
| QAbstractSocket::SocketType | socketType() const |
| QAbstractSocket::SocketState | state() const |
| virtual bool | waitForConnected(int msecs = 30000) |
| virtual bool | waitForDisconnected(int msecs = 30000) |
重新实现的公共函数
| virtual qint64 | bytesAvailable() const override |
| virtual qint64 | bytesToWrite() const override |
| virtual void | close() override |
| virtual bool | isSequential() const override |
| virtual bool | waitForBytesWritten(int msecs = 30000) override |
| virtual bool | waitForReadyRead(int msecs = 30000) override |
信号
| void | connected() |
| void | disconnected() |
| void | errorOccurred(QAbstractSocket::SocketError socketError) |
| void | hostFound() |
| void | proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) |
| void | stateChanged(QAbstractSocket::SocketState socketState) |
受保护函数
| void | setLocalAddress(const QHostAddress &address) |
| void | setLocalPort(quint16 port) |
| void | setPeerAddress(const QHostAddress &address) |
| void | setPeerName(const QString &name) |
| void | setPeerPort(quint16 port) |
| void | setSocketError(QAbstractSocket::SocketError socketError) |
| void | setSocketState(QAbstractSocket::SocketState state) |
重新实现的受保护函数
| virtual qint64 | readData(char *data, qint64 maxSize) override |
| virtual qint64 | readLineData(char *data, qint64 maxlen) override |
| virtual qint64 | skipData(qint64 maxSize) override |
| virtual qint64 | writeData(const char *data, qint64 size) override |
详细说明
QAbstractSocket 是QTcpSocket 和QUdpSocket 的基类,包含这两个类的所有通用功能。如果您需要一个套接字,有两种选择:
- 实例化QTcpSocket 或QUdpSocket 。
- 创建一个本机套接字描述符,实例化 QAbstractSocket,并调用setSocketDescriptor() 来封装该本机套接字。
TCP(传输控制协议)是一种可靠、面向流、面向连接的传输协议。 UDP(用户数据报协议)是一种不可靠的、基于数据报的、无连接协议。实际上,这意味着 TCP 更适合连续的数据传输,而当可靠性不重要时,可以使用更轻量级的 UDP。
QAbstractSocket 的 API 统一了这两种协议之间的大部分差异。 例如,尽管 UDP 是无连接的,但connectToHost() 会为 UDP 套接字建立一个虚拟连接,从而使您能够以大致相同的方式使用 QAbstractSocket,无论底层协议为何。在内部,QAbstractSocket 会记住传递给connectToHost() 的地址和端口,而read() 和write() 等函数会使用这些值。
在任何时候,QAbstractSocket 都处于某种状态(由state() 返回)。初始状态为UnconnectedState 。调用connectToHost() 后,套接字首先进入HostLookupState 。如果找到主机,QAbstractSocket 进入ConnectingState 并发出hostFound() 信号。 当连接建立后,它将进入ConnectedState 状态并发出connected()信号。如果任何阶段发生错误,将发出errorOccurred()信号。每当状态发生变化时,都会发出stateChanged()信号。为方便起见,如果套接字已准备好进行读写操作,isValid()将返回true ,但请注意,在进行读写操作之前,套接字的状态必须为ConnectedState 。
可通过调用read() 或write() 来读取或写入数据,也可以使用便捷函数readLine() 和readAll()。QAbstractSocket 还从QIODevice 继承了getChar()、putChar() 和ungetChar(),这些函数处理单字节数据。当数据已写入套接字时,会发出bytesWritten() 信号。 请注意,Qt 不会限制写缓冲区的大小。您可以通过监听此信号来监控其大小。
每当有新的数据块到达时,都会发出readyRead() 信号。此时,bytesAvailable() 会返回可供读取的字节数。通常,您会将readyRead() 信号连接到一个槽中,并在该处读取所有可用数据。 如果您没有一次性读取所有数据,剩余数据稍后仍可获取,且任何新到达的数据都会追加到 QAbstractSocket 的内部读取缓冲区中。若要限制读取缓冲区的大小,请调用setReadBufferSize()。
要关闭套接字,请调用disconnectFromHost()。QAbstractSocket将进入QAbstractSocket::ClosingState 。在将所有待处理数据写入套接字后,QAbstractSocket才会真正关闭套接字,进入QAbstractSocket::UnconnectedState ,并发出disconnected()信号。 若需立即终止连接并丢弃所有待处理数据,请改调用abort()。若远程主机关闭连接,QAbstractSocket将发出errorOccurred (QAbstractSocket::RemoteHostClosedError )信号,此时套接字状态仍为ConnectedState ,随后将发出disconnected()信号。
通过调用peerPort()和peerAddress()可以获取已连接对端的端口和地址。peerName()返回对端的主机名,该主机名是作为参数传递给connectToHost()的。localPort()和localAddress()分别返回本地套接字的端口和地址。
QAbstractSocket 提供了一组函数,这些函数会将调用线程挂起,直到发出特定信号为止。这些函数可用于实现阻塞式套接字:
- waitForConnected() 会阻塞直至建立连接。
- waitForReadyRead() 阻塞直至有新数据可供读取。
- waitForBytesWritten() 阻塞直至向套接字写入一帧数据。
- waitForDisconnected() 阻塞直至连接关闭。
下面是一个示例:
int numRead = 0, numReadTotal = 0;
char buffer[50];
forever {
numRead = socket.read(buffer, 50);
// do whatever with array
numReadTotal += numRead;
if (numRead == 0 && !socket.waitForReadyRead())
break;
}如果 `waitForReadyRead()` 返回 `false`,则表示连接已关闭或发生了错误。
使用阻塞式套接字编程与使用非阻塞式套接字编程截然不同。阻塞式套接字不需要事件循环,通常能使代码更简洁。但在图形用户界面(GUI)应用程序中,应仅在非GUI线程中使用阻塞式套接字,以避免用户界面冻结。 请参阅fortuneclient和blockingfortuneclient示例,以了解这两种方法的概述。
注意:我们 不建议将阻塞函数与信号结合使用。应仅选用其中一种方式。
QAbstractSocket 可与QTextStream 和QDataStream 中的流运算符(operator<<() 和 operator>>())配合使用。但需注意一点:在使用 operator>>() 读取数据之前,必须确保有足够的数据可用。
另请参阅 QNetworkAccessManager 和QTcpServer 。
成员类型文档
enum QAbstractSocket::BindFlag
flags QAbstractSocket::BindMode
此枚举描述了可用于修改 `QAbstractSocket::bind()` 行为的各种标志。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::ShareAddress | 0x1 | 允许其他服务绑定到相同的地址和端口。当多个进程通过监听相同的地址和端口来分担单个服务的负载时,此选项非常有用(例如,具有多个预分叉监听器的 Web 服务器可以大大提高响应时间)。 但是,由于允许任何服务重新绑定,因此此选项需考虑某些安全问题。请注意,将此选项与 ReuseAddressHint 结合使用时,您还将允许您的服务重新绑定现有的共享地址。在 Unix 上,这相当于 SO_REUSEADDR 套接字选项。 在 Windows 系统上,这是默认行为,因此该选项将被忽略。 |
QAbstractSocket::DontShareAddress | 0x2 | 独占地绑定地址和端口,从而不允许其他服务重新绑定。通过将此选项传递给QAbstractSocket::bind(),可确保操作成功后,您的服务是唯一监听该地址和端口的服务。即使其他服务传递了 ReuseAddressHint,也不允许其重新绑定。 与 ShareAddress 相比,此选项提供了更高的安全性,但在某些操作系统上,它要求您以管理员权限运行服务器。在 Unix 和 macOS 上,不共享是绑定地址和端口的默认行为,因此此选项将被忽略。在 Windows 上,此选项使用 SO_EXCLUSIVEADDRUSE 套接字选项。 |
QAbstractSocket::ReuseAddressHint | 0x4 | 向 `QAbstractSocket ` 提供提示,使其即使该地址和端口已被另一个套接字绑定,也应尝试重新绑定该服务。在 Windows 和 Unix 上,这等同于 `SO_REUSEADDR` 套接字选项。 |
QAbstractSocket::DefaultForPlatform | 0x0 | 当前平台的默认选项。在 Unix 和 macOS 上,这等同于 (DontShareAddress + ReuseAddressHint);在 Windows 上,则等同于 ShareAddress。 |
BindMode 类型是QFlags<BindFlag> 的 typedef。它存储了 BindFlag 值的按“或”运算组合。
enum QAbstractSocket::NetworkLayerProtocol
此枚举描述了 Qt Network 中使用的网络层协议值。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::IPv4Protocol | 0 | IPv4 |
QAbstractSocket::IPv6Protocol | 1 | IPv6 |
QAbstractSocket::AnyIPProtocol | 2 | IPv4 或 IPv6 |
QAbstractSocket::UnknownNetworkLayerProtocol | -1 | 除 IPv4 和 IPv6 以外 |
另请参阅 QHostAddress::protocol()。
enum QAbstractSocket::PauseMode
flags QAbstractSocket::PauseModes
该枚举描述了套接字在何种情况下应暂停继续数据传输的行为。目前唯一支持的通知是QSslSocket::sslErrors()。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::PauseNever | 0x0 | 不暂停套接字上的数据传输。这是默认行为,与 Qt 4 的行为一致。 |
QAbstractSocket::PauseOnSslErrors | 0x1 | 在接收到 SSL 错误通知时,暂停套接字上的数据传输。即QSslSocket::sslErrors()。 |
PauseModes 类型是QFlags<PauseMode> 的 typedef 定义。它存储了 PauseMode 值的按“或”运算组合。
enum QAbstractSocket::SocketError
该枚举描述了可能发生的套接字错误。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::ConnectionRefusedError | 0 | 连接被对端拒绝(或超时)。 |
QAbstractSocket::RemoteHostClosedError | 1 | 远程主机关闭了连接。请注意,在发送远程关闭通知后,客户端套接字(即此套接字)将被关闭。 |
QAbstractSocket::HostNotFoundError | 2 | 未找到主机地址。 |
QAbstractSocket::SocketAccessError | 3 | 由于应用程序缺乏所需的权限,套接字操作失败。 |
QAbstractSocket::SocketResourceError | 4 | 本地系统资源已耗尽(例如,套接字过多)。 |
QAbstractSocket::SocketTimeoutError | 5 | 套接字操作超时。 |
QAbstractSocket::DatagramTooLargeError | 6 | 数据报大于操作系统的限制(该限制可能低至 8192 字节)。 |
QAbstractSocket::NetworkError | 7 | 网络发生错误(例如,网线被意外拔出)。 |
QAbstractSocket::AddressInUseError | 8 | 指定给QAbstractSocket::bind() 的地址已被占用,并且被设置为独占。 |
QAbstractSocket::SocketAddressNotAvailableError | 9 | 指定给QAbstractSocket::bind() 的地址不属于该主机。 |
QAbstractSocket::UnsupportedSocketOperationError | 10 | 本地操作系统不支持所请求的套接字操作(例如,不支持 IPv6)。 |
QAbstractSocket::ProxyAuthenticationRequiredError | 12 | 该套接字正在使用代理,且该代理需要身份验证。 |
QAbstractSocket::SslHandshakeFailedError | 13 | SSL/TLS 握手失败,因此连接已关闭(仅用于QSslSocket ) |
QAbstractSocket::UnfinishedSocketOperationError | 11 | 仅由 QAbstractSocketEngine 使用,上次尝试的操作尚未完成(仍在后台进行中)。 |
QAbstractSocket::ProxyConnectionRefusedError | 14 | 无法联系代理服务器,因为与该服务器的连接被拒绝 |
QAbstractSocket::ProxyConnectionClosedError | 15 | 与代理服务器的连接意外关闭(在与最终对等方建立连接之前) |
QAbstractSocket::ProxyConnectionTimeoutError | 16 | 与代理服务器的连接超时,或者代理服务器在身份验证阶段停止响应。 |
QAbstractSocket::ProxyNotFoundError | 17 | 无法找到通过setProxy() 设置的代理地址(或应用程序代理)。 |
QAbstractSocket::ProxyProtocolError | 18 | 与代理服务器的连接协商失败,因为无法理解来自代理服务器的响应。 |
QAbstractSocket::OperationError | 19 | 在套接字处于不允许执行该操作的状态下尝试执行了该操作。 |
QAbstractSocket::SslInternalError | 20 | 所使用的 SSL 库报告了一个内部错误。这很可能是由于库安装不正确或配置错误所致。 |
QAbstractSocket::SslInvalidUserDataError | 21 | 提供了无效的数据(证书、密钥、加密算法等),其使用导致 SSL 库出错。 |
QAbstractSocket::TemporaryError | 22 | 发生了一个临时错误(例如,操作会阻塞,而套接字是非阻塞的)。 |
QAbstractSocket::UnknownSocketError | -1 | 发生了一个未识别的错误。 |
另请参阅 QAbstractSocket::error() 和QAbstractSocket::errorOccurred()。
enum QAbstractSocket::SocketOption
该枚举表示可在套接字上设置的选项。如果需要,可以在收到套接字发出的connected()信号后,或者在通过QTcpServer 获得新套接字后,设置这些选项。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::LowDelayOption | 0 | 尝试优化套接字以实现低延迟。对于QTcpSocket ,这将设置 TCP_NODELAY 选项并禁用纳格尔算法。将此值设为 1 即可启用。 |
QAbstractSocket::KeepAliveOption | 1 | 将此值设为 1 以启用 SO_KEEPALIVE 套接字选项 |
QAbstractSocket::MulticastTtlOption | 2 | 将此参数设为整数值,以设置 IP_MULTICAST_TTL(多播数据报的 TTL)套接字选项。 |
QAbstractSocket::MulticastLoopbackOption | 3 | 将此值设为 1 以启用 IP_MULTICAST_LOOP(多播环回)套接字选项。 |
QAbstractSocket::TypeOfServiceOption | 4 | 此选项在 Windows 上不受支持。此选项映射到 IP_TOS 套接字选项。有关可能的值,请参见下表。 |
QAbstractSocket::SendBufferSizeSocketOption | 5 | 在操作系统级别设置套接字发送缓冲区大小(以字节为单位)。这对应于 SO_SNDBUF 套接字选项。此选项不会影响QIODevice 或QAbstractSocket 缓冲区。此枚举值自 Qt 5.3 起引入。 |
QAbstractSocket::ReceiveBufferSizeSocketOption | 6 | 在操作系统级别设置套接字的接收缓冲区大小(以字节为单位)。这对应于 SO_RCVBUF 套接字选项。此选项不会影响QIODevice 或QAbstractSocket 缓冲区(参见setReadBufferSize())。此枚举值在 Qt 5.3 中引入。 |
QAbstractSocket::PathMtuSocketOption | 7 | 获取 IP 协议栈当前已知的路径最大传输单元 (PMTU) 值(如有)。某些 IP 协议栈还允许设置传输的 MTU。该枚举值自 Qt 5.11 起引入。 |
QAbstractSocket::KeepAliveIdleOption | 8 | 当启用 KeepAliveOption 时,连接处于空闲状态所需的时间(以秒为单位),超过该时间后 TCP 才会开始发送保持活动探测。该枚举值自 Qt 6.11 起引入。 |
QAbstractSocket::KeepAliveIntervalOption | 9 | 如果启用了 KeepAliveOption,则指相邻两次保持活动探测之间的时间间隔(以秒为单位)。并非所有操作系统都支持此选项。该枚举值在 Qt 6.11 中引入。 |
QAbstractSocket::KeepAliveCountOption | 10 | 如果启用了 KeepAliveOption,在 TCP 断开连接之前发送的保持活动探测的最大次数。并非所有操作系统都支持此选项。此枚举值在 Qt 6.11 中引入。 |
TypeOfServiceOption的可能取值为:
| 值 | 描述 |
|---|---|
| 224 | 网络控制 |
| 192 | 网间控制 |
| 160 | CRITIC/ECP |
| 128 | 闪存覆盖 |
| 96 | 闪光灯 |
| 64 | 立即 |
| 32 | 优先级 |
| 0 | 常规 |
另请参阅 QAbstractSocket::setSocketOption() 和QAbstractSocket::socketOption()。
enum QAbstractSocket::SocketState
该枚举描述了套接字可能处于的不同状态。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::UnconnectedState | 0 | 套接字未连接。 |
QAbstractSocket::HostLookupState | 1 | 套接字正在执行主机名查询。 |
QAbstractSocket::ConnectingState | 2 | 套接字已开始建立连接。 |
QAbstractSocket::ConnectedState | 3 | 已建立连接。 |
QAbstractSocket::BoundState | 4 | 套接字已绑定到某个地址和端口。 |
QAbstractSocket::ClosingState | 6 | 套接字即将关闭(可能仍有数据等待写入)。 |
QAbstractSocket::ListeningState | 5 | 仅供内部使用。 |
另请参阅 QAbstractSocket::state()。
enum QAbstractSocket::SocketType
此枚举描述了传输层协议。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractSocket::TcpSocket | 0 | TCP |
QAbstractSocket::UdpSocket | 1 | UDP |
QAbstractSocket::SctpSocket | 2 | SCTP |
QAbstractSocket::UnknownSocketType | -1 | 除 TCP、UDP 和 SCTP 以外 |
另请参阅 ` QAbstractSocket::socketType()`。
成员函数文档
QAbstractSocket::QAbstractSocket(QAbstractSocket::SocketType socketType, QObject *parent)
创建一个类型为socketType 的新抽象套接字。参数parent 将传递给QObject 的构造函数。
另请参阅 socketType()、QTcpSocket 和QUdpSocket 。
[virtual noexcept] QAbstractSocket::~QAbstractSocket()
销毁该套接字。
void QAbstractSocket::abort()
终止当前连接并重置套接字。与disconnectFromHost()不同,该函数会立即关闭套接字,并丢弃写缓冲区中所有待处理的数据。
另请参阅 disconnectFromHost() 和close()。
[virtual] bool QAbstractSocket::bind(const QHostAddress &address, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
在端口port 上绑定到address ,使用BindMode mode 。
对于 UDP 套接字,绑定后,每当指定地址和端口的 UDP 数据报到达时,都会触发QUdpSocket::readyRead() 信号。因此,该函数对于编写 UDP 服务器非常有用。
对于 TCP 套接字,该函数可用于指定用于建立出站连接的接口,这在存在多个网络接口时非常有用。
默认情况下,套接字会绑定到DefaultForPlatform BindMode 。如果未指定端口,则会选择一个随机端口。
成功时,该函数返回true ,套接字进入BoundState 状态;否则返回false 。
bool QAbstractSocket::bind(quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
在端口port 上绑定到QHostAddress:Any,使用BindMode mode 。
默认情况下,套接字使用DefaultForPlatform BindMode 进行绑定。如果未指定端口,则会选择一个随机端口。
这是一个重载函数。
[since 6.2] bool QAbstractSocket::bind(QHostAddress::SpecialAddress addr, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
使用BindMode mode 将套接字绑定到端口port 上的特殊地址addr 。
默认情况下,套接字会使用DefaultForPlatform BindMode 进行绑定。如果未指定端口,则会选择一个随机端口。
这是一个重载函数。
该函数在 Qt 6.2 中引入。
[override virtual] qint64 QAbstractSocket::bytesAvailable() const
重写:QIODevice::bytesAvailable() const。
返回等待读取的传入字节数。
另请参阅 bytesToWrite() 和read()。
[override virtual] qint64 QAbstractSocket::bytesToWrite() const
重新实现了:QIODevice::bytesToWrite() const。
返回待写入的字节数。当控制权返回事件循环或调用flush() 时,这些字节将被写入。
另请参阅 bytesAvailable() 和flush()。
[override virtual] void QAbstractSocket::close()
重写了:QIODevice::close()。
关闭套接字对应的 I/O 设备,并调用disconnectFromHost() 来关闭套接字的连接。
有关关闭 I/O 设备时执行的操作说明,请参阅QIODevice::close()。
另请参阅 abort()。
[virtual] void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
尝试通过给定的port 连接到hostName 。可以使用protocol 参数指定要使用的网络协议(例如IPv4或IPv6)。
套接字在指定的openMode 中打开,首先进入HostLookupState 状态,然后对hostName 进行主机名查询。如果查询成功,将触发hostFound() 事件,且QAbstractSocket 进入ConnectingState 状态。随后,它将尝试连接查询返回的一个或多个地址。最后,如果建立连接,QAbstractSocket 进入ConnectedState 状态并触发connected() 事件。
在任何时候,套接字都可以发出errorOccurred() 来指示发生了错误。
hostName 可能是一个字符串形式的 IP 地址(例如,“43.195.83.32”),也可能是主机名(例如,“example.com”)。QAbstractSocket 仅在必要时才会进行查询。port 采用本机字节序。
另请参阅 state()、peerName()、peerAddress()、peerPort() 以及waitForConnected()。
void QAbstractSocket::connectToHost(const QHostAddress &address, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite)
正在尝试通过端口port 连接到address 。
这是一个重载函数。
[signal] void QAbstractSocket::connected()
在调用connectToHost()并成功建立连接后,会发出此信号。
注意:在 某些操作系统上 ,对于连接到本地主机的连接,`connectToHost()` 调用可能会直接发出 `connected()` 信号。
另请参阅 connectToHost() 和disconnected()。
[virtual] void QAbstractSocket::disconnectFromHost()
尝试关闭套接字。如果存在待写入的数据,QAbstractSocket 将进入ClosingState 状态,并等待直至所有数据写入完毕。最终,它将进入UnconnectedState 状态,并发出disconnected()信号。
另请参阅 connectToHost()。
[signal] void QAbstractSocket::disconnected()
当套接字断开连接时,会发出此信号。
警告:若 需在连接此信号的插槽中删除sender(),请使用deleteLater()函数。
另请参阅 connectToHost()、disconnectFromHost() 和abort()。
QAbstractSocket::SocketError QAbstractSocket::error() const
返回上次发生的错误类型。
另请参阅 state() 和errorString()。
[signal] void QAbstractSocket::errorOccurred(QAbstractSocket::SocketError socketError)
该信号在发生错误后触发。socketError 参数描述了发生的错误类型。
当此信号被触发时,套接字可能尚未准备好进行重新连接尝试。在这种情况下,应从事件循环中进行重新连接尝试。例如,使用 QChronoTimer::singleShot() 并设置超时时间为 0ns。
QAbstractSocket::SocketError 并非已注册的元类型,因此对于队列连接,您必须通过Q_DECLARE_METATYPE() 和qRegisterMetaType() 对其进行注册。
另请参阅 error()、errorString() 以及《创建自定义 Qt 类型》。
bool QAbstractSocket::flush()
该函数会尽可能多地将内部写缓冲区中的数据写入底层网络套接字,且不会阻塞。如果成功写入了任何数据,该函数返回true ;否则返回false。
若需让QAbstractSocket 立即开始发送缓冲数据,请调用此函数。成功写入的字节数取决于操作系统。在大多数情况下,您无需调用此函数,因为一旦控制权返回事件循环,QAbstractSocket 将自动开始发送数据。若不存在事件循环,请改调用waitForBytesWritten()。
另请参阅 write() 和waitForBytesWritten()。
[signal] void QAbstractSocket::hostFound()
在调用connectToHost() 且主机查找成功后,会发出此信号。
注意:自 Qt 4.6.3起, 由于 DNS 结果可能已被缓存,因此 `QAbstractSocket ` 可能会直接从 `connectToHost()` 调用中发出 `hostFound()` 信号。
另请参阅 connected()。
[override virtual] bool QAbstractSocket::isSequential() const
重新实现了:QIODevice::isSequential() const。
bool QAbstractSocket::isValid() const
如果套接字有效且已准备就绪,则返回true ;否则返回false 。
注意: 在进行读写操作之前,套接字的状态必须为ConnectedState 。
另请参阅 state()。
QHostAddress QAbstractSocket::localAddress() const
如果可用,则返回本地套接字的主机地址;否则返回QHostAddress::Null 。
这通常是主机的主 IP 地址,但在连接到本地主机时,可能会返回QHostAddress::LocalHost (127.0.0.1)。
另请参阅 localPort()、peerAddress() 和setLocalAddress()。
quint16 QAbstractSocket::localPort() const
如果可用,则返回本地套接字的主机端口号(以本机字节序表示);否则返回 0。
另请参阅 localAddress()、peerPort() 和setLocalPort()。
QAbstractSocket::PauseModes QAbstractSocket::pauseMode() const
返回此套接字的暂停模式。
另请参阅 setPauseMode() 和resume()。
QHostAddress QAbstractSocket::peerAddress() const
如果套接字处于ConnectedState 状态,则返回已连接对等方的地址;否则返回QHostAddress::Null 。
另请参阅 peerName()、peerPort()、localAddress() 和setPeerAddress()。
QString QAbstractSocket::peerName() const
返回由connectToHost() 指定的对等方名称;如果尚未调用connectToHost(),则返回空的QString 。
另请参阅 peerAddress()、peerPort() 和setPeerName()。
quint16 QAbstractSocket::peerPort() const
如果套接字处于ConnectedState 状态,则返回已连接对端的端口;否则返回0。
另请参阅 peerAddress()、localPort() 和setPeerPort()。
QString QAbstractSocket::protocolTag() const
返回此套接字的协议标记。如果设置了协议标记,则在内部创建QNetworkProxyQuery 时,该标记会被传递给它,以指示应使用的协议标记。
另请参阅 setProtocolTag() 和QNetworkProxyQuery 。
QNetworkProxy QAbstractSocket::proxy() const
返回此套接字的网络代理。默认情况下使用QNetworkProxy::DefaultProxy ,这意味着该套接字将查询应用程序的默认代理设置。
另请参阅 setProxy()、QNetworkProxy 以及QNetworkProxyFactory 。
[signal] void QAbstractSocket::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)
当使用需要身份验证的proxy 时,可能会触发此信号。此时,可向authenticator 对象填充所需的详细信息,以完成身份验证并继续建立连接。
注意:无法 使用 QueuedConnection 连接此信号,因为当信号返回时,若身份验证器中未填入新信息,连接将失败。
另请参阅 QAuthenticator 和QNetworkProxy 。
qint64 QAbstractSocket::readBufferSize() const
返回内部读取缓冲区的大小。这限制了在调用read()或readAll()之前,客户端可接收的数据量。
读取缓冲区大小为 0(默认值)表示缓冲区没有大小限制,从而确保不会丢失任何数据。
另请参阅 setReadBufferSize() 和read()。
[override virtual protected] qint64 QAbstractSocket::readData(char *data, qint64 maxSize)
重写了:QIODevice::readData (char *data, qint64 maxSize)。
[override virtual protected] qint64 QAbstractSocket::readLineData(char *data, qint64 maxlen)
重写了:QIODevice::readLineData(char *data, qint64 maxSize)。
[virtual] void QAbstractSocket::resume()
继续通过套接字传输数据。仅当套接字已被设置为在收到通知时暂停,且已收到通知后,才应使用此方法。目前唯一支持的通知是QSslSocket::sslErrors()。如果套接字未处于暂停状态而调用此方法,将导致未定义的行为。
另请参阅 pauseMode() 和setPauseMode()。
[protected] void QAbstractSocket::setLocalAddress(const QHostAddress &address)
将连接本地端的地址设置为address 。
您可以在QAbstractSocket 的子类中调用此函数,以在连接建立后更改localAddress() 函数的返回值。此功能通常用于代理连接中的虚拟连接设置。
请注意,此函数不会在建立连接之前(例如,QAbstractSocket::bind())绑定套接字的本地地址。
另请参阅 localAddress()、setLocalPort() 和setPeerAddress()。
[protected] void QAbstractSocket::setLocalPort(quint16 port)
将连接本地端的端口设置为port 。
您可以在QAbstractSocket 的子类中调用此函数,以在连接建立后修改localPort() 函数的返回值。此功能通常用于代理连接中的虚拟连接设置。
请注意,此函数不会在建立连接之前(例如,QAbstractSocket::bind()) 绑定套接字的本地端口。
另请参阅 localPort()、localAddress()、setLocalAddress() 和setPeerPort()。
void QAbstractSocket::setPauseMode(QAbstractSocket::PauseModes pauseMode)
控制在收到通知时是否暂停。pauseMode 参数指定了应暂停套接字的条件。 当前仅支持QSslSocket::sslErrors()这一种通知。若设置为PauseOnSslErrors ,套接字上的数据传输将被暂停,需通过调用resume()显式重新启用。默认情况下,此选项设置为PauseNever 。必须在连接到服务器之前调用此选项,否则将导致未定义行为。
[protected] void QAbstractSocket::setPeerAddress(const QHostAddress &address)
将连接远端的地址设置为address 。
您可以在QAbstractSocket 的子类中调用此函数,以在连接建立后修改peerAddress() 函数的返回值。此功能通常用于代理连接中的虚拟连接设置。
另请参阅 peerAddress()、setPeerPort() 和setLocalAddress()。
[protected] void QAbstractSocket::setPeerName(const QString &name)
将远程对等方的主机名设置为name 。
您可以在QAbstractSocket 的子类中调用此函数,以便在建立连接后更改peerName() 函数的返回值。此功能通常用于代理连接中的虚拟连接设置。
另请参阅 peerName()。
[protected] void QAbstractSocket::setPeerPort(quint16 port)
将连接远程端的端口设置为port 。
您可以在 `QAbstractSocket ` 的子类中调用此函数,以在建立连接后更改 `peerPort()` 函数的返回值。此功能通常用于代理连接中的虚拟连接设置。
另请参阅 peerPort()、setPeerAddress() 和setLocalPort()。
void QAbstractSocket::setProtocolTag(const QString &tag)
将此套接字的协议标签设置为tag 。
另请参阅 protocolTag()。
void QAbstractSocket::setProxy(const QNetworkProxy &networkProxy)
将此套接字的显式网络代理设置为networkProxy 。
若要禁用此套接字的代理功能,请使用QNetworkProxy::NoProxy 代理类型:
socket->setProxy(QNetworkProxy::NoProxy);代理的默认值为QNetworkProxy::DefaultProxy ,这意味着该套接字将使用应用程序设置:如果已通过QNetworkProxy::setApplicationProxy 设置了代理,则使用该代理;否则,如果已通过QNetworkProxyFactory::setApplicationProxyFactory 设置了工厂,则会以QNetworkProxyQuery::TcpSocket 类型查询该工厂。
另请参阅 proxy()、QNetworkProxy 和QNetworkProxyFactory::queryProxy()。
[virtual] void QAbstractSocket::setReadBufferSize(qint64 size)
将QAbstractSocket 的内部读取缓冲区大小设置为size 字节。
如果缓冲区大小被限制在某个值,QAbstractSocket 不会缓冲超过该大小数据。例外情况是,缓冲区大小为 0 时,表示读取缓冲区无限制,所有传入数据都会被缓冲。这是默认行为。
如果仅在特定时间点读取数据(例如在实时流媒体应用中),或者希望保护套接字免于接收过多数据(这最终可能导致应用程序内存不足),则此选项非常有用。
只有 `QTcpSocket ` 会使用 `QAbstractSocket` 的内部缓冲区;而 `QUdpSocket ` 则完全不使用任何缓冲,而是依赖操作系统提供的隐式缓冲。因此,在 `QUdpSocket ` 上调用此函数不会产生任何效果。
另请参阅 readBufferSize() 和read()。
[virtual] bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = ConnectedState, QIODeviceBase::OpenMode openMode = ReadWrite)
使用本机套接字描述符socketDescriptor 初始化抽象套接字QAbstractSocket 。如果socketDescriptor 被接受为有效的套接字描述符,则返回true ;否则返回false 。套接字将以openMode 指定的模式打开,并进入socketState 指定的套接字状态。读写缓冲区将被清空,并丢弃任何待处理的数据。
注意:无法使用同一个本机套接字描述符初始化两个抽象套接字。
另请参阅 socketDescriptor()。
[protected] void QAbstractSocket::setSocketError(QAbstractSocket::SocketError socketError)
将上次发生的错误类型设置为socketError 。
另请参阅 setSocketState() 和setErrorString()。
[virtual] void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
将给定的option 设置为value 中描述的值。
另请参阅 socketOption()。
[protected] void QAbstractSocket::setSocketState(QAbstractSocket::SocketState state)
将套接字的状态设置为state 。
另请参阅 state()。
[override virtual protected] qint64 QAbstractSocket::skipData(qint64 maxSize)
重实现了:QIODevice::skipData (qint64 maxSize)。
[virtual] qintptr QAbstractSocket::socketDescriptor() const
如果QAbstractSocket 对象的本地套接字描述符可用,则返回该描述符;否则返回-1。
如果该套接字正在使用QNetworkProxy ,则返回的描述符可能无法与本机套接字函数一起使用。
当 `QAbstractSocket ` 处于 `UnconnectedState` 状态时,该套接字描述符不可用。
另请参阅 setSocketDescriptor()。
[virtual] QVariant QAbstractSocket::socketOption(QAbstractSocket::SocketOption option)
返回option 选项的值。
另请参阅 setSocketOption()。
QAbstractSocket::SocketType QAbstractSocket::socketType() const
返回套接字类型(TCP、UDP 或其他)。
另请参阅 QTcpSocket 和QUdpSocket 。
QAbstractSocket::SocketState QAbstractSocket::state() const
返回套接字的状态。
另请参阅 error()。
[signal] void QAbstractSocket::stateChanged(QAbstractSocket::SocketState socketState)
每当QAbstractSocket 的状态发生变化时,都会触发此信号。socketState 参数表示新状态。
QAbstractSocket::SocketState 并非已注册的元类型,因此对于队列连接,您必须通过Q_DECLARE_METATYPE() 和qRegisterMetaType() 对其进行注册。
另请参阅 state() 以及《创建自定义 Qt 类型》。
[override virtual] bool QAbstractSocket::waitForBytesWritten(int msecs = 30000)
重写了:QIODevice::waitForBytesWritten(int msecs)。
该函数将阻塞,直到套接字上至少写入了一个字节且触发了bytesWritten()信号。该函数将在msecs 毫秒后超时;默认超时时间为30000毫秒。
如果触发了bytesWritten() 信号,该函数返回true ;否则返回false (表示发生错误或操作超时)。
注意:此 函数在 Windows 上可能会随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和bytesWritten() 信号。
另请参阅 waitForReadyRead()。
[virtual] bool QAbstractSocket::waitForConnected(int msecs = 30000)
等待套接字建立连接,最长等待时间为msecs 毫秒。如果已建立连接,该函数返回true ;否则返回false 。若返回false ,可调用error()来确定错误原因。
以下示例最多等待一秒钟以建立连接:
socket->connectToHost("imap", 143);
if(socket->waitForConnected(1000))
qDebug("Connected!");如果 msecs 的值为 -1,则该函数不会超时。
注意: 根据主机查找所需的时间,此函数的 等待时间可能比 `msecs` 稍长。
注意:多次 调用此函数不会累积等待时间。如果函数超时,连接进程将被中止。
注意:此 函数在 Windows 上可能会随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和connected() 信号。
另请参阅 connectToHost() 和connected()。
[virtual] bool QAbstractSocket::waitForDisconnected(int msecs = 30000)
等待套接字断开连接,最长等待msecs 毫秒。如果连接成功断开,该函数返回true ;否则返回false (如果操作超时、发生错误,或者该QAbstractSocket 已断开连接)。如果返回false ,可以调用error()来确定错误原因。
以下示例将等待最多一秒钟,直到连接关闭:
socket->disconnectFromHost();
if(socket->state()==QAbstractSocket::UnconnectedState
|| socket->waitForDisconnected(1000)) {
qDebug("Disconnected!");
}如果 msecs 的值为 -1,则该函数不会超时。
注意:该 函数在 Windows 系统上可能会随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和disconnected() 信号。
另请参阅 disconnectFromHost() 和close()。
[override virtual] bool QAbstractSocket::waitForReadyRead(int msecs = 30000)
重写自:QIODevice::waitForReadyRead(int msecs)。
该函数将阻塞,直到有新数据可供读取且已发出readyRead()信号为止。该函数将在msecs 毫秒后超时;默认超时时间为30000毫秒。
如果触发了readyRead() 信号且有新数据可供读取,该函数将返回true ;否则将返回false (表示发生错误或操作超时)。
注意:此 函数在 Windows 上可能会随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和readyRead() 信号。
另请参阅 waitForBytesWritten()。
[override virtual protected] qint64 QAbstractSocket::writeData(const char *data, qint64 size)
重新实现了:QIODevice::writeData(const char *data, qint64 maxSize)。
© 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.