计算机系统应用教程网站

网站首页 > 技术文章 正文

QT中QAbstractSocket、QTcpSocket、QTcpServer中文文档

btikc 2024-10-24 09:32:33 技术文章 8 ℃ 0 评论

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()。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表