QAbstractSocket类
QAbstractSocket类提供了所有套接字类型共有的基本功能。更多信息...
头文件 | #include <QAbstractSocket> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
qmake | QT += network |
继承自 | QIODevice |
由以下类继承 |
- 所有成员列表,包括继承的成员
- QAbstractSocket是网络编程API的一部分。
注意:此类中所有函数都是重入的。
公共类型
枚举 | BindFlag { ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform } |
标记 | 绑定模式 |
枚举 | 网络层协议 { IPv4Protocol, IPv6Protocol, AnyIPProtocol, UnknownNetworkLayerProtocol } |
枚举 | 暂停模式 { PauseNever, PauseOnSslErrors } |
标记 | 暂停模式 |
枚举 | 套接字错误 { ConnectionRefusedError, RemoteHostClosedError, HostNotFoundError, SocketAccessError, SocketResourceError, ..., UnknownSocketError } |
枚举 | 套接字选项 { LowDelayOption, KeepAliveOption, MulticastTtlOption, MulticastLoopbackOption, TypeOfServiceOption, ..., PathMtuSocketOption } |
枚举 | 套接字状态 { UnconnectedState, HostLookupState, ConnectingState, ConnectedState, BoundState, ..., ListeningState } |
枚举 | 套接字类型 { 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) |
(since 6.2) bool | bind(QHostAddress::SpecialAddress addr, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform) |
bool | bind(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是无连接的,but connectToHost()为UDP套接字建立了一个虚拟连接,使得你可以基本上以相同的方式使用QAbstractSocket,而不论底层协议是什么。内部,QAbstractSocket会记住传递给connectToHost()的地址和端口,并且如read()和write()等功能使用这些值。
任何时间,QAbstractSocket都有一个状态(由state()返回)。初始状态是未连接状态。在调用connectToHost后,套接字首先进入主机查找状态。如果找到了主机,QAbstractSocket进入连接状态并发射hostFound()信号。当建立连接后,它进入连接状态并发射connected()。如果在任何阶段发生错误,将发射errorOccurred()。每当状态改变时,会发射stateChanged()。为了方便起见,isValid()在套接字可以读取和写入时返回true
,但请注意,在读取和写入之前,套接字的状态必须是连接状态。
通过调用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的流运算符(运算符<<和>>)一起使用。但需要注意一个问题:在尝试使用运算符>>()读取数据之前,必须确保有足够的数据可供读取。
另请参阅QNetworkAccessManager和QTcpServer。
成员类型文档
枚举 QAbstractSocket::BindFlag
标志 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。 |
The BindMode类型是QFlags<BindFlag>的typedef。它存储了BindFlag值的逻辑或组合。
枚举 QAbstractSocket::NetworkLayerProtocol
此枚举描述Qt中使用的网络层协议值。
常量 | 值 | 描述 |
---|---|---|
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(). |
The PauseModes类型是QFlags<PauseMode>的typedef。它存储了PauseMode值的逻辑或组合。
枚举 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套接字选项。此选项不会影响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。
枚举 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。
枚举 QAbstractSocket::SocketType
此枚举描述了传输层协议。
常量 | 值 | 描述 |
---|---|---|
QAbstractSocket::TcpSocket | 0 | TCP |
QAbstractSocket::UdpSocket | 1 | UDP |
QAbstractSocket::SctpSocket | 2 | SCTP |
QAbstractSocket::UnknownSocketType | -1 | 除TCP、UDP和SCTP之外 |
成员函数文档
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)
绑定到地址上的端口号端口号,使用绑定模式 模式。
对于UDP套接字,在绑定后,每当在网络指定的地址和端口号上接收到UDP数据包时,都会发出信号QUdpSocket::readyRead。因此,这个函数对编写UDP服务器非常有用。
对于TCP套接字,此函数可以用来指定要使用哪个接口进行出站连接,这对于有多个网络接口的情况很有用。
默认情况下,套接字使用DefaultForPlatform 绑定模式进行绑定。如果没有指定端口号,将会选择一个随机端口号。
如果成功,函数返回true
,套接字进入绑定状态;否则返回false
。
[自6.2以来]
bool QAbstractSocket::bind(QHostAddress::SpecialAddress addr, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
这是一个重载函数。
绑定到特殊地址addr上的端口号端口号,使用绑定模式 模式。
默认情况下,套接字使用DefaultForPlatform 绑定模式进行绑定。如果没有指定端口号,将会选择一个随机端口号。
此函数首次在Qt 6.2中引入。
bool QAbstractSocket::bind(quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
这是一个重载函数。
绑定到QHostAddress:Any上的端口号端口号,使用绑定模式 模式。
默认情况下,套接字使用DefaultForPlatform 绑定模式进行绑定。如果没有指定端口号,将会选择一个随机端口号。
[重写虚拟]
qint64 QAbstractSocket::bytesAvailable() const
重写了QIODevice::bytesAvailable() const。
返回等待读取的入站字节数。
另请参阅bytesToWrite()和read()。
[重写虚拟]
qint64 QAbstractSocket::bytesToWrite() const
重写了QIODevice::bytesToWrite() const。
返回等待写入的字节数。这些字节将在事件循环回来或调用flush()时写入。
另请参阅bytesAvailable()和flush。
[重写虚拟]
void QAbstractSocket::close()
重写了QIODevice::close。
关闭套接字的I/O设备,并调用disconnectFromHost()来关闭套接字的连接。
有关I/O设备关闭时发生的操作的描述,请参阅QIODevice::close。
另请参阅abort。
[虚拟]
void QAbstractSocket::connectToHost(const QString &主机名, quint16 端口号, QIODeviceBase::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol 协议 = AnyIPProtocol)
尝试连接到给定 主机名 和 端口号。可以通过 协议 参数指定要使用的网络协议(例如,IPv4 或 IPv6)。
套接字以给定的 openMode 打开,首先进入 HostLookupState 状态,然后进行 主机名 查找。如果查找成功,将发出 hostFound() 信号,并使 QAbstractSocket 进入 ConnectingState 状态。然后尝试连接到查找返回的地址或地址。最后,如果建立了连接,QAbstractSocket 将进入 ConnectedState 并发出 connected() 信号。
在任何时候,套接字都可以发出 errorOccurred() 信号,以表示发生错误。
主机名 可能是字符串形式的 IP 地址(例如,"43.195.83.32"),也可能是主机名(例如,"example.com")。QAbstractSocket 仅在有需要时进行查找。端口号 使用本地字节序。
另请参阅state(),peerName(),peerAddress(),peerPort() 以及 waitForConnected
void QAbstractSocket::connectToHost(const QHostAddress &地址, quint16 端口号, QIODeviceBase::OpenMode openMode = ReadWrite)
这是一个重载函数。
尝试连接到端口 端口号 的 地址。
[信号]
void QAbstractSocket::connected()
在调用 connectToHost() 并成功建立连接后,发出此信号。
注意:在某些操作系统中,对于 localhost 的连接,connectToHost() 调用可能直接发出 connected() 信号。
另请参阅connectToHost() 和 disconnected。
[虚拟]
void QAbstractSocket::disconnectFromHost()
尝试关闭套接字。如果有等待写入的数据,QAbstractSocket 将进入 ClosingState 并等待所有数据被写入。最终,它将进入 UnconnectedState 并发出 disconnected() 信号。
另请参阅connectToHost。
[信号]
void QAbstractSocket::disconnected()
当套接字断开连接时,发出此信号。
警告:如果您需要在不相连接的槽中删除此信号的 sender(),请使用 deleteLater() 函数。
另请参阅 connectToHost()、disconnectFromHost() 和 abort()。
QAbstractSocket::SocketError QAbstractSocket::error() const
返回上次发生的错误类型。
另请参阅 state() 和 errorString()。
[信号]
void QAbstractSocket::errorOccurred(QAbstractSocket::SocketError socketError)
此信号在发生错误后发出。参数 socketError 描述了发生的错误类型。
当此信号发出时,套接字可能不适合进行重连尝试。在这种情况下,应该从事件循环中进行重连尝试。例如,可以使用 0 作为超时的 QTimer::singleShot()。
QAbstractSocket::SocketError 不是一个已注册的元类型,因此对于队列连接,您必须使用 Q_DECLARE_METATYPE() 和 qRegisterMetaType() 进行注册。
另请参阅 error()、errorString() 和 创建自定义 Qt 类型。
bool QAbstractSocket::flush()
此函数将尽可能多的数据从内部写入缓冲区写入到底层网络套接字,而不阻塞。如果写入了数据,则此函数返回 true
;否则返回 false。
调用此函数如果需要 QAbstractSocket 立即开始发送缓冲数据。成功写入的字节数取决于操作系统。在大多数情况下,您不需要调用此函数,因为 QAbstractSocket 将在控制权回到事件循环后自动开始发送数据。在没有事件循环的情况下,请改用 waitForBytesWritten()。
另请参阅 write() 和 waitForBytesWritten()。
[信号]
void QAbstractSocket::hostFound()
在调用 connectToHost() 并成功查找主机后发出此信号。
注意:自 Qt 4.6.3 开始,QAbstractSocket 可能会从 connectToHost() 调用中直接发出 hostFound(),因为 DNS 结果可能已被缓存。
另请参阅 connected()。
[重写虚拟]
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)
当使用需要认证的代理时,可能会触发此信号。此时,可以将认证对象填充所需详细信息,以允许认证并继续连接。
注意:由于在信号返回时,如果认证器未填入新信息,连接将会失败,因此无法使用队列连接连接到此信号。
另请参阅: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()。
[保护]
void QAbstractSocket::setLocalPort(quint16 port)
设置连接的本地端端口为端口。
您可以在QAbstractSocket的子类中调用此函数来修改在建立连接后localPort()函数的返回值。该功能通常由代理连接用于虚拟连接设置。
请注意,在连接之前(例如,使用QAbstractSocket::bind())此函数不会绑定套接字的本地端口。
另请参见 localPort(),localAddress(),setLocalAddress()以及setPeerPort()。
void QAbstractSocket::setPauseMode(QAbstractSocket::PauseModes pauseMode)
控制是否在接收到通知时暂停。参数pauseMode指定套接字应该暂停的条件。当前唯一支持的通告是QSslSocket::sslErrors。如果设置为PauseOnSslErrors,则socket上的数据传输将暂停,需要通过调用resume显式启用。默认情况下,此选项设置为PauseNever。必须在连接到服务器之前调用此选项,否则会导致未定义行为。
[保护]
void QAbstractSocket::setPeerAddress(const QHostAddress &address)
将连接的远程端地址设置为地址。
您可以在QAbstractSocket的子类中调用此函数来修改在建立连接后peerAddress()函数的返回值。该功能通常由代理连接用于虚拟连接设置。
另请参见 peerAddress(),setPeerPort()以及setLocalAddress()。
[保护]
void QAbstractSocket::setPeerName(const QString &name)
将远程对端的主机名设置为名称。
您可以在QAbstractSocket的子类中调用此函数来修改在建立连接后peerName()函数的返回值。该功能通常由代理连接用于虚拟连接设置。
另请参见 peerName()。
[受保护]
void QAbstractSocket::setPeerPort(quint16 端口号)
将连接的远程端端口设置为端口号。
您可以在QAbstractSocket的子类中调用此函数,在建立连接后更改peerPort()函数的返回值。此功能通常用于代理连接以进行虚拟连接设置。
另请参阅 peerPort(),setPeerAddress()和setLocalPort()。
void QAbstractSocket::setProtocolTag(const QString &标签)
为此套接字设置协议标签为标签。
另请参阅 protocolTag()。
void QAbstractSocket::setProxy(const QNetworkProxy &网络代理)
为此套接字设置显式网络代理为网络代理。
要禁用此套接字使用代理,请使用QNetworkProxy::NoProxy代理类型
socket->setProxy(QNetworkProxy::NoProxy);
代理的默认值为QNetworkProxy::DefaultProxy,这意味着套接字将使用应用程序设置:如果使用QNetworkProxy::setApplicationProxy设置了代理,它将使用该代理;如果没有设置工厂,将与QNetworkProxyFactory::setApplicationProxyFactory设置的生产厂查询,类型为QNetworkProxyQuery::TcpSocket。
另请参阅 proxy(),QNetworkProxy和QNetworkProxyFactory::queryProxy()。
[虚函数]
void QAbstractSocket::setReadBufferSize(qint64 大小)
将QAbstractSocket内部读取缓冲区的大小设置为大小字节数。
如果缓冲区大小限制为特定大小,QAbstractSocket不会缓冲超过此大小的数据。例外情况下,缓冲区大小为0意味着读取缓冲区无限大,所有传入数据都会被缓冲。这是默认情况。
此选项对于仅在特定时间点读取数据(例如,在实时流应用程序中)或想要防止套接字接收过多数据,这些数据最终可能导致应用程序内存不足非常有用。
只有QTcpSocket使用QAbstractSocket的内部缓冲区;《QUdpSocket》不使用任何缓冲区,而是依赖于操作系统提供的隐式缓冲。正因为如此,在QUdpSocket上调用此函数没有任何效果。
另请参阅 readBufferSize()和read()。
[虚拟]
bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = ConnectedState, QIODeviceBase::OpenMode openMode = ReadWrite)
初始化使用本地套接字描述符 socketDescriptor 的 QAbstractSocket。如果 socketDescriptor 被接受为一个有效的套接字描述符,则返回 true
;否则返回 false
。套接字将以 openMode 指定的模式打开,并进入由 socketState 指定的套接字状态。清除读取和写入缓冲区,丢弃任何挂起数据。
注意:无法使用相同的本地套接字描述符初始化两个抽象套接字。
另请参阅:socketDescriptor()。
[保护]
void QAbstractSocket::setSocketError(QAbstractSocket::SocketError socketError)
设置最后一次发生的错误类型为 socketError。
另请参阅:setSocketState() 和 setErrorString).
[虚拟]
void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
将给定的 option 设置为 value 描述的值。
另请参阅:socketOption().
[保护]
void QAbstractSocket::setSocketState(QAbstractSocket::SocketState state)
将套接字的状态设置为 state。
另请参阅 state()。
[重写虚拟保护]
qint64 QAbstractSocket::skipData(qint64 maxSize)
重新实现: QIODevice::skipData(qint64 maxSize)。
[虚拟]
qintptr QAbstractSocket::socketDescriptor() const
如果可用,返回 QAbstractSocket 对象的本地套接字描述符;否则返回 -1。
如果套接字使用 QNetworkProxy,则返回的描述符可能无法与本地套接字函数一起使用。
QAbstractSocket 在 UnconnectedState 时不可访问套接字描述符。
另请参阅:setSocketDescriptor().
[虚拟]
QVariant QAbstractSocket::socketOption(QAbstractSocket::SocketOption option)
返回 option 选项的值。
另请参阅:setSocketOption().
QAbstractSocket::SocketType QAbstractSocket::socketType() const
返回套接字类型(TCP、UDP或其他)。
另请参阅 QTcpSocket和QUdpSocket。
QAbstractSocket::SocketState QAbstractSocket::state() const
返回套接字的状态。
另请参阅 error()。
[信号]
void QAbstractSocket::stateChanged(QAbstractSocket::SocketState socketState)
当QAbstractSocket的状态发生变化时,会发出此信号。参数socketState是新状态。
QAbstractSocket::SocketState 不是一个已注册的元类型,所以对于延迟连接,您必须使用Q_DECLARE_METATYPE() 和 qRegisterMetaType() 来注册它。
另请参阅 state() 和 创建自定义 Qt 类型。
[重写虚函数]
bool QAbstractSocket::waitForBytesWritten(int msecs = 30000)
重新实现了: QIODevice::waitForBytesWritten(int msecs)
此函数会阻塞,直到至少有一个字节已被写入套接字,并且发出了 bytesWritten() 信号。该函数将在 msecs 毫秒后超时;默认超时时间为30000毫秒。
如果发出了 bytesWritten() 信号,函数返回 true
;否则返回 false
(如果发生了错误或操作超时)。
注意: 此函数可能在 Windows 上随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和 bytesWritten() 信号。
另请参阅 waitForReadyRead。
[虚函数]
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。
[虚拟]
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。
[覆盖虚函数]
bool QAbstractSocket::waitForReadyRead( int msecs = 30000)
重实现: QIODevice::waitForReadyRead (int msecs).
此函数阻塞,直到有新数据可供读取并且已发出 readyRead () 信号。函数将在 msecs 毫秒后超时;默认超时时间为 30000 毫秒。
如果发出 readyRead () 信号且存在可读的新数据,则此函数返回 true
;否则返回 false
(如果发生错误或操作超时)。
注意: 此函数在 Windows 上可能会随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和 readyRead () 信号。
另请参阅 waitForBytesWritten ().
[覆盖虚保护]
qint64 QAbstractSocket::writeData(const char *data, qint64 size)
重实现: QIODevice::writeData (const char *data, qint64 maxSize).
© 2024 The Qt Company Ltd。在此内包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 许可的。Qt 和相应标志是芬兰和/或全球其他地区 The Qt Company Ltd. 的商标。所有其他商标均为各自所有者的财产。