10

私はIPCソリューションでQlocalsocketを使用しており、サーバーを起動してQLocalSocketクライアントからの接続を受け入れ、正常に通信できます。問題はありません。

しかし、サーバーのプロセスを強制終了すると問題が発生します。QLocalServerを同じ場所で再度リッスンさせることはできません。サービス名を変更して、サービスを再開できるようにする必要があります。これは、ランタイム環境では不可能でした。

では、その名前を解放するために前のプロセスを作成するにはどうすればよいですか?

これが私がサーバーを起動する方法です:

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

2 に答える 2

19

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;
}

このようにして、リッスンの呼び出しが失敗することはありません。

于 2013-08-20T10:05:42.150 に答える
7

Qtヘルプ:

Unixでは、サーバーが閉じずにクラッシュした場合、listenはAddressInUseErrorで失敗します。新しいサーバーを作成するには、ファイルを削除する必要があります。Windowsでは、2つのローカルサーバーが同時に同じパイプをリッスンできますが、接続はいずれかのサーバーに接続されます。

したがって、* nixを使用している場合は、ファイル「/ tmp/socket_name」を削除する必要があります。

于 2013-03-26T11:37:00.260 に答える