Qt之QLocalServer

简述

QLocalServer提供了一个基于本地socket的server。

QLocalServer可以接受来自本地socket的连接。通过调用listen(),让server监听来自特定key的连接。

调用nextPendingConnection()来接受一个挂起(等待)的连接作为一个已连接的QLocalSocket。函数返一个QLocalSocket指针,可以被用于和client通信。

如果发生错误,serverError()会返回错误的类型,errorString()则返回人类可读的错误描述。

当监听连接时,通过serverName()可以获取当前server监听的名称。

调用close()使QLocalServer停止对连接请求的监听。

虽然QLocalServer被设计用于事件循环,但在没有事件循环时也是可以使用的。这时必须使用waitForNewConnection()来进行阻塞,直到有可用的连接或超时。

  • 简述
  • 成员类型
  • Public函数
  • 信号
  • Static Public函数
  • Protected函数

成员类型

枚举 QLocalServer::SocketOption
标识 QLocalServer::SocketOptions

常量 描述
QLocalServer::NoOptions 0x0 没有设置访问限制
QLocalServer::UserAccessOption 0x01 访问仅限于相同的用户进程创建的套接字。
QLocalServer::GroupAccessOption 0x2 在Linux中,访问仅限于同一组,但不是创建socket的用户;在Windows中,访问仅限于进程的主要组
QLocalServer::OtherAccessOption 0x4 在Linux中,访问对每个人来说都可用,除了创建socket的用户和组;在Windows中,访问对每个人来说都可用。
QLocalServer::WorldAccessOption 0x7 没有访问限制

socketOptions : SocketOptions

setSocketOptions()函数控制socket操作。例如:socket可能限制可以连接到socket的user ids。

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

在某些情况下,例如:在Linux上的Unix domain sockets,socket的访问将由文件系统权限决定,并基于umask创建。设置访问标识,将覆盖这,并且限制或允许访问指定。

其它基于Unix的操作系统,例如:OS X,不在意Unix domain sockets的文件权限,并且默认情况下WorldAccess和这些许可标志将没有影响。

在Windows中,UserAccessOption足以让一个非提升进程连接到由一个提升的进程创建的本地server,由相同的用户。 GroupAccessOption指的是进程(见Windows文档中的TokenPrimaryGroup)的主组。 OtherAccessOption指的是著名的“Everyone”组。

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

Public函数

void close()

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

QString errorString() const

返回人类可读的消息,适合serverError()报告的当前错误。如果没有合适的字符串,则返回一个空字符串。

QString fullServerName() const

返回server监听的完整路径。

注意:这取决于平台

virtual bool hasPendingConnections() const

如果server有一个等待中的连接,返回true;否则返回false。

bool isListening() const

如果server正在监听传入的连接,返回true;否则返回false。

bool listen(const QString &name)

告诉server监听名为name的传入连接。如果server当前正在侦听,返回false;成功返回true,否则返回false。

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

通常,只需要传入类似“foo”的name即可。但在Unix中,这个name也可以是一个路径,例如:“/tmp/foo”;在windows中,name也可以指定为一个管道路径,例如:“\.\pipe\foo”。

注意:在Unix中,如果server没有关闭listen就crash了,会产生一个AddressInUseError的错误。要想创建一个新的server,需要移除这个file。在windows中,两个本地server可以同时监听同一个管道,但任何连接将会选择其中的一个server。

bool listen(qintptr socketDescriptor)

指示server监听传入的socketDescriptor连接。如果server目前正在倾听,返回false,成功返回true;否则返回false。socket 必须准备接受新连接,没有额外的特定于平台的功能。socket被设置为非阻塞模式。

如果平台支持该选项,serverName()、fullServerName()返回一个name字符串;否则,返回一个空字符串。

int maxPendingConnections() const

返回可接受的最大的等待连接数,默认为30。

virtual QLocalSocket *nextPendingConnection()

返回下一个等待中的连接作为已连接上的QLocalSocket对象。

创建的socket被当作是server的孩子,这意味着当QLocalServer对象被销毁时,socket会被自动删除。
为避免内存浪费,仍然可以在使用完socket之后,显式地删除它。

当没有等待的连接时,调用该函数返回值0。

QAbstractSocket::SocketError serverError() const

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

QString serverName() const

如果server正在监听连接,返回server名称;否则返回QString()。

void setMaxPendingConnections(int numConnections)

设置可接收的最大等待连接数为numConnections。QLocalServer在调用nextPendingConnection()之前,最多只能接受numConnections个连接请求。

注意:尽管QLocalServer在等待的连接数目达到设置的最大值之后,将不再接受新的连接请求,但是操作系统仍然会将这些新的连接请求保持在等待队列中,因为这些请求在连接上之后会给客户端发送信号。

void setSocketOptions(SocketOptions options)

设置socket的socket选项。

SocketOptions socketOptions() const

返回设置在socket上的socket选项。

bool waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR)

最多等待msec毫秒,直到一个传入的连接可用。如果一个连接可用,返回ture,否则返回false。如果操作超时并且timedOut不为0,则将*timedOut设置为ture。

这是一个阻塞函数调用,在单线程GUI应用程序中使用不太明智,因为在该函数返回之前,整个应用程序将停止对其他事件的响应。当没有事件循环时,waitForNewConnection()很有用。

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

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

信号

void newConnection()

每次一个新连接可用时,发射此信号。

Static Public函数

bool removeServer(const QString &name)

移除可能导致调用listen()失败的任何server实例,如果成功,返回true;否则返回false。这个函数是为了从crash中恢复,当以前的server实例没有被清理干净。

在Windows中,此函数不进行任何操作;在Unix中,它移除由name指定的socket文件。

警告:应该注意避免移除正处于运行状态的socke实例。

Protected函数

virtual void incomingConnection(quintptr socketDescriptor)

当一个新连接可用时,这个虚函数就会被QLocalServer调用, socketDescriptor是接受的连接的本地socket描述符。

基本实现创建一个QLocalSocket,设置socket描述符,然后将这个QLocalSocket存入到待连接的一张内部列表中。最后发射newConnection()信号。

重写这个函数,当有可用连接时,可以改变server的行为。

时间: 2024-08-02 08:24:29

Qt之QLocalServer的相关文章

《Qt 实战一二三》

简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度的部队. 但是我们还是我们,我们只是多了一份责任.古语有云:"不积跬步无以至千里,不积小流无以成江海",所以每一个伟大事务的产生都不是一蹴而就的.现在我们要立足眼下,把第一站放在地球,"<Qt 实战一二三>&quo

Qt之运行一个实例进程

简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual Studio.Qt Ctretor.QQ- 下面我们来介绍下如何实现一个实例进程. 简述 QSharedMemory QLocalServer QtSingleApplication 任务列表 更多参考 QSharedMemory 使用共享内存来实现,key值唯一,一般可以用组织名+应用名来确定.

QT中实现程序只运行一个实例--应用程序的单例化

起因 最近想实现一个应用程序单例化的程序, 目前使QT运行一个实例有如下几种方式 1.QSharedMemory 使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出; 这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动. 2.文件锁 在程序运行的时候就在目录下创建一个文件,当程序运行时就判断这个文件是否存在,如果存在说明程序已经在运行.其本质与QSharedMemory相同 3.利用QLocalServer 参照 Qt实现应用程序单实例运行–Loca

Qt之进程间通信(TCP/IP)

简述 可以通过Qt提供的IPC使用TCP/IP,使用QtNetwork模块即可实现,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用. QtNetwork模块提供的类能够创建基于TCP/IP的客户端与服务端应用程序.为实现底层的网络访问,可以使用QTcpSocket.QTcpServer和QUdpSocket,并提供底层网络类.还提供了使用常规协议实现网络操作的QNetworkRequest.QNetworkReply.QNetworkAccessManager. 简述

Qt之网络编程

简述 Qt Network模块提供的类允许编写 TCP/IP clients 和 servers. 其中包含一些低级别的类,例如:QTcpSocket.QTcpServer 和 QUdpSocket,表示低级的网络概念:一些高级别的类,例如:QNetworkRequest.QNetworkReply 和 QNetworkAccessManager,使用常见的协议执行网络操作:它还提供其他的类,例如:QNetworkConfiguration.QNetworkConfigurationManage

QT中的QInputDialog的小例子

其实这断代码没什么优秀之处,贴出来主要为为了方便自己和他人,因为以后如果用到这一块的话,这些代码可能能够直接拿过来用. InpugDialog.h头文件: #ifndef INPUGDIALOG_H #define INPUGDIALOG_H #include <QtGui> #include "ui_inpugdialog.h" class InpugDialog : public QDialog { Q_OBJECT public: InpugDialog(QWidge

vs2008-VS搭配QT,x64平台下为挖三维编的dll,怎么调试

问题描述 VS搭配QT,x64平台下为挖三维编的dll,怎么调试 VS搭配QT,x64平台下为挖三维编的dll,怎么调试?新手,试过用挖三维打开调试,但是没看到界面在哪里,请懂得QT的前辈回答,谢谢! 解决方案 https://github.com/Vaa3D/Vaa3D_Wiki/wiki/Build-Vaa3D-on-Linux

qt如何实现 滑动屏幕的效果

问题描述 qt如何实现 滑动屏幕的效果 用了qtscrollArea做了只能靠移动滑动条来实现滑动的效果,怎么样才能做到用触摸屏实现滑动效果,而不是靠滑动条.求大神指点. 解决方案 不要依赖于 qtscrollArea,自己做滑动效果,这样就可以不依靠滑动条.

[Qt教程] 第19篇 2D绘图(九)图形视图框架(上)

[Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主  发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们.但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动,检测它们的碰撞和叠加:或者我们想让自己绘制的图形可以拖动位置,进行缩放和旋转等操作.实现这些功能,要是还使用以前的方法,那么会十分困难.解决这些问题,可以使用Qt提供的图形视图框架.