QLocalServer Class

QLocalServer 类提供了一个基于套接字的本地服务器。更多

Header: #include <QLocalServer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
继承: QObject

公共类型

enum SocketOption { NoOptions, UserAccessOption, GroupAccessOption, OtherAccessOption, WorldAccessOption, AbstractNamespaceOption }
flags SocketOptions

属性

公共功能

QLocalServer(QObject *parent = nullptr)
virtual ~QLocalServer()
QBindable<QLocalServer::SocketOptions> bindableSocketOptions()
void close()
QString errorString() const
QString fullServerName() const
virtual bool hasPendingConnections() const
bool isListening() const
bool listen(const QString &name)
bool listen(qintptr socketDescriptor)
(since 6.3) int listenBacklogSize() const
int maxPendingConnections() const
virtual QLocalSocket *nextPendingConnection()
QAbstractSocket::SocketError serverError() const
QString serverName() const
(since 6.3) void setListenBacklogSize(int size)
void setMaxPendingConnections(int numConnections)
void setSocketOptions(QLocalServer::SocketOptions options)
qintptr socketDescriptor() const
QLocalServer::SocketOptions socketOptions() const
bool waitForNewConnection(int msec = 0, bool *timedOut = nullptr)

信号

void newConnection()

静态公共成员

bool removeServer(const QString &name)

保护函数

(since 6.8) void addPendingConnection(QLocalSocket *socket)
virtual void incomingConnection(quintptr socketDescriptor)

详细说明

该类用于接受传入的本地套接字连接。

调用listen() 可让服务器开始监听指定密钥上的传入连接。然后,每次客户端连接到服务器时,都会发出newConnection() 信号。

调用nextPendingConnection() 将待处理的连接作为已连接的QLocalSocket 接受。函数返回一个指向QLocalSocket 的指针,该指针可用于与客户端通信。

如果发生错误,serverError() 会返回错误类型,调用errorString() 可以获得关于发生错误的可读描述。

监听连接时,服务器监听的名称可通过serverName() 获取。

调用close() 会使 QLocalServer 停止监听传入连接。

虽然 QLocalServer 是为与事件循环一起使用而设计的,但也可以在没有事件循环的情况下使用。在这种情况下,您必须使用waitForNewConnection() ,它会一直阻塞,直到连接可用或超时为止。

另请参阅 QLocalSocketQTcpServer

成员类型文档

枚举 QLocalServer::SocketOption
flags QLocalServer::SocketOptions

该枚举描述了用于创建套接字的可能选项。这将更改支持套接字访问权限的平台(Linux、Windows)上的访问权限。根据平台的不同,GroupAccess 和 OtherAccess 的含义可能略有不同。在 Linux 和 Android 上,可以使用具有抽象地址的套接字;套接字权限对此类套接字没有意义。

常量说明
QLocalServer::NoOptions0x0未设置访问限制。
QLocalServer::UserAccessOption0x01仅限与创建套接字的进程相同的用户访问。
QLocalServer::GroupAccessOption0x2在 Linux 系统中,访问权限仅限于创建套接字的同一用户组,而非创建套接字的用户。在 Windows 系统中,访问权限仅限于进程的主组
QLocalServer::OtherAccessOption0x4除在 Linux 上创建套接字的用户和组外,其他人都可访问。Windows 上每个人都可以访问。
QLocalServer::WorldAccessOption0x7无访问限制。
QLocalServer::AbstractNamespaceOption0x8监听套接字将在抽象名称空间中创建。此标记仅适用于 Linux。在其他平台上,为了代码的可移植性,该标记等同于 WorldAccessOption。

SocketOptions 类型是QFlags<SocketOption> 的类型定义。它存储 SocketOption 值的 OR 组合。

另请参阅 socketOptions

属性文档

[bindable] socketOptions : SocketOptions

注意: 该属性支持QProperty 绑定。

该属性包含控制套接字运行方式的套接字选项。

例如,套接字可能会限制哪些用户 ID 可以连接到套接字。

这些选项必须在调用listen() 之前设置。

在某些情况下,例如 Linux 上的 Unix 域套接字,对套接字的访问权限由文件系统权限决定,并根据 umask 创建。设置访问标志将覆盖这一点,并根据指定的权限限制或允许访问。

其他基于 Unix 的操作系统(如 macOS)不尊重 Unix 域套接字的文件权限,默认情况下使用 WorldAccess,因此这些权限标志不会产生任何影响。

在 Windows 平台上,UserAccessOption 就足以允许非升级进程连接到由同一用户运行的升级进程创建的本地服务器。GroupAccessOption 指的是进程的主组(参见 Windows 文档中的 TokenPrimaryGroup)。OtherAccessOption 指的是众所周知的 "Everyone "组。

在 Linux 平台上,可以在独立于文件系统的抽象名称空间中创建套接字。使用这种套接字意味着忽略权限选项。在其他平台上,AbstractNamespaceOption 等同于WorldAccessOption

默认情况下,没有设置任何标志,访问权限是平台默认值。

另请参阅 listen() 。

成员函数文档

[explicit] QLocalServer::QLocalServer(QObject *parent = nullptr)

使用给定的parent 创建新的本地套接字服务器。

另请参阅 listen() 。

[virtual noexcept] QLocalServer::~QLocalServer()

销毁QLocalServer 对象。如果服务器正在监听连接,则会自动关闭。

任何仍在连接的客户端 QLocalSockets 必须在服务器被删除前断开连接或重新转发。

另请参阅 close().

[protected, since 6.8] void QLocalServer::addPendingConnection(QLocalSocket *socket)

QLocalServer::incomingConnection() 调用该函数,将socket 添加到待处理传入连接列表中。

注意: 如果不想破坏待处理连接机制,请不要忘记从重新实现的incomingConnection() 中调用该成员。该函数会在添加套接字后发出newConnection() 信号。

该函数在 Qt 6.8 中引入。

另请参阅 incomingConnection() 和newConnection()。

void QLocalServer::close()

停止监听传入连接。现有连接不受影响,但任何新连接都将被拒绝。

另请参阅 isListening() 和listen()。

QString QLocalServer::errorString() const

返回与serverError() 报告的当前错误相匹配的可读信息。如果没有合适的字符串,则返回空字符串。

另请参阅 serverError()。

QString QLocalServer::fullServerName() const

返回服务器正在监听的完整路径。

注意:这与平台有关

另请参阅 listen() 和serverName()。

[virtual] bool QLocalServer::hasPendingConnections() const

如果服务器有待处理连接,则返回true ;否则返回false

另请参阅 nextPendingConnection() 和setMaxPendingConnections() 。

[virtual protected] void QLocalServer::incomingConnection(quintptr socketDescriptor)

QLocalServer socketDescriptor 是已接受连接的本地套接字描述符。

基本实现会创建一个QLocalSocket ,设置套接字描述符,然后将QLocalSocket 保存在待处理连接的内部列表中。最后发送newConnection() 。

重新实现此函数可改变服务器在连接可用时的行为。

另请参阅 newConnection()、nextPendingConnection() 和QLocalSocket::setSocketDescriptor()。

bool QLocalServer::isListening() const

如果服务器正在监听传入连接,则返回true ,否则返回 false。

另请参阅 listen() 和close()。

bool QLocalServer::listen(const QString &name)

告诉服务器监听name 上的传入连接。如果服务器正在监听,则返回 false。成功时返回 true,否则返回 false。

name 可以是单个名称, 将确定正确的平台特定路径。() 将返回传递给 listen 的名称。QLocalServer serverName

通常只需传入一个名称,如 "foo",但在 Unix 上也可以是一个路径,如"/tmp/foo",在 Windows 上可以是一个管道路径,如"\\.\pipe\foo"。

注意: 在 Unix 上,如果服务器在未关闭的情况下崩溃,监听将以 AddressInUseError 失败。要创建新服务器,应删除该文件。在 Windows 上,两个本地服务器可以同时监听同一管道,但任何连接都将转到其中一个服务器。

另请参阅 serverName()、isListening() 和close()。

bool QLocalServer::listen(qintptr socketDescriptor)

指示服务器监听socketDescriptor 上的传入连接。如果服务器当前正在监听,则属性返回false 。成功时返回true ,否则返回false 。套接字必须准备好接受新连接,且不调用额外的特定平台函数。套接字被设置为非阻塞模式。

serverName(如果平台支持该选项,fullServerName() 可能会返回一个包含名称的字符串;否则,它们会返回一个空的QString 。特别是,Linux 支持的抽象名称空间中的套接字地址如果包含无法打印的字符,就不会产生有用的名称。

另请参阅 isListening() 和close()。

[since 6.3] int QLocalServer::listenBacklogSize() const

返回待接受连接的积压队列大小。

此函数在 Qt 6.3 中引入。

另请参阅 setListenBacklogSize()。

int QLocalServer::maxPendingConnections() const

返回待接受连接的最大数量。默认为 30。

另请参阅 setMaxPendingConnections() 和hasPendingConnections()。

[signal] void QLocalServer::newConnection()

每次有新连接时都会发出该信号。

另请参阅 hasPendingConnections() 和nextPendingConnection()。

[virtual] QLocalSocket *QLocalServer::nextPendingConnection()

以已连接QLocalSocket 对象的形式返回下一个待处理连接。

套接字是作为服务器的子对象创建的,这意味着当QLocalServer 对象被销毁时,它会被自动删除。为避免浪费内存,最好还是在使用完该对象后明确删除它。

nullptr 如果在没有待处理连接的情况下调用此函数,则返回 。

另请参阅 hasPendingConnections()、newConnection() 和incomingConnection()。

[static] bool QLocalServer::removeServer(const QString &name)

删除任何可能导致listen() 调用失败的服务器实例,如果成功则返回true ,否则返回false 。该函数用于在前一个服务器实例尚未清理干净时从崩溃中恢复。

在 Windows 系统中,该函数不执行任何操作;在 Unix 系统中,它将删除由name 提供的套接字文件。

警告 注意避免删除运行中实例的套接字。

QAbstractSocket::SocketError QLocalServer::serverError() const

返回最后发生的错误类型或NoError

另请参见 errorString()。

QString QLocalServer::serverName() const

如果服务器正在监听连接,则返回服务器名称;否则返回 QString()

另请参阅 listen() 和fullServerName()。

[since 6.3] void QLocalServer::setListenBacklogSize(int size)

将待接受连接的积压队列大小设置为size 。操作系统可能会减少或忽略此值。默认情况下,队列大小为 50。

注意: 必须在调用listen() 之前设置此属性。

此函数在 Qt 6.3 中引入。

另请参阅 listenBacklogSize()。

void QLocalServer::setMaxPendingConnections(int numConnections)

numConnections在调用nextPendingConnection() 之前,QLocalServer 接受的连接数不会超过numConnections

注:尽管QLocalServer 在达到最大待接受连接数后将停止接受新连接,但操作系统仍可能将这些连接保留在队列中,这将导致客户端发出已连接的信号。

另请参阅 maxPendingConnections() 和hasPendingConnections()。

qintptr QLocalServer::socketDescriptor() const

返回服务器用于侦听传入指令的本地套接字描述符,如果服务器未侦听,则返回-1。

描述符的类型取决于平台:

  • 在 Windows 平台上,返回值是Winsock 2 Socket Handle
  • 在 INTEGRITY 平台上,返回值是QTcpServer 套接字描述符,类型由socketDescriptor 定义。
  • 在所有其他类 UNIX 操作系统上,类型是代表监听套接字的文件描述符。

另请参阅 listen() 。

QLocalServer::SocketOptions QLocalServer::socketOptions() const

返回套接字上设置的套接字选项。

注: 属性 socketOptions 的获取函数。

另请参阅 setSocketOptions().

bool QLocalServer::waitForNewConnection(int msec = 0, bool *timedOut = nullptr)

最多等待msec 毫秒,或直到有输入连接可用。如果连接可用,则返回true ;否则返回false 。如果操作超时且timedOut 不是nullptr ,*timedOut 将被设置为 true。

这是一个阻塞函数调用。在单线程图形用户界面应用程序中不宜使用该函数,因为在函数返回之前,整个应用程序将停止响应。waitForNewConnection() 在没有事件循环可用时非常有用。

非阻塞的替代方法是连接到newConnection() 信号。

如果 msec 为-1,则该函数不会超时。

另请参阅 hasPendingConnections() 和nextPendingConnection()。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.