Начну из далека
Хочу обеспечить взаимодействие между двумя программами. Программа "сервер" - консольная, пишется на Qt 5.1 с использованием QLocalServer, и всё хорошо, только после закрытия программы простым нажатием на крестик окна терминала "local domain socket", который создаёт QLocalServer (файл в каталоге /tmp/), не удаляется, и при следующем запуске программы QLocalServer::listen() возвращает AddressInUseError - все как написано в описании этого метода:
Note: On Unix if the server crashes without closing listen will fail with AddressInUseError. To create a new server the file should be removed. On Windows two local servers can listen to the same pipe at the same time, but any connections will go to one of the server.
Вот в этом вся беда: программа просто завершается, и дело не доходит до закрытия сокета. Можно ли с этим как-то бороться?
Код немного кривоват, но в целом идея такая
C++ (Qt)
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QLocalServer server;
QEventLoop *loop = 0;
loop = new QEventLoop;
QObject::connect(&server, SIGNAL(newConnection()), loop, SLOT(quit()));
server.listen("lalala"))
qDebug() << server.serverError();
while (!stop) {
loop->exec();
qDebug() << "connected";
while (server.hasPendingConnections()) {
MySocket *socket = new MySocket;
socket->localSocket = server.nextPendingConnection();
QObject::connect(socket->localSocket, SIGNAL(readyRead()), socket, SLOT(readBytes()));
QObject::connect(socket->localSocket, SIGNAL(disconnected()), socket, SLOT(connectionClosed()));
socket->localSocket->write("123");
}
}
server.close(); // !!!
return a.exec();
}