Russian Qt Forum

Qt => Общие вопросы => Тема начата: neversleep от Август 15, 2013, 14:32



Название: [РЕШЕНО]Linux (Ubuntu). Консольное приложение - грамотный выход
Отправлено: neversleep от Август 15, 2013, 14:32
Начну из далека :) Хочу обеспечить взаимодействие между двумя программами. Программа "сервер" - консольная, пишется на 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();
}


Название: Re: Linux (Ubuntu). Консольное приложение - грамотный выход
Отправлено: neversleep от Август 15, 2013, 15:11
Кажется придумал: название файлу-сокету давать с префиксом имени пользователя, и при запуске удалять его, тогда не должно возникнуть проблемы с не возможностью удалить сей паганый файл если нет необходимых прав доступа к нему. Костыль, не?


Название: Re: Linux (Ubuntu). Консольное приложение - грамотный выход
Отправлено: neversleep от Август 15, 2013, 16:17
Решил отказаться от QLocalServer в пользу QTcpServer::listen(QHostAddress::LocalHost).