2013-03-26 169 views
6

我在我的IPC解决方案中使用Qlocalsocket,并且能够启动服务器并接受来自QLocalSocket客户端的连接,并且通信良好,没有问题。无法启动qlocalserver

但我的问题发生在我终止服务器的进程时,我无法再让QLocalServer再次在同一个地方进行侦听,我必须更改服务名称以便能够重新启动它,这是无法实现的运行环境。

那么如何让上一个进程释放这个名字呢?

这里是我如何启动服务器:

m_server = new QLocalServer(this); 
if (!m_server->listen("serviceUniqueName")) { 
    qDebug() << "Not able to start the Server"; 
    return; 
} 

回答

5

Qt的帮助:

在Unix上,如果不关闭服务器崩溃听会失败,并 AddressInUseError。要创建一个新的服务器,该文件应该被删除。 在Windows上,两个本地服务器可以在相同的 时间监听相同的管道,但任何连接都将转到其中一个服务器。

所以,如果你使用* nix,你应该删除文件“/ tmp/socket_name”。

+0

非常感谢很多朋友,工作正常。 – Dorgham 2013-03-26 12:08:53

+0

但我现在有另一个问题,如果我试图启动服务器,而有另一个实例运行它只是去“/ tmp/socket_name”,删除文件,然后重新启动...所以它会指示消息到最后一个开始或第一个或未确定? @amartel – Dorgham 2013-03-26 13:03:04

+0

我真的不知道,但要避免,你可以使用QtSingleApplication:http://qt.digia.com/Product/Qt-Add-Ons/Qt-Solutions-Archive/ – Amartel 2013-03-26 13:13:09

12

正如Amartel指出的,如果服务器死亡,您需要删除套接字文件。 做的最好的方法是调用bool QLocalServer::removeServer (const QString & name)

m_server = new QLocalServer(this); 
QString serverName("serviceUniqueName"); 
QLocalServer::removeServer(serverName); 
if (!m_server->listen(serverName)) { 
    qDebug() << "Not able to start the Server"; 
    return; 
} 

这样你的电话听永远不会失败。