具有多个客户端的QLocalServer - 正确处理

时间:2010-07-27 05:59:38

标签: qt client ipc qlocalsocket

我正在尝试让IPC在一台服务器之间工作,以接受来自Qt 4.6的多个客户端的请求。一切正常,除了底层命名管道没有被关闭,使得Qt发出最大句柄到达消息(62)。

由于我想接受多个客户端连接,我按如下方式处理QLocalServer类的newConnections:

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

由于每次获得新连接时,从QLocalServer :: nextPendingConnection()接收的QLocalSocket指针都会被覆盖,我通过SocketHandler类管理数据请求,这当然封装了一个QLocalSocket类:

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。

我应该使用多线程解决方案吗? (我认为这不会解决问题)。

我想的另一个解决方案是提供1:1 QLocalServer&lt; - &gt; QLocalSocket IPC机制,而不是尝试处理1:N。

提前致谢。

0 个答案:

没有答案
相关问题