请慎用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]。