QLocalServer с несколькими клиентами - правильная обработка - PullRequest
1 голос
/ 27 июля 2010

Я пытаюсь заставить IPC работать между одним сервером для приема запросов от нескольких клиентов с Qt 4.6.Все работает, за исключением того, что нижележащие именованные каналы не закрываются, что заставляет Qt выдавать сообщение о максимальном достигнутом дескрипторе (62).

Поскольку я хочу принять несколько клиентских подключений, я обрабатываю newConnections для класса QLocalServerследующим образом:

void ServerImpl::onNewConnection()
{
    QLocalSocket * plsocket = _server->nextPendingConnection();
    SocketHandler* skh = new SocketHandler(plsocket, this, this);
    connect(plsocket, SIGNAL(readyRead()), skh, SLOT(socketReadyRead()));
    connect(plsocket, SIGNAL(error(QLocalSocket::LocalSocketError)), skh,  
            SLOT(onError(QLocalSocket::LocalSocketError)));
    connect(plsocket, SIGNAL(disconnected()), skh, SLOT(disconnected()));
}

Поскольку каждый раз, когда я получаю новое соединение, указатель QLocalSocket, полученный от QLocalServer :: nextPendingConnection (), перезаписывается, я управляю запросами данных через класс SocketHandler, который, конечно, инкапсулирует QLocalSocketclass:

void SocketHandler::socketReadyRead()
{ 
 QDataStream in(_ps);
 in.setVersion(QDataStream::Qt_4_5);

 forever
 {
  if (_blocksize == 0)
  {
   if (_ps->bytesAvailable() < sizeof(blocksize_t))
    return;

   in >> _blocksize;
  }

  // We need more data?
  if (_ps->bytesAvailable() < _blocksize)
   return;

  _srv->ReadRequest(in);

  // CHECK: Discard remaining blocks
  _blocksize = 0; 
 }
}

Вот объявление класса:

class SocketHandler : public QObject
{
 Q_OBJECT

public:
 SocketHandler(QLocalSocket* ps, ServerImpl* srv, QObject* parent = 0) : 
 QObject(parent), _ps(ps), _blocksize(0), _srv(srv) { };

 virtual ~SocketHandler() {};

public slots:
 void socketReadyRead();
 void onError(QLocalSocket::LocalSocketError);
 void disconnected();

private:

 QLocalSocket*  _ps;
 blocksize_t   _blocksize;
 ServerImpl*  _srv;
};

Проблема, как указано выше, заключается в том, что я не могу отключиться от сервера по запросу клиента.Я безуспешно пытался использовать QLocalSocket :: close, QLocalSocket :: disconnectFromServer.

Стоит ли использовать многопоточное решение?(Я думаю, что это не решит проблему).

Другое решение, которое я думаю, состоит в том, чтобы предложить механизм IPC QLocalServer <-> QLocalSocket 1: 1 вместо попытки обработки 1: N.

Заранее спасибо.

...