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 メカニズムを提供することです。
前もって感謝します。