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, …, PathMtuSocketOption } |
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 的应用程序接口统一了两种协议之间的大部分差异。例如,虽然 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
,则表示连接已关闭或发生错误。
使用阻塞套接字编程与使用非阻塞套接字编程截然不同。阻塞套接字不需要事件循环,因此代码通常比较简单。不过,在图形用户界面应用程序中,阻塞套接字只能在非图形用户界面线程中使用,以避免冻结用户界面。有关这两种方法的概述,请参阅fortuneclient和blockingfortuneclient示例。
注意: 我们不鼓励同时使用阻塞函数和信号。应使用两种可能性中的一种。
QAbstractSocket 可与QTextStream 和QDataStream 的流操作符(operator<<() 和 operator>>() )一起使用。但有一个问题需要注意:在尝试使用 operator>>() 读取数据之前,必须确保有足够的数据可用。
另请参阅 QNetworkAccessManager 和QTcpServer 。
成员类型文档
枚举 QAbstractSocket::BindFlag
flags QAbstractSocket::BindMode
该枚举描述了可用于修改QAbstractSocket::bind() 行为的不同标志。
常量 | 值 | 说明 |
---|---|---|
QAbstractSocket::ShareAddress | 0x1 | 允许其他服务绑定到相同的地址和端口。当多个进程通过监听同一地址和端口来分担单个服务的负载时,这一点非常有用(例如,一个网络服务器有多个预分叉监听器,可以大大提高响应时间)。不过,由于允许任何服务重新绑定,该选项需要考虑一定的安全因素。请注意,将此选项与 ReuseAddressHint 结合使用,还可以允许服务重新绑定现有的共享地址。在 Unix 上,这相当于 SO_REUSEADDR socket 选项。在 Windows 上,这是默认行为,因此该选项将被忽略。 |
QAbstractSocket::DontShareAddress | 0x2 | 只绑定地址和端口,不允许其他服务重新绑定。通过向QAbstractSocket::bind() 传递此选项,可以保证成功后,只有您的服务监听地址和端口。即使通过了 ReuseAddressHint,也不允许任何服务重新绑定。该选项比 ShareAddress 更安全,但在某些操作系统上,需要以管理员权限运行服务器。在 Unix 和 macOS 上,不共享是绑定地址和端口的默认行为,因此该选项会被忽略。在 Windows 系统中,该选项使用 SO_EXCLUSIVEADDRUSE socket 选项。 |
QAbstractSocket::ReuseAddressHint | 0x4 | 为QAbstractSocket 提供提示,即使地址和端口已被其他套接字绑定,也应尝试重新绑定服务。在 Windows 和 Unix 系统中,该选项等同于 SO_REUSEADDR socket 选项。 |
QAbstractSocket::DefaultForPlatform | 0x0 | 当前平台的默认选项。在 Unix 和 macOS 上,该选项等同于 (DontShareAddress + ReuseAddressHint),而在 Windows 上,该选项等同于 ShareAddress。 |
BindMode 类型是QFlags<BindFlag> 的类型定义。它存储 BindFlag 值的 OR 组合。
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().
枚举 QAbstractSocket::PauseMode
flags QAbstractSocket::PauseModes
该枚举描述了套接字何时应暂停继续数据传输的行为。目前唯一支持的通知是QSslSocket::sslErrors().
常量 | 值 | 描述 |
---|---|---|
QAbstractSocket::PauseNever | 0x0 | 不暂停套接字上的数据传输。这是默认值,与 Qt 4 的行为一致。 |
QAbstractSocket::PauseOnSslErrors | 0x1 | 收到 SSL 错误通知时暂停套接字上的数据传输。即QSslSocket::sslErrors(). |
PauseModes 类型是QFlags<PauseMode> 的类型定义。它存储了 PauseMode 值的 OR 组合。
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 选项并禁用 Nagle 算法。设为 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 socket 选项相对应。该选项不影响QIODevice 或QAbstractSocket 缓冲区(参见setReadBufferSize())。Qt 5.3 引入了该枚举值。 |
QAbstractSocket::PathMtuSocketOption | 7 | 读取 IP 栈当前已知的路径最大传输单元(PMTU)值(如果有)。某些 IP 栈还允许设置传输的 MTU。该枚举值在 Qt 5.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)
使用BindMode mode 绑定port 端口上的address 。
对于 UDP 套接字,绑定后,只要有 UDP 数据报到达指定的地址和端口,就会发出QUdpSocket::readyRead() 信号。因此,该函数在编写 UDP 服务器时非常有用。
对于 TCP 套接字,该函数可用于指定输出连接使用哪个接口,这在使用多个网络接口时非常有用。
默认情况下,套接字使用DefaultForPlatform BindMode 绑定。如果未指定端口,将随机选择一个端口。
成功时,函数返回true
,套接字进入BoundState ;否则返回false
。
bool QAbstractSocket::bind(quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
这是一个重载函数。
使用BindMode mode 绑定到QHostAddress:Any on portport 。
默认情况下,套接字使用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() 常量。
返回等待读取的传入字节数。
另请参阅 bytesToWrite() 和read()。
[override virtual]
qint64 QAbstractSocket::bytesToWrite() const
重实现:QIODevice::bytesToWrite() 常量。
返回等待写入的字节数。当控制返回事件循环或调用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 QAbstractSocket 仅在需要时才会进行查找。 采用本机字节顺序。port
另请参阅 state()、peerName()、peerAddress()、peerPort() 和waitForConnected()。
void QAbstractSocket::connectToHost(const QHostAddress &address, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite)
这是一个重载函数。
尝试与address (端口:port )建立连接。
[signal]
void QAbstractSocket::connected()
该信号在调用connectToHost() 并成功建立连接后发出。
注: 在某些操作系统上,调用connectToHost() 连接到 localhost 时,可能会直接发出 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 起,QAbstractSocket 可直接从connectToHost() 调用中发出 hostFound(),因为 DNS 结果可能已被缓存。
另请参阅 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)。
© 2025 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.