1

Qt 4.6で複数のクライアントからのリクエストを受け入れるために、1つのサーバー間でIPCを機能させようとしています。基になる名前付きパイプが閉じられていないことを除いて、すべてが機能しており、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 ポインターが上書きされるため、もちろん QLocalSocket クラスをカプセル化する SocketHandler クラスを介してデータ要求を管理します。

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:N を処理しようとする代わりに、1:1 QLocalServer<-->QLocalSocket IPC メカニズムを提供することです。

前もって感謝します。

4

0 に答える 0