QLocalServer Class
QLocalServer 类提供了一个基于本地套接字的服务器。更多内容...
| 头文件: | #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 |
属性
- socketOptions : 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(),该方法会阻塞,直到有可用连接或超时结束为止。
另请参阅 QLocalSocket 和QTcpServer 。
成员类型文档
enum QLocalServer::SocketOption
flags QLocalServer::SocketOptions
此枚举描述了用于创建套接字的可用选项。在支持套接字访问权限的操作系统(Linux、Windows)上,这会更改套接字的访问权限。根据操作系统的不同,GroupAccess 和 OtherAccess 的含义可能会略有差异。 在 Linux 和 Android 系统上,可以使用具有抽象地址的套接字;对于此类套接字,套接字权限没有实际意义。
| 常量 | 值 | 描述 |
|---|---|---|
QLocalServer::NoOptions | 0x0 | 未设置任何访问限制。 |
QLocalServer::UserAccessOption | 0x01 | 访问仅限于与创建套接字的进程相同的用户。 |
QLocalServer::GroupAccessOption | 0x2 | 在 Linux 上,访问权限仅限于与创建套接字的用户属于同一组,但不限于同一用户。在 Windows 上,访问权限仅限于该进程的主组 |
QLocalServer::OtherAccessOption | 0x4 | 在 Linux 上,除创建套接字的用户和组外,所有人都可访问。在 Windows 上,所有人都可访问。 |
QLocalServer::WorldAccessOption | 0x7 | 无访问限制。 |
QLocalServer::AbstractNamespaceOption | 0x8 | 监听套接字将在抽象命名空间中创建。此标志仅适用于 Linux。对于其他平台,为了代码的可移植性,此标志等同于 WorldAccessOption。 |
SocketOptions 类型是QFlags<SocketOption> 的 typedef。它存储 SocketOption 值的按“或”运算组合。
另请参阅 socketOptions 。
属性文档
[bindable] socketOptions : SocketOptions
注意:此 属性支持QProperty 绑定。
该属性包含控制套接字运行方式的套接字选项。
例如,套接字可以限制哪些用户 ID 可以连接到该套接字。
这些选项必须在调用listen() 之前设置。
在某些情况下(例如 Linux 上的 Unix 域套接字),对套接字的访问将由文件系统权限决定,并根据 umask 创建。设置访问标志将覆盖此设置,并根据指定内容限制或允许访问。
其他基于 Unix 的操作系统(如 macOS)不遵循 Unix 域套接字的文件权限,默认具有 WorldAccess 权限,因此这些权限标志将不起作用。
在 Windows 上,UserAccessOption 足以允许一个非提升权限的进程连接到由同一用户运行的提升权限进程创建的本地服务器。GroupAccessOption 指的是进程的主组(参见 Windows 文档中的 TokenPrimaryGroup)。OtherAccessOption 指的是众所周知的“Everyone”组。
在 Linux 平台上,可以在抽象命名空间中创建套接字,该空间独立于文件系统。使用此类套接字意味着忽略权限选项。在其他平台上,AbstractNamespaceOption 等同于WorldAccessOption 。
默认情况下不设置任何标志,访问权限采用平台的默认设置。
访问函数:
| QLocalServer::SocketOptions | socketOptions() const |
| void | setSocketOptions(QLocalServer::SocketOptions options) |
另请参阅 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 。
bool QLocalServer::listen(const QString &name)
指示服务器监听name 上的传入连接。如果服务器已经在监听,则listen()将失败。成功时返回true ,否则返回false 。
name 参数可以是一个名称,QLocalServer 会自动确定正确的平台特定路径。serverName() 将返回传递给 listen() 的名称。
通常您只需传入一个名称(如“foo”),但在 Unix 系统上,这也可以是一个路径(如“/tmp/foo”);而在 Windows 系统上,这可以是一个管道路径(如“\\.\pipe\foo ”)。
注意:在 Unix系统上 ,如果服务器此前崩溃且未关闭,`listen()` 将因 `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 若在无待处理连接时调用此函数,则返回 is。
另请参阅 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 。QLocalServer 在调用nextPendingConnection()之前,最多接受numConnections 个传入连接。
注意:尽管QLocalServer 在达到待处理连接的最大数量后将停止接受新连接,但操作系统仍可能会将这些连接保留在队列中,这将导致客户端报告已建立连接。
另请参阅 maxPendingConnections() 和hasPendingConnections()。
qintptr QLocalServer::socketDescriptor() const
返回服务器用于监听传入指令的原生套接字描述符;如果服务器未处于监听状态,则返回 -1。
描述符的类型取决于平台:
- 在 Windows 系统上,返回值是一个Winsock 2 套接字句柄。
- 在 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。
这是一个阻塞式函数调用。不建议在单线程 GUI 应用程序中使用它,因为整个应用程序将停止响应,直到该函数返回为止。waitForNewConnection() 主要在没有可用事件循环时才有用。
非阻塞的替代方案是订阅newConnection()信号。
如果 msec 为 -1,则此函数不会超时。
另请参阅 hasPendingConnections() 和nextPendingConnection()。
© 2026 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.