具有多个客户端的QLocalServer—正确处理
我正在尝试使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&lt; - > QLocalSocket IPC机制,而不是试图处理1:N。
提前致谢。
没有找到相关结果
已邀请:
0 个回复