Roson的Qt之旅#92 QAbstractSocket(Qt套接字基类)

158 篇文章 29 订阅

1.概述

QAbstractSocket类提供了所有套接字类型通用的基本功能。

QAbstractSocket是QTcpSocket和QUdpSocket的基类,它包含这两个类的所有通用功能。如果你需要一个socket,你有两个选择:

  • 实例化QTcpSocket或QUdpSocket。
  • 创建一个本机套接字描述符,实例化QAbstractSocket,并调用setSocketDescriptor()来包装本机套接字。

TCP (Transmission Control Protocol)是一种可靠的、面向流的、面向连接的传输协议。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,然后将发出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。

2.数据类型

2.1 enum QAbstractSocket::BindFlag

flags QAbstractSocket::BindMode

这个enum描述了您可以传递来修改QAbstractSocket::bind()行为的不同标志。

ConstantValueDescription
QAbstractSocket::ShareAddress0x1Allow other services to bind to the same address and port. This is useful when multiple processes share the load of a single service by listening to the same address and port (e.g., a web server with several pre-forked listeners can greatly improve response time). However, because any service is allowed to rebind, this option is subject to certain security considerations. Note that by combining this option with ReuseAddressHint, you will also allow your service to rebind an existing shared address. On Unix, this is equivalent to the SO_REUSEADDR socket option. On Windows, this option is ignored.
QAbstractSocket::DontShareAddress0x2Bind the address and port exclusively, so that no other services are allowed to rebind. By passing this option to QAbstractSocket::bind(), you are guaranteed that on successs, your service is the only one that listens to the address and port. No services are allowed to rebind, even if they pass ReuseAddressHint. This option provides more security than ShareAddress, but on certain operating systems, it requires you to run the server with administrator privileges. On Unix and macOS, not sharing is the default behavior for binding an address and port, so this option is ignored. On Windows, this option uses the SO_EXCLUSIVEADDRUSE socket option.
QAbstractSocket::ReuseAddressHint0x4Provides a hint to QAbstractSocket that it should try to rebind the service even if the address and port are already bound by another socket. On Windows and Unix, this is equivalent to the SO_REUSEADDR socket option.
QAbstractSocket::DefaultForPlatform0x0The default option for the current platform. On Unix and macOS, this is equivalent to (DontShareAddress + ReuseAddressHint), and on Windows, its equivalent to ShareAddress.

2.2 enum QAbstractSocket::NetworkLayerProtocol

此枚举描述Qt中使用的网络层协议值。

ConstantValueDescription
QAbstractSocket::IPv4Protocol0IPv4
QAbstractSocket::IPv6Protocol1IPv6
QAbstractSocket::AnyIPProtocol2Either IPv4 or IPv6
QAbstractSocket::UnknownNetworkLayerProtocol-1Other than IPv4 and IPv6

欲知更多信息,可查阅QHostAddress::protocol()。

2.3enum QAbstractSocket::PauseModeflags&&QAbstractSocket::PauseModes

此枚举描述当套接字应阻止继续数据传输时的行为。目前唯一支持的通知是QSslSocket::sslErrors()。

ConstantValueDescription
QAbstractSocket::PauseNever0x0Do not pause data transfer on the socket. This is the default and matches the behaviour of Qt 4.
QAbstractSocket::PauseOnSslErrors0x1Pause data transfer on the socket upon receiving an SSL error notification. I.E. QSslSocket::sslErrors().

这个enum是在Qt 5.0中引入或修改的。
PauseModes类型是QFlags<PauseMode>的类型定义。它存储PauseMode值的OR组合。

2.4 enum QAbstractSocket::SocketError

此枚举描述可能发生的套接字错误。

ConstantValueDescription
QAbstractSocket::ConnectionRefusedError0日志含义连接被邻居拒绝(或超时)。
QAbstractSocket::RemoteHostClosedError1远程主机关闭了连接。请注意,客户端套接字(即此套接字)将在远程关闭通知发送后被关闭。
QAbstractSocket::HostNotFoundError2找不到主机地址。
QAbstractSocket::SocketAccessError3套接字操作失败,因为应用程序缺乏所需的特权。
QAbstractSocket::SocketResourceError4本地系统资源耗尽(例如,套接字太多)。
QAbstractSocket::SocketTimeoutError5socket操作超时。
QAbstractSocket::DatagramTooLargeError6数据报大于操作系统的限制(可以低至8192字节)。
QAbstractSocket::NetworkError7网络出现错误(例如,网线被意外拔出)。
QAbstractSocket::AddressInUseError8指定给QAbstractSocket::bind()的地址已经在使用,并且被设置为独占的。
QAbstractSocket::SocketAddressNotAvailableError9指定给QAbstractSocket::bind()的地址不属于该主机。
QAbstractSocket::UnsupportedSocketOperationError10本地操作系统不支持请求的套接字操作(例如,缺乏IPv6支持)。
QAbstractSocket::ProxyAuthenticationRequiredError12套接字使用代理,而代理需要身份验证。
QAbstractSocket::SslHandshakeFailedError13SSL/TLS握手失败,因此连接被关闭(仅在QSslSocket中使用)
QAbstractSocket::UnfinishedSocketOperationError11仅由qabstractsockeengine使用,最后一次尝试的操作尚未完成(仍在后台进行中)。
QAbstractSocket::ProxyConnectionRefusedError14无法与代理服务器联系,因为与该服务器的连接被拒绝
QAbstractSocket::ProxyConnectionClosedError15与代理服务器的连接意外关闭(在与最终对等端建立连接之前)
QAbstractSocket::ProxyConnectionTimeoutError16连接代理服务器超时或代理服务器在认证阶段停止响应。
QAbstractSocket::ProxyNotFoundError17找不到使用setProxy()(或应用程序代理)设置的代理地址。
QAbstractSocket::ProxyProtocolError18由于无法理解代理服务器的响应,与代理服务器的连接协商失败。
QAbstractSocket::OperationError19当套接字处于不允许的状态时,试图进行操作。
QAbstractSocket::SslInternalError20正在使用的SSL库报告了一个内部错误。这可能是错误安装或错误配置库的结果。
QAbstractSocket::SslInvalidUserDataError21提供了无效数据(证书、密钥、密码等),使用它导致SSL库中出现错误。
QAbstractSocket::TemporaryError22发生了一个临时错误(例如,操作将阻塞而套接字是非阻塞的)。
QAbstractSocket::UnknownSocketError-1发生了一个无法识别的错误。

2.5 enum QAbstractSocket::SocketOption

此enum表示可在套接字上设置的选项。如果需要,可以在从套接字接收到connected()信号或从QTcpServer接收到新套接字之后设置它们。

ConstantValueDescription
QAbstractSocket::LowDelayOption0尝试优化套接字以降低延迟。对于QTcpSocket,这将设置TCP_NODELAY选项并禁用Nagle的算法。设置为1表示启用。
QAbstractSocket::KeepAliveOption1设置为1以启用SO_KEEPALIVE套接字选项
QAbstractSocket::MulticastTtlOption2设置该值为整型值,用于设置IP_MULTICAST_TTL(组播数据报的TTL) socket选项。
QAbstractSocket::MulticastLoopbackOption3设置为1表示启用IP_MULTICAST_LOOP(组播环回)套接字选项。
QAbstractSocket::TypeOfServiceOption4Windows不支持此选项。这映射到IP_TOS套接字选项。有关可能的值,请参见下表。
QAbstractSocket::SendBufferSizeSocketOption5在操作系统级别设置套接字发送缓冲区的字节大小。它映射到SO_SNDBUF套接字选项。该选项不影响QIODevice或QAbstractSocket缓冲区。这个enum值已经在Qt 5.3中引入。
QAbstractSocket::ReceiveBufferSizeSocketOption6在操作系统级别设置套接字接收缓冲区的字节大小。这映射到SO_RCVBUF套接字选项。此选项不影响QIODevice或QAbstractSocket缓冲区(参见setReadBufferSize())。这个enum值已经在Qt 5.3中引入。

TypeOfServiceOption的可能值为:

ValueDescription
224Network control
192Internetwork control
160CRITIC/ECP
128Flash override
96Flash
64Immediate
32Priority
0Routine

 这个enum是在Qt 4.6中引入或修改的。
参见QAbstractSocket::setSocketOption()和QAbstractSocket::socketOption()。

2.6 enum QAbstractSocket::SocketState

此枚举描述一个套接字可能处于的不同状态。

ConstantValueDescription
QAbstractSocket::UnconnectedState0插座未连接。
QAbstractSocket::HostLookupState1套接字正在执行主机名查找。
QAbstractSocket::ConnectingState2套接字已经开始建立连接。
QAbstractSocket::ConnectedState3连接建立。
QAbstractSocket::BoundState4套接字被绑定到一个地址和端口。
QAbstractSocket::ClosingState6套接字即将关闭(数据可能仍在等待写入)。
QAbstractSocket::ListeningState5仅供内部使用。

2.7 enum QAbstractSocket::SocketType 

此enum描述传输层协议。

ConstantValueDescription
QAbstractSocket::TcpSocket0TCP
QAbstractSocket::UdpSocket1UDP
QAbstractSocket::SctpSocket2SCTP
QAbstractSocket::UnknownSocketType-1Other than TCP, UDP and SCTP

3.成员函数介绍

QAbstractSocket::QAbstractSocket(SocketType socketType, QObject *parent)
创建一个新的socketType类型的抽象套接字。父参数被传递给QObject的构造函数。
参见socketType()、QTcpSocket和QUdpSocket。

[virtual] QAbstractSocket::~QAbstractSocket()
析构套接字。

void QAbstractSocket::abort()
终止当前连接并重置套接字。与disconnectFromHost()不同,这个函数会立即关闭套接字,丢弃写缓冲区中任何未处理的数据。
参见disconnectFromHost()和close()。

[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, BindMode mode = DefaultForPlatform)
使用BindMode模式绑定到端口端口上的地址。
将这个套接字绑定到地址地址和端口端口。
对于UDP套接字,绑定之后,每当UDP数据报到达指定的地址和端口时,就会发出信号QUdpSocket::readyRead()。因此,这个函数是有用的UDP服务器写。
对于TCP套接字,此函数可用于指定使用哪个接口进行传出连接,这在多个网络接口的情况下很有用。
默认情况下,套接字使用DefaultForPlatform BindMode绑定。如果不指定端口,则随机选择一个端口。
如果成功,函数返回true,套接字进入BoundState;否则返回false。
这个函数是在Qt 5.0中引入的。

bool QAbstractSocket::bind(quint16 port = 0, BindMode mode = DefaultForPlatform)
这是一个重载函数。
绑定到QHostAddress:任何端口端口,使用BindMode模式。
默认情况下,套接字使用DefaultForPlatform BindMode绑定。如果不指定端口,则随机选择一个端口。
这个函数是在Qt 5.0中引入的。

[virtual] qint64 QAbstractSocket::bytesAvailable() const
重新实现从QIODevice: bytesAvailable()。
返回正在等待读取的传入字节数。
参见bytestwrite()和read()。

[virtual] qint64 QAbstractSocket::bytesToWrite() const
重新实现从QIODevice: bytesToWrite()。
返回等待写入的字节数。当控件返回事件循环或调用flush()时写入字节。
参见bytesAvailable()和flush()。

[virtual] bool QAbstractSocket::canReadLine() const
重新实现从QIODevice: canReadLine()。
如果可以从套接字读取一行数据,则返回true;否则返回false。
参见readLine()。

[virtual] void QAbstractSocket::close()
重新实现从QIODevice: close()。
关闭套接字的I/O设备并调用disconnectFromHost()来关闭套接字的连接。
请参阅QIODevice::close()以了解当I/O设备关闭时发生的操作。
参见abort()。

[virtual] void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)
尝试连接到给定端口上的主机名。protocol参数可用于指定使用哪种网络协议(例如:IPv4和IPv6)。
套接字以给定的openMode打开,首先进入HostLookupState,然后执行hostName的主机名查找。如果查找成功,则触发hostFound(),并且QAbstractSocket进入ConnectingState。然后,它尝试连接到查找返回的一个或多个地址。最后,如果建立了连接,QAbstractSocket进入ConnectedState并发出connected()。
在任何时候,套接字都可以发出error()来表示发生了错误。
hostName可以是字符串形式的IP地址(如"43.195.83.32"),也可以是主机名(如"example.com")。QAbstractSocket将只在需要时进行查找。端口按本机字节顺序。
请参见state(), peerName(), peerAddress(), peerPort()和waitForConnected()。

[virtual] void QAbstractSocket::connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite)
这是一个重载函数。
尝试连接到端口上的地址。

[signal] void QAbstractSocket::connected()
这个信号是在调用connectToHost()并成功建立连接之后发出的。
注意:在一些操作系统上,连接()信号可能直接从connectToHost()调用发出,用于连接到本地主机。
参见connectToHost()和disconnected()。

[virtual] void QAbstractSocket::disconnectFromHost()
试图关闭socket。如果有挂起的数据等待写入,QAbstractSocket将进入ClosingState并等待,直到所有数据都已写入。最后,它将进入UnconnectedState并发出disconnected()信号。
参见connectToHost()。

[signal] void QAbstractSocket::disconnected()
当套接字断开连接时,将发出此信号。
警告:如果你需要删除连接到该信号槽的sender(),请使用deleteLater()函数。
参见connectToHost()、disconnectFromHost()和abort()。
const SocketError QAbstractSocket:错误()
返回上次发生的错误类型。
参见state()和errorString()。

[signal] void QAbstractSocket::error(QAbstractSocket::SocketError socketError)
这个信号是在错误发生后发出的。socketError参数描述发生的错误类型。
当发出此信号时,套接字可能还没有准备好进行重新连接。在这种情况下,应该从事件循环中尝试重新连接。例如,使用QTimer::singleShot(),以0作为超时。
SocketError不是一个已注册的元类型,因此对于排队的连接,您必须使用Q_DECLARE_METATYPE()和qRegisterMetaType()来注册它。
注意:信号错误在这个类中重载。要使用函数指针语法连接到该函数,必须在静态类型转换中指定信号类型,如下例所示:

  connect(abstractSocket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error),
      [=](QAbstractSocket::SocketError socketError){ /* ... */ });

参见error(), errorString()和Creating Custom Qt Types。

bool QAbstractSocket::flush()
该函数尽可能多地从内部写缓冲区写入底层网络套接字,而不会阻塞。如果写入了任何数据,该函数返回true;否则返回false。
如果您需要QAbstractSocket立即开始发送缓冲数据,则调用此函数。成功写入的字节数取决于操作系统。在大多数情况下,您不需要调用此函数,因为一旦控制返回到事件循环,QAbstractSocket将自动开始发送数据。如果没有事件循环,则调用waitForBytesWritten()。
参见write()和waitForBytesWritten()。

[signal] void QAbstractSocket::hostFound()
这个信号是在调用connectToHost()并且主机查找成功之后发出的。
注意:自从Qt 4.6.3 QAbstractSocket可以直接从connectToHost()调用发出hostFound(),因为DNS结果可能已经被缓存了。
参见连接()。

[virtual] bool QAbstractSocket::isSequential() const
重新实现从QIODevice: isSequential()。
bool QAbstractSocket: isValid()常量
如果套接字有效并可以使用,则返回true;否则返回false。
注意:在进行读写操作之前,套接字的状态必须是ConnectedState。
参见国家()。

QHostAddress QAbstractSocket::localAddress() const
如果可用,返回本地套接字的主机地址;否则返回QHostAddress::零。
这通常是主机的主IP地址,但是对于到本地主机的连接,也可以是QHostAddress::LocalHost(127.0.0.1)。
参见localPort(), peerAddress()和setLocalAddress()。

quint16 QAbstractSocket::localPort() const
如果可用,返回本地套接字的主机端口号(以本机字节顺序);否则返回0。
参见localAddress(), peerPort()和setLocalPort()。

PauseModes QAbstractSocket::pauseMode() const
返回此套接字的暂停模式。
这个函数是在Qt 5.0中引入的。
参见setPauseMode()和resume()。

QHostAddress QAbstractSocket::peerAddress() const
如果套接字处于ConnectedState状态,则返回已连接对等体的地址;否则返回QHostAddress::零。
请参见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()。

[virtual protected] qint64 QAbstractSocket::readData(char *data, qint64 maxSize)
重新实现从QIODevice: readData()。

[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)
将连接的本地端上的地址设置为。
您可以在QAbstractSocket的子类中调用这个函数,以在建立连接之后更改localAddress()函数的返回值。此功能通常由代理连接用于虚拟连接设置。
注意,这个函数不会在连接之前绑定套接字的本地地址(例如,QAbstractSocket::bind())。
这个函数是在Qt 4.1中引入的。
参见localAddress()、setLocalPort()和setPeerAddress()。

[protected] void QAbstractSocket::setLocalPort(quint16 port)
将连接的本地端上的端口设置为端口。
您可以在QAbstractSocket的子类中调用这个函数,以在建立连接之后更改localPort()函数的返回值。此功能通常由代理连接用于虚拟连接设置。
注意,这个函数不会在连接之前绑定套接字的本地端口(例如,QAbstractSocket::bind())。
这个函数是在Qt 4.1中引入的。
参见localPort(), localAddress(), setLocalAddress()和setPeerPort()。

void QAbstractSocket::setPauseMode(PauseModes pauseMode)
控制在收到通知时是否暂停。pauseMode参数指定套接字应该暂停的条件。目前唯一支持的通知是QSslSocket::sslErrors()。如果设置为PauseOnSslErrors,套接字上的数据传输将暂停,需要通过调用resume()再次显式启用。默认情况下,该选项设置为PauseNever。该选项必须在连接到服务器之前调用,否则将导致未定义的行为。
这个函数是在Qt 5.0中引入的。
参见pauseMode()和resume()。

[protected] void QAbstractSocket::setPeerAddress(const QHostAddress &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)
将连接的远程端设置为端口。
你可以在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, SocketState socketState = ConnectedState, OpenMode openMode = ReadWrite)
使用本机套接字描述符socketDescriptor初始化QAbstractSocket。如果socketDescriptor被接受为有效的socket描述符,则返回true;否则返回false。socket以openMode指定的模式打开,并进入socketState指定的socket状态。读写缓冲区被清除,丢弃任何未决数据。
注意:不可能用同一个本机套接字描述符初始化两个抽象套接字。
参见socketDescriptor()。

[protected] void QAbstractSocket::setSocketError(SocketError socketError)
将最近发生的错误类型设置为socketError。
另参见setSocketState()和setErrorString()。

[virtual] void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
将给定选项设置为由value描述的值。
注意:在Windows运行时,QAbstractSocket::KeepAliveOption必须在套接字连接之前设置。
这个函数是在Qt 4.6中引入的。
参见socketOption()。

[protected] void QAbstractSocket::setSocketState(SocketState 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()。

SocketType QAbstractSocket::socketType() const
返回套接字类型(TCP、UDP或其他)。
参见QTcpSocket和QUdpSocket。

SocketState QAbstractSocket::state() const
返回套接字的状态。
参见错误()。

[signal] void QAbstractSocket::stateChanged(QAbstractSocket::SocketState socketState)
每当QAbstractSocket的状态发生变化时,就会发出此信号。socketState参数是新的状态。
SocketState不是一个已注册的元类型,因此对于排队的连接,您必须使用Q_DECLARE_METATYPE()和qRegisterMetaType()来注册它。
参见state()和Creating Custom Qt Types。

[virtual] bool QAbstractSocket::waitForBytesWritten(int msecs = 30000)
重新实现从QIODevice: waitForBytesWritten()。
这个函数会一直阻塞,直到至少有一个字节被写入到套接字上并且bytesWritten()信号已经发出为止。该函数将在毫秒后超时;默认超时时间为30000毫秒。
如果发出了bytesWritten()信号,函数返回true;否则返回false(如果发生错误或操作超时)。
注意:此函数在Windows上可能随机失效。如果您的软件将运行在Windows上,请考虑使用事件循环和bytesWritten()信号。
参见waitForReadyRead()。

[virtual] bool QAbstractSocket::waitForConnected(int msecs = 30000)
等待直到套接字被连接,最长为毫秒。如果连接已经建立,这个函数返回true;否则返回false。在返回false的情况下,可以调用error()来确定错误的原因。
以下示例等待连接建立的时间长达1秒:

  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)
等待直到套接字断开连接,最长为毫秒。如果连接已断开,此函数返回true;否则返回false。在返回false的情况下,可以调用error()来确定错误的原因。
以下示例等待连接关闭的时间最长为一秒:

 socket->disconnectFromHost();
      if (socket->state() == QAbstractSocket::UnconnectedState ||
          socket->waitForDisconnected(1000))
          qDebug("Disconnected!");

如果msecs为-1,则此函数不会超时。
注意:此函数在Windows上可能随机失效。 如果您的软件将运行在Windows上,请考虑使用事件循环和disconnected()信号。
参见disconnectFromHost()和close()。

[virtual] bool QAbstractSocket::waitForReadyRead(int msecs = 30000)
如果msecs为-1,则此函数不会超时。
注意:此函数在Windows上可能随机失效。 如果您的软件将运行在Windows上,请考虑使用事件循环和disconnected()信号。
参见disconnectFromHost()和close()。

[virtual protected] qint64 QAbstractSocket::writeData(const char *data, qint64 size)
重新实现从QIODevice: writeData()。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值