请慎用QLocalServer和QLocalSocket

需要实现一个进程间通信的功能,由于数据量不大,且要求传递功能稳定可靠,所以选择了套接字方式。套接字方式,服务器端进程需要提供端口号,并传递给客户端进程。

看到Qt自带了QLocalServer和QLocalSocket,就打算试试。但发现调用函数居然没有指定端口的选项,因此就查阅了Qt的相关代码实现。

QLocalServer实现有三种,分别是qlocalserver_tcp.cpp、qlocalserver_unix.cpp、qlocalserver_win.cpp,其编译开关设置如下:


qt_internal_extend_target(Network CONDITION INTEGRITY AND QT_FEATURE_localserver
    SOURCES
        socket/qlocalserver_tcp.cpp
        socket/qlocalsocket_tcp.cpp
    DEFINES
        QT_LOCALSOCKET_TCP
)

qt_internal_extend_target(Network CONDITION QT_FEATURE_localserver AND UNIX AND NOT INTEGRITY
    SOURCES
        socket/qlocalserver_unix.cpp
        socket/qlocalsocket_unix.cpp
)

qt_internal_extend_target(Network CONDITION QT_FEATURE_localserver AND WIN32
    SOURCES
        socket/qlocalserver_win.cpp
        socket/qlocalsocket_win.cpp
)

其中,INTEGRITY可能是INTEGRITY OS?但不太像,因为下面还有UNIX AND NOT INTEGRITY,所以,这个开关不太像是INTEGRITY OS,具体未深究。

基于以上的编译开关设置,推测Qt首选了qlocalserver_tcp.cpp,其次才是qlocalserver_unix.cpp、qlocalserver_win.cpp。qlocalserver_tcp.cpp中,就是基于tcp的C/S模式,端口传递方式是通过QSettings读写配置文件实现的。qlocalserver_unix.cpp的端口传递方式就是基于文件描述符实现,qlocalserver_win.cpp则采用管道实现,不是tcp套接字方式。

虽然如此,基本上可以确定,绝大多数情况下,还是使用的qlocalserver_tcp.cpp,也就是tcp套接字、配置文件传递端口号。

一般来说,这种方式够用了。但是,个人看法,端口号最好还是通过进程的命令行参数传递;如果进程崩溃或异常结束,则配置文件还得在下一次调用前归位,以免提示端口被占用。

 

转载请注明来源,谢谢。

有偿解决C++编程问题,承接项目定制开发;寻一份全职或兼职Windows C++开发工作。联系邮箱:[email protected]


老刀的技术日志 » 请慎用QLocalServer和QLocalSocket

发表评论