1

我试图让 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()));
}

由于每次获得新连接时,从 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<-->QLocalSocket IPC 机制,而不是尝试处理 1:N。

提前致谢。

4

0 回答 0