Russian Qt Forum
Ноябрь 25, 2024, 09:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Linux (Ubuntu). Консольное приложение - грамотный выход  (Прочитано 2443 раз)
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();
}
« Последнее редактирование: Август 15, 2013, 16:17 от neversleep » Записан
neversleep
Гость
« Ответ #1 : Август 15, 2013, 15:11 »

Кажется придумал: название файлу-сокету давать с префиксом имени пользователя, и при запуске удалять его, тогда не должно возникнуть проблемы с не возможностью удалить сей паганый файл если нет необходимых прав доступа к нему. Костыль, не?
Записан
neversleep
Гость
« Ответ #2 : Август 15, 2013, 16:17 »

Решил отказаться от QLocalServer в пользу QTcpServer::listen(QHostAddress::LocalHost).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.21 секунд. Запросов: 21.