网站首页 > 技术文章 正文
QAbstractSocket类
详细说明:
QAbstractSocket类提供所有套接字类型共有的基本功能。
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()。如果在任何阶段发生错误,都会发出error()。每当状态更改时,都会发出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将发出错误(QAbstractSocket::RemoteHostClosedError),在此期间套接字状态仍为ConnectedState,然后将发出offlineed()信号。
通过调用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
允许其他服务绑定到相同的地址和端口。 当多个进程通过侦听相同的地址和端口来共享单个服务的负载时(例如,具有多个预分支侦听器的Web服务器可以大大缩短响应时间),这很有用。 但是,由于允许任何服务重新绑定,因此此选项受某些安全考虑。 请注意,通过将此选项与ReuseAddressHint结合使用,您还将允许您的服务重新绑定现有的共享地址。 在Unix上,这等效于SO_REUSEADDR套接字选项。 在Windows上,这是默认行为,因此将忽略此选项。
QAbstractSocket::DontShareAddress
专门绑定地址和端口,以便不允许其他服务重新绑定。 通过将此选项传递给QAbstractSocket::bind(),可以确保成功时,您的服务是唯一侦听地址和端口的服务。 即使服务通过ReuseAddressHint,也不允许重新绑定服务。 此选项比ShareAddress提供更高的安全性,但是在某些操作系统上,它要求您以管理员权限运行服务器。 在Unix和macOS上,不共享是绑定地址和端口的默认行为,因此该选项将被忽略。 在Windows上,此选项使用SO_EXCLUSIVEADDRUSE套接字选项。
QAbstractSocket::ReuseAddressHint
向QAbstractSocket提示,即使地址和端口已被另一个套接字绑定,它也应尝试重新绑定服务。 在Windows和Unix上,这等效于SO_REUSEADDR套接字选项。
QAbstractSocket::DefaultForPlatform
当前平台的默认选项。 在Unix和macOS上,这等效于(DontShareAddress + ReuseAddressHint),在Windows上,它等效于ShareAddress。
这个枚举是在Qt 5.0中引入或修改的。
BindMode类型是QFlags <BindFlag>的typedef。 它存储BindFlag值的OR组合。
enum QAbstractSocket::NetworkLayerProtocol
该枚举描述了Qt中使用的网络层协议值。
QAbstractSocket::IPv4ProtocolIPv4
QAbstractSocket::IPv6ProtocolIPv6
QAbstractSocket::AnyIPProtocolIPv4或IPv6
QAbstractSocket::UnknownNetworkLayerProtocol除了IPv4和IPv6
另请参见QHostAddress::protocol()。
enum QAbstractSocket::PauseMode
flags QAbstractSocket::PauseModes
该枚举描述了套接字应在继续进行数据传输时停止的行为。 当前支持的唯一通知是QSslSocket::sslErrors()。
QAbstractSocket::PauseNever
不要暂停套接字上的数据传输。 这是默认设置,与Qt 4的行为匹配。
QAbstractSocket::PauseOnSslErrors
收到SSL错误通知后,暂停套接字上的数据传输。 QSslSocket::sslErrors()。
这个枚举是在Qt 5.0中引入或修改的。
PauseModes类型是QFlags <PauseMode>的typedef。 它存储PauseMode值的OR组合。
enum QAbstractSocket::SocketError
该枚举描述了可能发生的套接字错误。
QAbstractSocket::ConnectionRefusedError
该连接被对等方拒绝(或超时)。
QAbstractSocket::RemoteHostClosedError
远程主机关闭了连接。 请注意,客户端套接字(即此套接字)将在发送远程关闭通知后关闭。
QAbstractSocket::HostNotFoundError
找不到主机地址。
QAbstractSocket::SocketAccessError
套接字操作失败,因为该应用程序缺少必需的特权。
QAbstractSocket::SocketResourceError
本地系统资源不足(例如套接字过多)。
QAbstractSocket::SocketTimeoutError
套接字操作超时。
QAbstractSocket::DatagramTooLargeError
数据报大于操作系统的限制(可以低至8192字节)。
QAbstractSocket::NetworkError
网络发生错误(例如,网络电缆意外插入)。
QAbstractSocket::AddressInUseError
指定给QAbstractSocket::bind()的地址已经在使用中,并且被设置为互斥的。
QAbstractSocket::SocketAddressNotAvailableError
QAbstractSocket::bind()指定的地址不属于主机。
QAbstractSocket::UnsupportedSocketOperationError
本地操作系统不支持请求的套接字操作(例如,缺少IPv6支持)。
QAbstractSocket::ProxyAuthenticationRequiredError
套接字正在使用代理,并且代理需要身份验证。
QAbstractSocket::SslHandshakeFailedError
SSL/TLS握手失败,因此连接已关闭(仅在QSslSocket中使用)
QAbstractSocket::UnfinishedSocketOperationError
仅由QAbstractSocketEngine使用,上一次尝试的操作尚未完成(仍在后台进行)。
QAbstractSocket::ProxyConnectionRefusedError
无法连接到代理服务器,因为与该服务器的连接被拒绝
QAbstractSocket::ProxyConnectionClosedError
与代理服务器的连接意外关闭(在建立与最终对等方的连接之前)
QAbstractSocket::ProxyConnectionTimeoutError
与代理服务器的连接超时或代理服务器在身份验证阶段停止响应。
QAbstractSocket::ProxyNotFoundError
找不到用setProxy()(或应用程序代理)设置的代理地址。
QAbstractSocket::ProxyProtocolError
与代理服务器的连接协商失败,因为无法理解来自代理服务器的响应。
QAbstractSocket::OperationError
套接字处于不允许状态时尝试执行操作。
QAbstractSocket::SslInternalError
使用的SSL库报告内部错误。 这可能是由于库安装错误或配置错误造成的。
QAbstractSocket::SslInvalidUserDataError
提供了无效的数据(证书,密钥,密码等),其使用导致SSL库中的错误。
QAbstractSocket::TemporaryError
发生临时错误(例如,操作会阻塞,而套接字未阻塞)。
QAbstractSocket::UnknownSocketError
发生无法识别的错误。
另请参见QAbstractSocket::error()。
enum QAbstractSocket::SocketOption
该枚举表示可以在套接字上设置的选项。 如果需要,可以在从套接字接收到connected()信号之后,或者从QTcpServer接收到新的套接字之后,对它们进行设置。
QAbstractSocket::LowDelayOption
尝试优化套接字以降低延迟。 对于QTcpSocket,这将设置TCP_NODELAY选项并禁用Nagle的算法。 将此设置为1启用。
QAbstractSocket::KeepAliveOption
将此设置为1以启用SO_KEEPALIVE套接字选项
QAbstractSocket::MulticastTtlOption
将此设置为整数值可设置IP_MULTICAST_TTL(对于多播数据报为TTL)套接字选项。
QAbstractSocket::MulticastLoopbackOption
将此设置为1以启用IP_MULTICAST_LOOP(多播环回)套接字选项。
QAbstractSocket::TypeOfServiceOption
Windows不支持此选项。 这映射到IP_TOS套接字选项。 有关可能的值,请参见下表。
QAbstractSocket::SendBufferSizeSocketOption
在操作系统级别设置套接字发送缓冲区的大小(以字节为单位)。 这映射到SO_SNDBUF套接字选项。 该选项不会影响QIODevice或QAbstractSocket缓冲区。 这个枚举值已在Qt 5.3中引入。
QAbstractSocket::ReceiveBufferSizeSocketOption
在OS级别设置套接字接收缓冲区的大小(以字节为单位)。 这映射到SO_RCVBUF套接字选项。 此选项不会影响QIODevice或QAbstractSocket缓冲区(请参见setReadBufferSize())。 这个枚举值已在Qt 5.3中引入。
QAbstractSocket::PathMtuSocketOption
检索IP堆栈当前已知的路径最大传输单位(PMTU)值(如果有)。 一些IP堆栈还允许设置MTU进行传输。 这个枚举值是在Qt 5.11中引入的。
TypeOfServiceOption的可能值为:
224Network control
192Internetwork control
160CRITIC/ECP
128Flash override
96Flash
64Immediate
32Priority
0Routine
这个枚举是在Qt 4.6中引入或修改的。
另请参见QAbstractSocket::setSocketOption()和QAbstractSocket::socketOption()。
enum QAbstractSocket::SocketState
该枚举描述了套接字可以处于的不同状态。
QAbstractSocket::UnconnectedState
套接字未连接。
QAbstractSocket::HostLookupState
套接字正在执行主机名查找。
QAbstractSocket::ConnectingState
套接字已开始建立连接。
QAbstractSocket::ConnectedState
建立连接。
QAbstractSocket::BoundState
套接字绑定到一个地址和端口。
QAbstractSocket::ClosingState
套接字即将关闭(数据可能仍在等待写入)。
QAbstractSocket::ListeningState
仅限内部使用。
另请参见QAbstractSocket::state()。
enum QAbstractSocket::SocketType
该枚举描述了传输层协议。
QAbstractSocket::TcpSocketTCP
QAbstractSocket::UnsupportedSocketOperationError UDP
QAbstractSocket::SctpSocket SCTP
QAbstractSocket::UnknownSocketType 除了TCP,UDP和SCTP
另请参见QAbstractSocket::socketType()。
QAbstractSocket::QAbstractSocket(QAbstractSocket::SocketType socketType, QObject *parent)
创建类型为socketType的新抽象套接字。
另请参见socketType(),QTcpSocket和QUdpSocket。
[virtual] QAbstractSocket::~QAbstractSocket()
销毁套接字。
void QAbstractSocket::abort()
中止当前连接并重置套接字。 与disconnectFromHost()不同,此函数立即关闭套接字,并丢弃写缓冲区中的所有未处理数据。
另请参见disconnectFromHost()和close()。
[override virtual] bool QAbstractSocket::atEnd() const
从QIODevice::atEnd()重新实现。
如果当前没有更多数据可读取,则返回true;否则返回false。
在循环中从套接字读取数据时,最常使用此功能。 例如:
// This slot is connected to QAbstractSocket::readyRead()
void SocketClass::readyReadSlot()
{
while (!socket.atEnd()) {
QByteArray data = socket.read(100);
....
}
}
另请参见bytesAvailable()和readyRead()。
bool QAbstractSocket::bind(const QHostAddress &address, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
使用BindMode模式绑定到端口port上的地址。
对于UDP套接字,在绑定后,只要UDP数据报到达指定的地址和端口,就会发出信号QUdpSocket::readyRead()。 因此,此功能对于编写UDP服务器很有用。
对于TCP套接字,此功能可用于指定将哪个接口用于传出连接,这在多个网络接口的情况下很有用。
默认情况下,使用DefaultForPlatform BindMode绑定套接字。 如果未指定端口,则选择一个随机端口。
成功时,该函数返回true,并且套接字进入BoundState;否则返回false。
此功能是在Qt 5.0中引入的。
bool QAbstractSocket::bind(quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
这是一个重载函数。
使用BindMode模式绑定到QHostAddress:Any在端口port上。
默认情况下,使用DefaultForPlatform BindMode绑定套接字。 如果未指定端口,则选择一个随机端口。
此功能是在Qt 5.0中引入的。
[override virtual] qint64 QAbstractSocket::bytesAvailable() const
从QIODevice::bytesAvailable()重新实现。
返回等待读取的传入字节数。
另请参见bytesToWrite()和read()。
[override virtual] qint64 QAbstractSocket::bytesToWrite() const
从QIODevice::bytesToWrite()重写实现。
返回等待写入的字节数。 当控制者返回事件循环或调用flush()时,将写入字节。
另请参见bytesAvailable()和flush()。
[override virtual] bool QAbstractSocket::canReadLine() const
从QIODevice::canReadLine()重新实现。
如果可以从套接字读取一行数据,则返回true;否则返回false。
另请参见readLine()。
[override virtual] void QAbstractSocket::close()
从QIODevice::close()重新实现。
关闭套接字的I/O设备,并调用DisconnectFromHost()关闭套接字的连接。
有关关闭I/O设备时发生的操作的说明,请参见QIODevice::close()。
另请参见abort()。
[virtual] void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, QIODevice::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
尝试在给定端口上建立与hostName的连接。 协议参数可用于指定要使用的网络协议(例如IPv4或IPv6)。
套接字在给定的openMode中打开,然后首先输入HostLookupState,然后执行hostName的主机名查找。 如果查找成功,将发出hostFound(),并且QAbstractSocket进入ConnectingState。 然后,它尝试连接到查找返回的一个或多个地址。 最后,如果建立了连接,则QAbstractSocket进入ConnectedState并发出connectd()。
在任何时候,套接字都可以发出error()来表示发生了错误。
hostName可以是字符串形式的IP地址(例如"43.195.83.32"),也可以是主机名(例如"example.com")。 QAbstractSocket将仅在需要时进行查找。 端口按本机字节顺序。
另请参见state(),peerName(),peerAddress(),peerPort()和waitForConnected()。
[virtual] void QAbstractSocket::connectToHost(const QHostAddress &address, quint16 port, QIODevice::OpenMode openMode = ReadWrite)
这是一个重载函数。
尝试在端口port上连接地址address。
[signal] void QAbstractSocket::connected()
调用connectToHost()并成功建立连接后,将发出此信号。
注意:在某些操作系统上,connect()信号可能直接从connectToHost()调用发出,以连接到本地主机。
另请参见connectToHost()和connected()。
[virtual] void QAbstractSocket::disconnectFromHost()
尝试关闭套接字。 如果有等待写入的未处理数据,QAbstractSocket将进入ClosingState并等待,直到所有数据都被写入为止。 最终,它将进入UnconnectedState并发出offlineed()信号。
另请参见connectToHost()。
[signal] void QAbstractSocket::disconnected()
当套接字断开连接时,将发出此信号。
警告:如果需要在与其连接的槽中删除此信号的sender(),请使用deleteLater()函数。
另请参见connectToHost(),disconnectFromHost()和abort()。
QAbstractSocket::SocketError QAbstractSocket::error() const
返回上一次发生的错误的类型。
另请参见state()和errorString()。
[signal] void QAbstractSocket::error(QAbstractSocket::SocketError socketError)
发生错误后发出此信号。 socketError参数描述了发生的错误的类型。
发出此信号时,套接字可能未准备好进行重新连接。 在这种情况下,应尝试从事件循环中进行重新连接。 例如,使用QTimer::singleShot()以0作为超时。
QAbstractSocket::SocketError不是注册的元类型,因此对于排队连接,您将必须使用Q_DECLARE_METATYPE()和qRegisterMetaType()注册它。
注意:此类中重载了error信号。 要使用函数指针语法连接到此信号,Qt提供了一个方便的帮助程序来获取功能指针,如本示例所示:
connect(abstractSocket,
QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
[=](QAbstractSocket::SocketError socketError){ /* ... */ });
另请参见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()重新实现。
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
返回此套接字的暂停模式。
此功能是在Qt 5.0中引入的。
另请参见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()。
QNetworkProxy QAbstractSocket::proxy() const
返回此套接字的网络代理。 默认情况下使用QNetworkProxy::DefaultProxy,这意味着此套接字将查询应用程序的默认代理设置。
此功能在Qt 4.1中引入。
另请参见setProxy(),QNetworkProxy和QNetworkProxyFactory。
[signal] void QAbstractSocket::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)
当使用需要身份验证的代理时,可以发出此信号。 然后,可以使用所需的详细信息填充身份验证器对象,以允许进行身份验证并继续连接。
注意:不能使用QueuedConnection连接到该信号,因为如果信号返回时未使用新信息填充验证者,则连接将失败。
此功能在Qt 4.3中引入。
另请参见QAuthenticator和QNetworkProxy。
qint64 QAbstractSocket::readBufferSize() const
返回内部读取缓冲区的大小。 这限制了客户端在调用read()或readAll()之前可以接收的数据量。
读取缓冲区大小为0(默认值)意味着缓冲区没有大小限制,从而确保没有数据丢失。
另请参见setReadBufferSize()和read()。
[override virtual protected] qint64 QAbstractSocket::readData(char *data, qint64 maxSize)
从QIODevice::readData()重写实现。
[override virtual protected] qint64 QAbstractSocket::readLineData(char *data, qint64 maxlen)
从QIODevice::readLineData()重写实现。
[virtual] void QAbstractSocket::resume()
继续在套接字上进行数据传输。 仅当将套接字设置为在收到通知时暂停并收到通知后,才应使用此方法。 当前支持的唯一通知是QSslSocket::sslErrors()。 如果套接字未暂停,则调用此方法将导致未定义的行为。
此功能是在Qt 5.0中引入的。
另请参见pauseMode()和setPauseMode()。
[protected] void QAbstractSocket::setLocalAddress(const QHostAddress &address)
将连接本地的地址设置为address。
建立连接后,可以在QAbstractSocket的子类中调用此函数以更改localAddress()函数的返回值。 代理连接通常使用此功能进行虚拟连接设置。
请注意,此函数不会在连接之前绑定套接字的本地地址(例如QAbstractSocket::bind())。
此功能在Qt 4.1中引入。
另请参见localAddress(),setLocalPort()和setPeerAddress()。
[protected] void QAbstractSocket::setLocalPort(quint16 port)
将连接本地的端口设置为port。
建立连接后,可以在QAbstractSocket的子类中调用此函数以更改localPort()函数的返回值。 代理连接通常使用此功能进行虚拟连接设置。
请注意,此功能不会在连接之前绑定套接字的本地端口(例如QAbstractSocket::bind())。
此功能在Qt 4.1中引入。
另请参见localPort(),localAddress(),setLocalAddress()和setPeerPort()。
void QAbstractSocket::setPauseMode(QAbstractSocket::PauseModes pauseMode)
控制是否在收到通知时暂停。 pauseMode参数指定套接字应在其中暂停的条件。 当前支持的唯一通知是QSslSocket::sslErrors()。 如果设置为PauseOnSslErrors,套接字上的数据传输将被暂停,并且需要通过调用resume()再次显式启用。 默认情况下,此选项设置为PauseNever。 必须先调用此选项,然后再连接到服务器,否则将导致未定义的行为。
此功能是在Qt 5.0中引入的。
另请参见pauseMode()和resume()。
[protected] void QAbstractSocket::setPeerAddress(const QHostAddress &address)
将连接的远程端的地址设置为address。
建立连接后,可以在QAbstractSocket的子类中调用此函数以更改peerAddress()函数的返回值。 代理连接通常使用此功能进行虚拟连接设置。
此功能在Qt 4.1中引入。
另请参见peerAddress(),setPeerPort()和setLocalAddress()。
[protected] void QAbstractSocket::setPeerName(const QString &name)
将远程对等方的主机名设置为name。
建立连接后,可以在QAbstractSocket的子类中调用此函数以更改peerName()函数的返回值。 代理连接通常使用此功能进行虚拟连接设置。
此功能在Qt 4.1中引入。
另请参见peerName()。
[protected] void QAbstractSocket::setPeerPort(quint16 port)
将连接的远程端的端口设置为port。
建立连接后,可以在QAbstractSocket的子类中调用此函数以更改peerPort()函数的返回值。 代理连接通常使用此功能进行虚拟连接设置。
此功能在Qt 4.1中引入。
另请参见peerPort(),setPeerAddress()和setLocalPort()。
void QAbstractSocket::setProxy(const QNetworkProxy &networkProxy)
将此套接字的显式网络代理设置为networkProxy。
要禁用对此套接字使用代理,请使用QNetworkProxy::NoProxy代理类型:
socket->setProxy(QNetworkProxy::NoProxy);
代理的默认值为QNetworkProxy:;DefaultProxy,这意味着套接字将使用应用程序设置:如果使用QNetworkProxy::setApplicationProxy设置了代理,它将使用该设置。 否则,如果使用QNetworkProxyFactory::setApplicationProxyFactory设置了工厂,它将使用QNetworkProxyQuery::TcpSocket类型查询该工厂。
此功能在Qt 4.1中引入。
另请参见proxy(),QNetworkProxy和QNetworkProxyFactory::queryProxy()。
[virtual] void QAbstractSocket::setReadBufferSize(qint64 size)
将QAbstractSocket内部读取缓冲区的大小设置为大小字节。
如果将缓冲区大小限制为一定大小,则QAbstractSocket缓冲区将不会超过此大小的数据。 缓冲区大小为0意味着读取缓冲区不受限制,并且所有传入数据都被缓冲。 这是默认值。
如果您仅在特定的时间点(例如,在实时流应用程序中)读取数据,或者要保护套接字避免接收过多的数据(可能最终导致应用程序用尽),则此选项很有用。
只有QTcpSocket使用QAbstractSocket的内部缓冲区。 QUdpSocket根本不使用任何缓冲,而是依赖于操作系统提供的隐式缓冲。 因此,在QUdpSocket上调用此函数无效。
另请参见readBufferSize()和read()。
[virtual] bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = ConnectedState, QIODevice::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描述的值。
注意:在Windows上运行时,必须在连接套接字之前设置QAbstractSocket::KeepAliveOption。
此功能在Qt 4.6中引入。
另请参见socketOption()。
[protected] void QAbstractSocket::setSocketState(QAbstractSocket::SocketState state)
将套接字的状态设置为state。
另请参见state()。
[virtual] qintptr QAbstractSocket::socketDescriptor() const
返回QAbstractSocket对象的本机套接字描述符(如果可用);否则返回-1。
如果套接字使用的是QNetworkProxy,则返回的描述符可能无法与本机套接字函数一起使用。
当QAbstractSocket处于UnconnectedState时,套接字描述符不可用。
另请参见setSocketDescriptor()。
[virtual] QVariant QAbstractSocket::socketOption(QAbstractSocket::SocketOption option)
返回选项option的值。
此功能在Qt 4.6中引入。
另请参见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()和Creating Custom Qt Types。
[override virtual] bool QAbstractSocket::waitForBytesWritten(int msecs = 30000)
从QIODevice::waitForBytesWritten()重写实现。
该函数将阻塞,直到在套接字上至少写入了一个字节并且已发出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。 如果返回false,则可以调用error()以确定错误原因。
下面的示例最多等待一秒钟,以关闭连接:
socket->disconnectFromHost();
if (socket->state() == QAbstractSocket::UnconnectedState ||
socket->waitForDisconnected(1000))
qDebug("Disconnected!");
如果msecs为-1,则此功能不会超时。
注意:此功能在Windows上可能会随机失败。 如果您的软件将在Windows上运行,请考虑使用事件循环和offlineed()信号。
另请参见disconnectFromHost()和close()。
[override virtual] bool QAbstractSocket::waitForReadyRead(int msecs = 30000)
从QIODevice::waitForReadyRead()重写实现。
该功能将阻塞,直到可以读取新数据并且发出readyRead()信号为止。 该函数将在msecs毫秒后超时; 默认超时为30000毫秒。
如果发出readyRead()信号并且有新的数据可读取,则该函数返回true。 否则返回false(如果发生错误或操作超时)。
注意:此功能在Windows上可能会随机失败。 如果您的软件将在Windows上运行,请考虑使用事件循环和readyRead()信号。
另请参见waitForBytesWritten()。
[override virtual protected] qint64 QAbstractSocket::writeData(const char *data, qint64 size)
从QIODevice::writeData()重写实现。
QTcpSocket类
详细说明:
QTcpSocket类提供一个TCP套接字。
TCP(传输控制协议)是一种可靠的,面向流,面向连接的传输协议。 它特别适合连续数据传输。
QTcpSocket是QAbstractSocket的便利子类,它使您可以建立TCP连接并传输数据流。 有关详细信息,请参见QAbstractSocket文档。
注意:无法在QIODevice::Unbuffered模式下打开TCP套接字。
另请参见QTcpServer,QudpSocket,QNetworkAccessManager,Fortune Server示例,Fortune Client示例,Threaded Fortune Server示例,Blocking Fortune Client示例,Loopback示例和Torrent示例。
成员函数说明:
QTcpSocket::QTcpSocket(QObject * parent = nullptr)
创建一个状态为UnconnectedState的QTcpSocket对象。
另请参见socketType()。
QTcpSocket::~QTcpSocket()
销毁socket,必要时关闭连接。
另请参见close()。
QTcpServer类
详细说明:
QTcpServer类提供了一个基于TCP的服务器。
此类可以接受传入的TCP连接。您可以指定端口或让QTcpServer自动选择一个。您可以侦听特定地址或所有机器的地址。
调用listen()以使服务器侦听传入的连接。每次客户端连接到服务器时,都会发出newConnection()信号。
调用nextPendingConnection()以接受挂起的连接作为已连接的QTcpSocket。该函数返回指向QAbstractSocket:: ConnectedState中的QTcpSocket的指针,您可以使用该指针与客户端进行通信。
如果发生错误,则serverError()返回错误的类型,并且可以调用errorString()以获得对所发生事件的易于理解的描述。
侦听连接时,服务器正在侦听的地址和端口可用作serverAddress()和serverPort()。
调用close()使QTcpServer停止侦听传入的连接。
尽管QTcpServer主要设计用于事件循环,但也可以不使用事件循环。在这种情况下,您必须使用waitForNewConnection(),该阻塞将一直阻塞,直到连接可用或超时到期为止。
另请参见QTcpSocket,Fortune Server示例,Threaded Fortune Server示例,Loopback示例和Torrent示例。
成员函数说明:
QTcpServer::QTcpServer(QObject * parent = nullptr)
构造一个QTcpServer对象。
另请参见listen()和setSocketDescriptor()。
[virtual] QTcpServer::~QTcpServer()
销毁QTcpServer对象。 如果服务器正在侦听连接,则套接字将自动关闭。
在删除服务器之前,仍连接的所有客户端QTcpSockets必须断开连接或重新连接。
另请参见close()。
[signal] void QTcpServer::acceptError(QAbstractSocket::SocketError socketError)
接受新连接导致错误时,将发出此信号。 socketError参数描述了发生的错误的类型。
此功能是在Qt 5.0中引入的。
另请参见pauseAccepting()和resumeAccepting()。
[protected] void QTcpServer::addPendingConnection(QTcpSocket * socket)
QTcpServer::incomingConnection()调用此函数以将套接字添加到挂起的连接的列表中。
注意:如果您不想破坏“挂起的连接”机制,请不要忘记从重新实现的entryConnection()中调用此成员。
此功能在Qt 4.7中引入。
另请参见incomingConnection()。
void QTcpServer::close()
关闭服务器。 服务器将不再侦听传入的连接。
另请参见listen()。
QString QTcpServer::errorString() const
返回最近发生的错误的可读描述。
另请参见serverError()。
[virtual] bool QTcpServer::hasPendingConnections() const
如果服务器具有挂起的连接,则返回true;否则返回false。
另请参见nextPendingConnection()和setMaxPendingConnections()。
[virtual protected] void QTcpServer::incomingConnection(qintptr socketDescriptor)
当新连接可用时,此虚拟函数将由QTcpServer调用。 socketDescriptor参数是接受的连接的本机套接字描述符。
基本实现是创建一个QTcpSocket,设置套接字描述符,然后将QTcpSocket存储在未连接的内部列表中。最后,将发出newConnection()。
重新实现此功能,以在连接可用时更改服务器的行为。
如果此服务器使用的是QNetworkProxy,则socketDescriptor可能无法与本机套接字函数一起使用,而应仅与QTcpSocket::setSocketDescriptor()一起使用。
注意:如果在重新实现此方法时创建了另一个套接字,则需要通过调用addPendingConnection()将其添加到“挂起连接”机制中。
注意:如果要在另一个线程中将传入连接作为新的QTcpSocket对象处理,则必须将socketDescriptor传递给另一个线程,然后在该线程中创建QTcpSocket对象,并使用其setSocketDescriptor()方法。
另请参见newConnection(),nextPendingConnection()和addPendingConnection()。
bool QTcpServer::isListening() const
如果服务器当前正在侦听传入的连接,则返回true;否则返回false。
另请参见listen()。
bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
告诉服务器在地址address和端口port上侦听传入的连接。 如果port为0,则自动选择一个端口。 如果address为QHostAddress::Any,则服务器将在所有网络接口上侦听。
成功返回true; 否则返回false。
另请参见isListening()。
int QTcpServer::maxPendingConnections() const
返回待处理的已接受连接的最大数目。 默认值为30。
另请参见setMaxPendingConnections()和hasPendingConnections()。
[signal] void QTcpServer::newConnection()
每当有新的连接可用时,都会发出此信号。
另请参见hasPendingConnections()和nextPendingConnection()。
[virtual] QTcpSocket *QTcpServer::nextPendingConnection()
返回下一个挂起的连接,作为连接的QTcpSocket对象。
套接字是作为服务器的子级创建的,这意味着销毁QTcpServer对象时会自动删除该套接字。 在完成处理后,还是要明确删除该对象,以避免浪费内存,这仍然是一个好主意。
如果在没有挂起的连接时调用此函数,则返回0。
注意:返回的QTcpSocket对象不能在另一个线程中使用。 如果要使用来自另一个线程的传入连接,则需要重写incomingConnection()。
另请参见hasPendingConnections()。
void QTcpServer::pauseAccepting()
暂停接受新的连接。 排队的连接将保留在队列中。
此功能是在Qt 5.0中引入的。
另请参见resumeAccepting()。
QNetworkProxy QTcpServer::proxy() const
返回此套接字的网络代理。 默认情况下,使用QNetworkProxy::DefaultProxy。
此功能在Qt 4.1中引入。
另请参见setProxy()和QNetworkProxy。
void QTcpServer::resumeAccepting()
恢复接受新连接。
此功能是在Qt 5.0中引入的。
另请参见pauseAccepting()。
QHostAddress QTcpServer::serverAddress() const
如果服务器正在侦听连接,则返回服务器的地址。 否则返回QHostAddress::Null。
另请参见serverPort()和listen()。
QAbstractSocket::SocketError QTcpServer::serverError() const
返回最后发生的错误的错误代码。
另请参见errorString()。
quint16 QTcpServer::serverPort() const
如果服务器正在侦听连接,则返回服务器的端口。 否则返回0。
另请参见serverAddress()和listen()。
void QTcpServer::setMaxPendingConnections(int numConnections)
将待处理的接受连接的最大数量设置为numConnections。 在调用nextPendingConnection()之前,QTcpServer最多接受numConnections个传入连接。 默认情况下,该限制为30个挂起的连接。
服务器达到其最大挂起连接数后,客户端仍然可以连接(即QTcpSocket仍可以发出connectd()信号)。 QTcpServer将停止接受新连接,但是操作系统仍可以将它们保持在队列中。
另请参见maxPendingConnections()和hasPendingConnections()。
void QTcpServer::setProxy(const QNetworkProxy &networkProxy)
将此套接字的显式网络代理设置为networkProxy。
要禁用对此套接字使用代理,请使用QNetworkProxy::NoProxy代理类型:
server->setProxy(QNetworkProxy::NoProxy);
此功能在Qt 4.1中引入。
另请参见proxy()和QNetworkProxy。
bool QTcpServer::setSocketDescriptor(qintptr socketDescriptor)
设置此服务器在侦听与socketDescriptor的传入连接时应使用的套接字描述符。 如果成功设置了套接字,则返回true;否则返回false。
假定套接字处于侦听状态。
另请参见socketDescriptor()和isListening()。
qintptr QTcpServer::socketDescriptor() const
返回服务器用于侦听传入指令的本机套接字描述符;如果服务器未侦听,则返回-1。
如果服务器使用的是QNetworkProxy,则返回的描述符可能无法与本机套接字函数一起使用。
另请参见setSocketDescriptor()和isListening()。
bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = nullptr)
等待最多msec(毫秒)或直到传入连接可用。 如果连接可用,则返回true;否则返回false。 如果操作超时且timedOut不为0,则*timedOut将设置为true。
这是一个阻塞函数调用。 在单线程GUI应用程序中不建议使用它,因为整个应用程序将停止响应,直到函数返回为止。 当没有事件循环可用时,waitForNewConnection()最有用。
非阻塞替代方法是连接到newConnection()信号。
如果毫秒为-1,则此功能不会超时。
另请参见hasPendingConnections()和nextPendingConnection()。
猜你喜欢
- 2024-10-24 QT(17)- QNetworkAccessManager qnetworkinterface.allinterfaces
- 2024-10-24 Qt多线程的三种方法QThread qt多线程直接处理数据
- 2024-10-24 从零开始学Qt(86):TCP服务器端程序设计
- 2024-10-24 Qt Core学习日记——第九天QObjectData
- 2024-10-24 Qt智能指针--QSharedPointer qt智能指针.get和.data函数后计数会加吗
- 2024-10-24 QT(11)- QThread qt ui thread work thread
- 2024-10-24 Qt QVariant的用法 qt基本语法
- 2024-10-24 Qt5中QOverload的用法 qt5coredll
- 2024-10-24 Qt多线程编程之QThread qt中的多线程
- 2024-10-24 Qt QModbusReply类 qty是什么单位的缩写
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)