Я пытаюсь заставить 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.
Заранее спасибо.