2013-03-26 58 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; 
} 

這樣你的電話聽永遠不會失敗。