首先看如下的代码:
server = new QLocalServer(this);
if (!server->listen(ServerName)) {
QMessageBox::critical(this, tr("Local Fortune Server"),
tr("Unable to start the server: %1.")
.arg(server->errorString()));
return;
}
这是 Qt 的 IPC 解决方案的示例中的一段代码,它的作用是运用 QLocalSocket 和 QLocalServer 进行进程间的连接通信,这在正常情况下是没有问题的。
但是如果我们创建的 QLocalServer 服务器进程出现异常终止时(比如在 Qt Creator 中强制终止进程),我们再次启动该进程时,就会弹出上面的 QMessageBox,无法使用 QLocalServer 再次在同一名称上进行监听,我们必须更改监听的服务名称才能再次启动它,这在运行环境中是不可能被接受的。
那么如何才能仍然使用先前的服务名称,继续顺利工作呢?
在 Qt 的帮助文档中有指出:
在 Unix 上,如果服务器没有关闭就崩溃了,监听将失败,并使用 AddressInUseError 标记。要创建新服务器,应该删除该套接字文件。
也就是说如果服务器没有正常退出,我们需要删除套接字文件。最好的办法是修改我们的使用方式在每次开始之前调用 bool QLocalServer::removeServer ( const QString & name ) 接口:
server = new QLocalServer(this);
server->removeServer(ServerName); // 或使用 QLocalServer::removeServer(ServerName);
if (!server->listen(ServerName)) {
QMessageBox::critical(this, tr("Local Fortune Server"),
tr("Unable to start the server: %1.")
.arg(server->errorString()));
return;
}
网友评论